voip announcement

This commit is contained in:
javad committed 2026-09-28 19:37:19 +03:30
1 parent 38b1cf06df
commit c7993aae44
18 files changed
+679 -151

No files matched your search

+46
View File
@@ -70,3 +70,49 @@ class NotificationJob(models.Model):
)
class Meta:
indexes=[models.Index(fields=["status","next_attempt_at"],name="notif_due_idx"),models.Index(fields=["ticket","channel","status"],name="notif_ticket_chan_idx")]
class AnnouncementJob(models.Model):
"""One durable call reminder for each public message written by staff."""
class Status(models.TextChoices):
PENDING = "PENDING", "در صف"
PROCESSING = "PROCESSING", "در حال تماس"
SENT = "SENT", "ارسال‌شده"
FAILED = "FAILED", "ناموفق"
CANCELLED = "CANCELLED", "لغوشده"
message = models.OneToOneField("messaging.Message", on_delete=models.CASCADE, related_name="announcement_job")
status = models.CharField(max_length=15, choices=Status.choices, default=Status.PENDING, db_index=True)
attempts = models.PositiveSmallIntegerField(default=0)
next_attempt_at = models.DateTimeField(db_index=True)
idempotency_key = models.CharField(max_length=100, unique=True)
last_error = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
sent_at = models.DateTimeField(null=True, blank=True)
class Meta:
indexes = [models.Index(fields=["status", "next_attempt_at"], name="announce_due_idx")]
@property
def status_label(self):
if self.status == self.Status.SENT:
return "درخواست تماس پذیرفته شد"
if self.status == self.Status.PENDING and self.attempts:
return "در انتظار تلاش مجدد"
return self.get_status_display()
@property
def detail_label(self):
return {
"customer_read": "مشتری پیام را مشاهده کرد.",
"customer_replied": "مشتری پس از پیام پاسخ داد.",
"message_unavailable": "پیام برای اطلاع‌رسانی در دسترس نیست.",
"customer_mobile_unavailable": "شماره همراه مشتری در دسترس نیست.",
"announcement_not_configured": "تنظیمات تماس اطلاع‌رسانی کامل نیست.",
"service_timeout": "سرویس تماس در مهلت مقرر پاسخ نداد.",
"service_unreachable": "ارتباط با سرویس تماس برقرار نشد.",
"service_http_error": "سرویس تماس درخواست را با خطا پاسخ داد.",
"service_rejected": "سرویس تماس درخواست را نپذیرفت.",
"invalid_service_response": "پاسخ سرویس تماس معتبر نبود.",
"unexpected_error": "خطای غیرمنتظره در پردازش درخواست تماس رخ داد.",
}.get(self.last_error, "وضعیت درخواست تماس نیاز به بررسی دارد." if self.last_error else "")