181 lines
7.6 KiB
Python
181 lines
7.6 KiB
Python
|
||
import uuid
|
||
from django.db import models
|
||
|
||
from .managers import CallRequestManager
|
||
|
||
__all__ = [
|
||
'CallMedicalService',
|
||
'CallMedicalSpeciality',
|
||
'CallLPU',
|
||
'CallRequest',
|
||
'RequestLog'
|
||
]
|
||
|
||
|
||
class CallMedicalService(models.Model):
|
||
|
||
medical_service = models.ForeignKey('medicine.MedicalService', db_constraint=False, on_delete=models.CASCADE,
|
||
verbose_name='Услуга (МИС)')
|
||
name = models.CharField(max_length=100, verbose_name='Произношение роботом')
|
||
|
||
class Meta:
|
||
verbose_name = 'Услуга'
|
||
verbose_name_plural = 'Услуги'
|
||
|
||
def __str__(self):
|
||
return f'{self.medical_service.name} ← {self.name}'
|
||
|
||
|
||
class CallMedicalSpeciality(models.Model):
|
||
|
||
class Type(models.TextChoices):
|
||
SPECIALITY = 'SPECIALITY', 'Специальность'
|
||
SERVICE = 'SERVICE', 'Услуга'
|
||
|
||
speciality = models.ForeignKey('medicine.MedicalSpeciality', db_constraint=False, on_delete=models.CASCADE,
|
||
verbose_name='Специальность (МИС)')
|
||
name = models.CharField(max_length=100, verbose_name='Произношение роботом')
|
||
|
||
class Meta:
|
||
verbose_name = 'Специальность'
|
||
verbose_name_plural = 'Специальности'
|
||
|
||
def __str__(self):
|
||
return f'{self.name}'
|
||
|
||
|
||
class CallLPU(models.Model):
|
||
|
||
lpu = models.ForeignKey('medicine.LPU', db_constraint=False, on_delete=models.CASCADE, verbose_name='ЛПУ')
|
||
name = models.CharField(max_length=100, verbose_name='Произношение роботом')
|
||
address = models.TextField(max_length=200, null=True, blank=True, verbose_name='Адрес для произношения роботом')
|
||
|
||
class Meta:
|
||
verbose_name = 'Филиал'
|
||
verbose_name_plural = 'Филиалы'
|
||
|
||
def __str__(self):
|
||
return self.lpu.full_name
|
||
|
||
|
||
class CallRequest(models.Model):
|
||
|
||
class Status(models.TextChoices):
|
||
PENDING = 'PENDING', 'Обзвон еще не состоялся'
|
||
APPROVED = 'APPROVED', 'Прием подтвержден'
|
||
CANCELED = 'CANCELED', 'Прием отменен'
|
||
CALLBACK = 'CALLBACK', 'Перезвонить'
|
||
WITHOUT_ANSWER = 'WITHOUT_ANSWER', 'Не дозвонились'
|
||
TRANSFER = 'TRANSFER', 'Просьба перенести запись'
|
||
OTHER = 'OTHER', 'Другая ошибка'
|
||
|
||
STATUS_COLOR = {
|
||
Status.PENDING: '#2D72D2',
|
||
Status.APPROVED: '#238551',
|
||
Status.CANCELED: '#CD4246',
|
||
Status.CALLBACK: '#935610',
|
||
Status.WITHOUT_ANSWER: '#866103',
|
||
Status.TRANSFER: '#B83211',
|
||
Status.OTHER: '#5A701A'
|
||
}
|
||
|
||
class RequestStatus(models.TextChoices):
|
||
NOT_SENT = 'PENDING', 'Не отправлен'
|
||
SENT = 'APPROVED', 'Отправлен'
|
||
ERROR = 'ERROR', 'Ошибка'
|
||
SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE', 'Сервис недоступен'
|
||
COMPLETED = 'COMPLETED', 'Завершен'
|
||
|
||
REQUEST_STATUS_COLOR = {
|
||
RequestStatus.NOT_SENT: '#2D72D2',
|
||
RequestStatus.SENT: '#238551',
|
||
RequestStatus.ERROR: '#CD4246',
|
||
RequestStatus.SERVICE_UNAVAILABLE: '#7961DB',
|
||
RequestStatus.COMPLETED: '#147EB3',
|
||
}
|
||
|
||
uid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
|
||
status = models.CharField(max_length=20, choices=Status.choices, default=Status.PENDING,
|
||
verbose_name='Статус приема')
|
||
request_status = models.CharField(max_length=20, choices=RequestStatus.choices, default=RequestStatus.NOT_SENT,
|
||
verbose_name='Статус запроса')
|
||
date = models.DateField(verbose_name='Дата')
|
||
booking_id = models.PositiveIntegerField(unique=True, null=True, verbose_name='ID записи на прием')
|
||
booking_date = models.DateTimeField(null=True, verbose_name='Дата и время записи на прием')
|
||
patient_id = models.IntegerField(verbose_name='ID пациента')
|
||
patient_first_name = models.CharField(max_length=200, verbose_name='Имя')
|
||
patient_last_name = models.CharField(max_length=200, verbose_name='Фамилия')
|
||
patient_middle_name = models.CharField(max_length=200, null=True, blank=True, verbose_name='Отчество')
|
||
patient_phone = models.CharField(max_length=100, verbose_name='Номер телефона')
|
||
doctor_name = models.CharField(max_length=100, null=True, verbose_name='Врач')
|
||
doctor_speciality = models.CharField(max_length=200, null=True, verbose_name='Специальность врача')
|
||
service_name = models.CharField(max_length=200, null=True, blank=True, verbose_name='Услуга')
|
||
organization = models.CharField(max_length=200, null=True, blank=True, verbose_name='Организация')
|
||
address = models.CharField(max_length=200, null=True, blank=True, verbose_name='Адрес')
|
||
data = models.JSONField(default=dict, blank=True, verbose_name='Данные')
|
||
is_active = models.BooleanField(default=True, verbose_name='Активность')
|
||
|
||
call_id = models.CharField(max_length=100, null=True, editable=False, verbose_name='ID')
|
||
call_data = models.JSONField(default=dict, blank=True, editable=False)
|
||
call_text_log = models.TextField(null=True, blank=True, editable=False, verbose_name='Лог')
|
||
call_result = models.CharField(max_length=100, null=True, editable=False, blank=True, verbose_name='Результат')
|
||
request_time = models.DateTimeField(null=True, editable=False)
|
||
response_status_code = models.IntegerField(null=True, editable=False)
|
||
response_message = models.TextField(null=True, editable=False)
|
||
|
||
class Meta:
|
||
verbose_name = 'Запрос на звонок'
|
||
verbose_name_plural = 'Запросы на звонки'
|
||
|
||
objects = CallRequestManager()
|
||
|
||
def __str__(self):
|
||
return f"{self.date.strftime('%d.%m.%Y')} / {self.patient_last_name}"
|
||
|
||
def get_status_color(self):
|
||
return self.STATUS_COLOR.get(self.status)
|
||
|
||
def get_request_status_color(self):
|
||
return self.REQUEST_STATUS_COLOR.get(self.request_status)
|
||
|
||
def reset_request(self):
|
||
self.call_id = None
|
||
self.call_data = dict()
|
||
self.request_status = CallRequest.RequestStatus.NOT_SENT
|
||
self.status = CallRequest.Status.PENDING
|
||
self.request_time = None
|
||
self.response_status_code = None
|
||
self.response_message = None
|
||
self.save(update_fields=(
|
||
'request_status',
|
||
'request_time',
|
||
'response_status_code',
|
||
'response_message',
|
||
))
|
||
|
||
|
||
class RequestLog(models.Model):
|
||
|
||
request_url = models.CharField(max_length=500, verbose_name='Адрес запроса')
|
||
request_body = models.TextField(null=True, blank=True, verbose_name='Запрос')
|
||
request_method = models.CharField(max_length=100, null=True, verbose_name='Тип запроса')
|
||
|
||
response_body = models.TextField(null=True, blank=True, verbose_name='Ответ')
|
||
response_http_code = models.CharField(max_length=4, null=True, verbose_name='HTTP статус ответа')
|
||
|
||
created = models.DateTimeField(auto_now_add=True, editable=False, db_index=True, verbose_name='Дата запроса')
|
||
|
||
class Meta:
|
||
verbose_name = 'Запрос'
|
||
verbose_name_plural = 'История запросов'
|
||
ordering = ('-created',)
|
||
|
||
def __str__(self):
|
||
return self.request_url
|
||
|
||
def response_hook(self, r, *args, **kwargs):
|
||
self.response_http_code = r.status_code
|
||
self.response_body = r.text
|
||
self.save()
|