Fully implement Kavenegar SMS support

Core changes:
- ISmsService: add SendBulkAsync (batches of 200) + GetAccountInfoAsync
- KavenegarSmsService: POST requests, sender number config, bulk send
  via comma-separated receptors, account balance, full error code mapping
  (HTTP 400-432), enabled-flag check before any send
- SmsMarketingService: replaced per-recipient loop with SendBulkAsync
- SmsController: new GET /sms/balance endpoint returns Kavenegar credit
- SmsDtos: SmsBalanceDto
- IntegrationDtos + PlatformIntegrationService: SenderNumber field
- appsettings.json + docker-compose: Kavenegar__SenderNumber = 90005671

Dashboard:
- sms-screen: char counter, SMS parts indicator (Persian 70/67 chars,
  Latin 160/153), account balance card, sender line display, result banner

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-05-29 02:38:06 +03:30
parent b78f2affb6
commit 42d7667735
14 changed files with 446 additions and 110 deletions
+10 -1
View File
@@ -378,7 +378,16 @@
"usage": "مصرف این ماه",
"unlimited": "نامحدود",
"sent": "ارسال شد",
"failed": "ناموفق"
"failed": "ناموفق",
"charCount": "{count} حرف",
"smsPartsHint": "{parts} پیامک",
"balance": "اعتبار حساب",
"balanceAmount": "{amount} ریال",
"balanceNotConfigured": "Kavenegar پیکربندی نشده",
"sender": "خط فرستنده",
"recipientsCount": "{count} مخاطب",
"sendConfirm": "ارسال به {count} نفر؟",
"sending": "در حال ارسال..."
},
"reports": {
"title": "گزارش‌ها و تحلیل",