|
@@ -0,0 +1,131 @@
|
|
|
+import os
|
|
|
+
|
|
|
+from django.contrib.auth import get_user_model
|
|
|
+from django.db import models
|
|
|
+
|
|
|
+from dbsynce.models.company import Company
|
|
|
+from tickets.models import Ticket
|
|
|
+
|
|
|
+
|
|
|
+class Documents(models.Model):
|
|
|
+ """
|
|
|
+ Documents - это одна таблица со всеми документами.
|
|
|
+ Вообще в концепции предполагалось, что таких таблиц должно быть много под каждый тип для удобства поиска.
|
|
|
+ То есть отдельно таблица с паспортами, отдельно с правами, отдельно с какими-нибудь разрешениями и так далее.
|
|
|
+ Что пока непонятно - документов может быть много разных.
|
|
|
+ """
|
|
|
+
|
|
|
+ DOC_TYPES = [
|
|
|
+ ("01", "Паспорт"),
|
|
|
+ ("02", "ИНН"),
|
|
|
+ ("03", "СНИЛС"),
|
|
|
+ ("04", "Cвидетельство о регистрации компании"),
|
|
|
+ ("05", "Cистема налогообложения"),
|
|
|
+ ("06", "Доверенность / Приказ"),
|
|
|
+ ("07", "Права / Лицензия"),
|
|
|
+ ("08", "Документ, подтверждающий собственность"),
|
|
|
+ ("09", "Документ об образовании"),
|
|
|
+ ("10", "Медицинская книжка"),
|
|
|
+ ("11", "Cправка об отсутствии судимости"),
|
|
|
+ ("12", "Договор (в том числе о трудоустройстве)"),
|
|
|
+ ("13", "Фотография"),
|
|
|
+ ("99", "Иное"),
|
|
|
+ ]
|
|
|
+
|
|
|
+ DOC_TYPES_DICT = dict(DOC_TYPES)
|
|
|
+
|
|
|
+ id = models.IntegerField(
|
|
|
+ primary_key=True
|
|
|
+ )
|
|
|
+
|
|
|
+ # ID METASERVICE
|
|
|
+ # FIXME: id_metaservice должно принимать текущий идентификатор метасервиса, на котором происходит создание записи
|
|
|
+ id_metaservice = models.PositiveIntegerField(
|
|
|
+ default=1,
|
|
|
+ help_text="уникальный идентификатор мета-сервиса, необходимый для синхронизации данных. Если при синхронизации возникает конфликт (несовместимость) с другим сервисом, предлагается или форсировать изменения везде (если возможно), либо is_global выставляется как false."
|
|
|
+ )
|
|
|
+
|
|
|
+ # DATA
|
|
|
+ check_date = models.DateTimeField(
|
|
|
+ auto_now_add=True,
|
|
|
+ help_text="timestamp проверки"
|
|
|
+ )
|
|
|
+ check_level = models.IntegerField(
|
|
|
+ null=True,
|
|
|
+ blank=True,
|
|
|
+ help_text="информация об уровне проверки. Документ может быть проверен как платформой, так и мета-сервисом, так и партнером мета-сервиса, а может быть и никем (просто загружен). Указывается, так как достоверность проверки разная. Документ, проверенный только на низком уровне, не принимается во внимание как имеющийся до прохождения более высокоуровневой проверки. Информацию об уровнях проверки можно посмотреть по словарю Requirements. В данной таблице хранится информация о наиболее высоком уровне проверки."
|
|
|
+ )
|
|
|
+ expire_date = models.DateField(
|
|
|
+ null=True,
|
|
|
+ blank=True,
|
|
|
+ help_text="срок окончания действия документа."
|
|
|
+ )
|
|
|
+ # FIXME: status должен иметь другое значение поумолчанию
|
|
|
+ status = models.CharField(
|
|
|
+ max_length=150,
|
|
|
+ default="deactivated",
|
|
|
+ help_text="активность на основе системы заявок"
|
|
|
+ )
|
|
|
+ data_path = models.CharField(
|
|
|
+ max_length=1024,
|
|
|
+ help_text="Путь к документу"
|
|
|
+ )
|
|
|
+ doc_type = models.CharField(
|
|
|
+ max_length=2,
|
|
|
+ choices=DOC_TYPES,
|
|
|
+ help_text="тип документа (паспорт/паспорт 1 страница и т д) в соответствии с классификатором типов документов (см описание в Requirements)"
|
|
|
+ )
|
|
|
+
|
|
|
+ # OTHER
|
|
|
+ is_global = models.CharField(
|
|
|
+ max_length=1,
|
|
|
+ default="f",
|
|
|
+ help_text="доступны ли документы для хранения в глобальном сервисе/нужна синхронизация"
|
|
|
+ )
|
|
|
+ is_visible = models.CharField(
|
|
|
+ max_length=1,
|
|
|
+ default="f",
|
|
|
+ help_text="доступна ли информация о наличии документов для планирования в цепочке с другими услугами в глобальном сервисе"
|
|
|
+ )
|
|
|
+
|
|
|
+ # FK
|
|
|
+ company_id = models.ForeignKey(
|
|
|
+ Company,
|
|
|
+ on_delete=models.DO_NOTHING,
|
|
|
+ null=True,
|
|
|
+ help_text="идентификатор компании, к которой относится документ, если таковая есть (может не быть)"
|
|
|
+ )
|
|
|
+ user_id = models.ForeignKey(
|
|
|
+ get_user_model(),
|
|
|
+ related_name="user_id_doc",
|
|
|
+ on_delete=models.DO_NOTHING,
|
|
|
+ help_text="уникальный идентификатор пользователя (конкретного клиентского аккаунта) являющегося владельцем данного документа"
|
|
|
+ )
|
|
|
+ ticket_status = models.ForeignKey(
|
|
|
+ Ticket,
|
|
|
+ null=True,
|
|
|
+ blank=True,
|
|
|
+ on_delete=models.SET_NULL,
|
|
|
+ help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
|
|
|
+ )
|
|
|
+ checked_by = models.ForeignKey(
|
|
|
+ get_user_model(),
|
|
|
+ null=True,
|
|
|
+ blank=True,
|
|
|
+ related_name="checked_by_doc",
|
|
|
+ on_delete=models.DO_NOTHING,
|
|
|
+ help_text="userid проверившего"
|
|
|
+ )
|
|
|
+
|
|
|
+ class Meta:
|
|
|
+ db_table = "documents"
|
|
|
+ verbose_name = "Документ"
|
|
|
+ verbose_name_plural = "Документы"
|
|
|
+
|
|
|
+
|
|
|
+class DocumentFile(models.Model):
|
|
|
+ document = models.ForeignKey(Documents, related_name='files', on_delete=models.CASCADE)
|
|
|
+ file = models.FileField(upload_to=f'uploads/partners_docs/')
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return os.path.basename(self.file.name)
|