class Template(): is_global = ( "доступно ли для хранения в глобальном " "сервисе/необходима синхронизация" ) is_visible = ( "доступно ли для планирования в цепочке " "с другими услугами в глобальном сервисе" ) id_metaservice = ( "уникальный идентификатор мета-сервиса, необходимый для " "синхронизации данных. Если при синхронизации возникает конфликт " "(несовместимость) с другим сервисом, предлагается или форсировать " "изменения везде (если возможно), либо is_global выставляется как false." ) class Orders(): description = ( "Orders - таблица с заказами" ) # DATA status = models.CharField( max_length=150, help_text="текущий статус заказа из возможных на платформе" ) title = models.CharField( max_length=150, help_text="заголовок заказа", default='Заголовок' ) note = models.CharField( max_length=150, help_text="задание к заказу", default='Записи' ) time_created = models.DateTimeField( auto_now_add=True, help_text="время создания заказа" ) time_placed = models.DateTimeField( help_text="время размещения заказа" ) time_start = models.DateTimeField( null=True, help_text="время начала оказания услуги" ) time_start_real = models.DateTimeField( null=True, help_text="" ) time_start_predicted = models.DateTimeField( null=True, help_text="" ) time_finish_real = models.DateTimeField( null=True, help_text="фактическое время окончания (точное установленное время)" ) time_finish_predicted = models.DateTimeField( help_text="предварительное/расчетное время до окончания оказания услуги" ) real_price = models.FloatField( help_text="цена с учетом тарифа поставщика услуг по факту оказания услуги" ) predicted_price = models.FloatField( help_text="расчетная цена с учетом тарифа поставщика услуг" ) # NOTE: Возможно в будующем можнос сделать символом asap = models.BooleanField( default=False, help_text="Срочный ли заказ" ) # FK ticket = models.ForeignKey( Ticket, null=True, on_delete=models.DO_NOTHING ) service = models.ForeignKey( Service, null=True, on_delete=models.DO_NOTHING, help_text="спецификатор услуги провайдера, нужен для установления цены (id_service - уникальный идентификатор шаблона услуги, необходим для установления цены и исполнителей." ) service_type = models.ForeignKey( ServiceType, null=True, on_delete=models.DO_NOTHING, help_text="тип заказа по классификатору услу" ) client = models.ForeignKey( Client, null=True, on_delete=models.DO_NOTHING, help_text="клиент/аккаунт, который оплачивает все оказанные услуги" ) provider = models.ForeignKey( Provider, null=True, on_delete=models.DO_NOTHING, help_text="уникальный идентификатор поставщика услуги/аккаунта, который оказывает услугу. Если несколько провайдеров собираются мета-сервисом в цепочку, где на уровне связи с клиентом нельзя установить одно ответственное лицо, то указывается вспомогательный мета-провайдер сервиса, и это означает, что мета-сервис несет ответственность перед пользователем за сборку услуги воедино." ) receiver = models.ForeignKey( get_user_model(), null=True, related_name="user_id", on_delete=models.DO_NOTHING, help_text="пользователь/аккаунт, который принимает оказываемые услуги" ) company = models.ForeignKey( Company, on_delete=models.DO_NOTHING, null=True, help_text="Идентификатор компании, к которой относится документ, если таковая есть (может не быть)" ) class Permissions(models.Model): description = ( "Разрешения - (проверки/экзамены). " "По смыслу это что-то вроде “документа на право что-то делать” - на данном этапе это ограничено метасервисом/платформой, " "при этом он может быть полностью цифровым (выданным платформой/сервисом)." ) # DATA permission_type = models.BigIntegerField( help_text="уникальный идентификатор определяющий наличие разрешения из множества в словаре - выданных пользователю/клиенту/аккаунту" ) check_level = models.CharField( max_length=10, help_text="(check-level из классификатора платформы) - информация об уровне проверки. Проверка может быть проведена как платформой, так и мета-сервисом, так и партнером мета-сервиса, а может быть и никем (просто загружен). Указывается, так как достоверность проверки разная. Экзамен, проверенный только на низком уровне, не принимается во внимание как имеющийся до прохождения более высокоуровневой проверки." ) status = models.CharField( max_length=150, help_text="статус обработки заявки в системе заявок" ) check_date = models.DateTimeField( null=True, help_text="timestamp проверки" ) expire_date = models.DateField( help_text="Срок окончания действия разрешения" ) # FK ticket_status = models.ForeignKey( Ticket, on_delete=models.DO_NOTHING, null=True, help_text="id заявки, по которой происходит проверка статуса relationship. State меняется только в результате изменений в заявке." ) user_id = models.ForeignKey( get_user_model(), related_name="user_id_perm", on_delete=models.DO_NOTHING, null=True, help_text="уникальный идентификатор пользователя/клиента/аккаунта, которым была пройдена проверка и получено разрешение" ) checked_by = models.ForeignKey( get_user_model(), related_name="checked_by_perm", on_delete=models.DO_NOTHING, null=True, help_text="userid проверившего" ) class Provider(models.Model): description = ( "Provider – единица описания поставщика услуг/ответственного лица за определенный ресурс (например, машину). " "По сути - это надстройка к клиентскому аккаунту, иллюстрирующая, что данный пользователь может выступать не только в роли потребителя. " "То есть, по тому, какие “провайдеры” находятся по идентификатору пользователя - можно установить конкретный список услуг данного пользователя." ) # DATA type = models.CharField( max_length=150, help_text="тип поставщика (партнер/ответственное лицо/поставщик услуг). Смысл такой - провайдер это статус пользователя, который, в зависимости от применения, может нести разный смысл и подразумевает под собой какой-то тип действия. Обычные исполнители - это провайдеры услуг (код 3). Ответственные за какое-то имущество, которые сдают его в аренду - это тоже провайдеры (код 2). Ответственные за набор услуг перед метасервисом (фактически - назначенные админы) - это провайдеры-партнеры (код 1)" ) requirements = models.CharField( max_length=300, help_text="требования для того, чтобы можно было предоставлять услуги любые в этом метасервисе в целом (самые строгие)" ) status = models.CharField( max_length=150, help_text="статус пользователя в системе относительно прохождения проверок (activity_status) (может быть active только в том случае, если ticket, влияющий на статус - закрыт." ) location_type = models.CharField( max_length=300, help_text="статическая или динамическая локация оказания услуги. Если статическая, а исполнитель находится существенно за пределами локации - то тогда статус автоматом оффлайн для приема новых заявок." ) default_location = models.CharField( max_length=300, help_text="локация по умолчанию для объекта." ) # FK user_id = models.ForeignKey( get_user_model(), on_delete=models.DO_NOTHING, null=True, help_text="уникальный идентификатор конкретного пользователя системы (meta-user), который будет оказывать услугу. Один пользователь может быть провайдером нескольких услуг. Статус провайдера означает, что с данным пользователем может быть установлена связь, как с исполнителем." ) company_id = models.ForeignKey( Company, on_delete=models.DO_NOTHING, null=True, help_text="уникальный идентификатор компании, от лица которой выступает провайдер. Смысл такой - ответственны могут быть только одушевленные лица, компании - не одушевленные. Все услуги предоставляются через компании-партнеры, самозанятые или ИП являются единицами таких компаний." ) ticket_status = models.ForeignKey( Ticket, on_delete=models.DO_NOTHING, null=True, help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю." ) service = models.ForeignKey( Service, on_delete=models.DO_NOTHING, null=True, help_text="id услуги, которую предостовляют" ) class RatingNeg(models.Model): description = ( "RatingNeg - это... FIXME: написать описание таблицы" ) # DATA count = models.IntegerField( help_text="" # Написать описание поля ) # FK user_who = models.ForeignKey( get_user_model(), related_name="rating_neg_user_who", on_delete=models.DO_NOTHING, help_text="уникальный идентификатор инициатора договорных отношений" ) user_whom = models.ForeignKey( get_user_model(), related_name="rating_neg_user_whom", on_delete=models.DO_NOTHING, help_text=" уникальный идентификатор того с кем связываются" ) servicetype = models.ForeignKey( ServiceType, on_delete=models.DO_NOTHING, help_text="тип оказываемой услуги по классификатору услуг сервиса" ) class RatingOk(models.Model): description = ( "RatingOk - это... FIXME: написать описание таблицы" ) # DATA count = models.IntegerField( help_text="" # Написать описание поля ) # FK user_who = models.ForeignKey( get_user_model(), related_name="rating_ok_user_who", on_delete=models.DO_NOTHING, help_text="уникальный идентификатор инициатора договорных отношений" ) user_whom = models.ForeignKey( get_user_model(), related_name="rating_ok_user_whom", on_delete=models.DO_NOTHING, help_text=" уникальный идентификатор того с кем связываются" ) servicetype = models.ForeignKey( ServiceType, on_delete=models.DO_NOTHING, help_text="тип оказываемой услуги по классификатору услуг сервиса" ) class RatingPos(models.Model): description = ( "RatingPos - это... FIXME: написать описание таблицы" ) # DATA count = models.IntegerField( help_text="" # Написать описание поля ) # FK user_who = models.ForeignKey( get_user_model(), related_name="rating_pos_user_who", on_delete=models.DO_NOTHING, help_text="уникальный идентификатор инициатора договорных отношений" ) user_whom = models.ForeignKey( get_user_model(), related_name="rating_pos_user_whom", on_delete=models.DO_NOTHING, help_text=" уникальный идентификатор того с кем связываются" ) servicetype = models.ForeignKey( ServiceType, on_delete=models.DO_NOTHING, help_text="тип оказываемой услуги по классификатору услуг сервиса" ) class Relationship(models.Model): description = ( "Relationship - описание связей " "(желательных - как имеющиеся договорные отношения, " "и нежелательных - как пожелание любой из сторон)" ) # DATA neg_type = models.IntegerField( help_text="тип договорных отношений по его уникальному идентификатору" ) requirements = models.CharField( max_length=150, help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным. Оно вставляется автоматом, в соответствии с профилем метасервиса. Далее, если кому-то из партнеров или пользователей надо строже - применяется более строгий вариант на данную связь." ) status = models.CharField( max_length=150, help_text="(статус обработки заявки в системе заявок)" ) # FK user_id_who = models.ForeignKey( get_user_model(), related_name="user_id_who", on_delete=models.DO_NOTHING, help_text="уникальный идентификатор инициатора договорных отношений" ) user_id_whom = models.ForeignKey( get_user_model(), related_name="user_id_whom", on_delete=models.DO_NOTHING, help_text=" уникальный идентификатор того с кем связываются" ) ticket_status = models.ForeignKey( Ticket, on_delete=models.DO_NOTHING, help_text="id заявки, по которой происходит проверка статуса relationship. State меняется только в результате изменений в заявке." ) class Resource(models.Model): description = ( "Resource/Список ресурсов – автомобили/дома/объекты сервиса" ) # DATA resoure_type = models.CharField( max_length=10, help_text="определение типа ресурса по его уникальному идентификатору в соответствии с классификатором" ) requirements = models.CharField( max_length=150, help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным" ) status = models.CharField( max_length=150, help_text="статус ресурса в системе относительно прохождения проверок (activity_status) (может быть active только в том случае, если ticket, влияющий на статус - закрыт." ) # FK ticket_status = models.ForeignKey( Ticket, on_delete=models.DO_NOTHING, help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю." ) user_id = models.ForeignKey( get_user_model(), on_delete=models.DO_NOTHING, help_text="уникальный идентификатор ответственного (за состояние, доступность и так далее - то есть для договора) пользователя - идентификатор провайдера, по которому восстанавливается конкретный пользовательский аккаунт" ) class Service(models.Model): description = ( "service - спецификация услуги каждого конкретного поставщика " "(например, в рамках сервиса многие могут предоставлять услуги перевозки, " "но конкретный шаблон с конкретным тарифом относится к отдельному перевозчику)" ) # DATA price_alg = models.CharField( max_length=100, help_text="шаблон алгоритма расчета цены для оказываемой услуги (по этой переменной определяется, какую функцию для расчета цены вызывать)" ) price_km = models.DecimalField( max_digits=9, decimal_places=2, help_text="значение параметра стоимости 1км данного поставщика для данного шаблона услуги" ) price_min = models.DecimalField( max_digits=9, decimal_places=2, help_text="значение параметра стоимости 1мин данного поставщика для данного шаблона услуги" ) price_amount = models.DecimalField( max_digits=9, decimal_places=2, help_text="значение параметра стоимости 1 услуги данного поставщика для данного шаблона услуги" ) company_comission = models.FloatField( help_text="Коммисия сервиса" ) requirements = models.CharField( max_length=150, help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным. Оно вставляется автоматом, в соответствии с профилем метасервиса. Далее, если кому-то из партнеров или пользователей надо строже - применяется более строгий вариант на данную связь." ) service_status = models.CharField( max_length=150, help_text="статус спецификации типа услуги, принимает значения Online, Offline, Preorder with Gap. Online/offline выставляются по проверке параметров и желанию пользователя (например, если пользователь переключает себя online, но по какой-то причине ему такую услугу оказывать запрещено - оно не переключится, то есть надо перед сменой значения этого поля всегда запускать проверку)" ) status = models.CharField( max_length=150, help_text="статус обработки заявки в системе заявок. активность на основе системы заяво" ) # FK ticket_status = models.ForeignKey( Ticket, on_delete=models.DO_NOTHING, help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю." ) resource_id = models.ForeignKey( Resource, on_delete=models.DO_NOTHING, blank=True, null=True, help_text="ответственный за ресурс(не всегда). так как ресурсы сами услугу оказать не могут, а также один ресурс может быть представлен в виде разных услуг, то фактически с точки зрения смысла системы ресурс - это как неодушевленный пользователь. Без провайдера, который с его помощью оказывает услугу - никуда. Поле остается пустым, если сервис не предусматривает использование услуг. Стоит обратить внимание, что это не обязательно ответственный за ресурс. Например, за состояние автомобиля может быть ответственен пользователь (он и указывается в таблице со свойствами ресурса), а услугу доступа или перевозки может оказывать иное лицо." ) servicetype_id = models.ForeignKey( ServiceType, on_delete=models.DO_NOTHING, help_text="тип оказываемой услуги по классификатору услуг сервиса" ) class ServiceType(models.Model): description = ( "Перечень типов услуг" ) # DATA codename = models.CharField( max_length=255, help_text="латинское наименование услуги в системе" ) requirements = models.CharField( max_length=300, help_text="код требований на основе вспомогательных таблиц-справочников" ) status = models.CharField( max_length=150, help_text="активность на основе системы заявок" ) caption = models.CharField( max_length=255, help_text="наименование услуги для отображения пользователю" ) description = models.TextField( blank=True, help_text="текстовое описание услуги" ) link_agreement = models.CharField( max_length=400, help_text="ссылка на договор в вики об оказании услуги данного типа (аренда, перевозка и тп)" ) price_type = models.CharField( max_length=150, help_text="ценообразование - код допустимых вариантов или код параметров, принимаемых во внимание и способ их учета (по сути хорошо закодировать формулу)" ) company_comission = models.FloatField( help_text="Коммисия сервиса" ) # FK ticket_status = models.ForeignKey( Ticket, on_delete=models.DO_NOTHING, null=True, help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю." )