template.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. class Template():
  2. is_global = (
  3. "доступно ли для хранения в глобальном "
  4. "сервисе/необходима синхронизация"
  5. )
  6. is_visible = (
  7. "доступно ли для планирования в цепочке "
  8. "с другими услугами в глобальном сервисе"
  9. )
  10. id_metaservice = (
  11. "уникальный идентификатор мета-сервиса, необходимый для "
  12. "синхронизации данных. Если при синхронизации возникает конфликт "
  13. "(несовместимость) с другим сервисом, предлагается или форсировать "
  14. "изменения везде (если возможно), либо is_global выставляется как false."
  15. )
  16. class Orders():
  17. description = (
  18. "Orders - таблица с заказами"
  19. )
  20. # DATA
  21. status = models.CharField(
  22. max_length=150,
  23. help_text="текущий статус заказа из возможных на платформе"
  24. )
  25. title = models.CharField(
  26. max_length=150,
  27. help_text="заголовок заказа",
  28. default='Заголовок'
  29. )
  30. note = models.CharField(
  31. max_length=150,
  32. help_text="задание к заказу",
  33. default='Записи'
  34. )
  35. time_created = models.DateTimeField(
  36. auto_now_add=True,
  37. help_text="время создания заказа"
  38. )
  39. time_placed = models.DateTimeField(
  40. help_text="время размещения заказа"
  41. )
  42. time_start = models.DateTimeField(
  43. null=True,
  44. help_text="время начала оказания услуги"
  45. )
  46. time_start_real = models.DateTimeField(
  47. null=True,
  48. help_text=""
  49. )
  50. time_start_predicted = models.DateTimeField(
  51. null=True,
  52. help_text=""
  53. )
  54. time_finish_real = models.DateTimeField(
  55. null=True,
  56. help_text="фактическое время окончания (точное установленное время)"
  57. )
  58. time_finish_predicted = models.DateTimeField(
  59. help_text="предварительное/расчетное время до окончания оказания услуги"
  60. )
  61. real_price = models.FloatField(
  62. help_text="цена с учетом тарифа поставщика услуг по факту оказания услуги"
  63. )
  64. predicted_price = models.FloatField(
  65. help_text="расчетная цена с учетом тарифа поставщика услуг"
  66. )
  67. # NOTE: Возможно в будующем можнос сделать символом
  68. asap = models.BooleanField(
  69. default=False,
  70. help_text="Срочный ли заказ"
  71. )
  72. # FK
  73. ticket = models.ForeignKey(
  74. Ticket,
  75. null=True,
  76. on_delete=models.DO_NOTHING
  77. )
  78. service = models.ForeignKey(
  79. Service,
  80. null=True,
  81. on_delete=models.DO_NOTHING,
  82. help_text="спецификатор услуги провайдера, нужен для установления цены (id_service - уникальный идентификатор шаблона услуги, необходим для установления цены и исполнителей."
  83. )
  84. service_type = models.ForeignKey(
  85. ServiceType,
  86. null=True,
  87. on_delete=models.DO_NOTHING,
  88. help_text="тип заказа по классификатору услу"
  89. )
  90. client = models.ForeignKey(
  91. Client,
  92. null=True,
  93. on_delete=models.DO_NOTHING,
  94. help_text="клиент/аккаунт, который оплачивает все оказанные услуги"
  95. )
  96. provider = models.ForeignKey(
  97. Provider,
  98. null=True,
  99. on_delete=models.DO_NOTHING,
  100. help_text="уникальный идентификатор поставщика услуги/аккаунта, который оказывает услугу. Если несколько провайдеров собираются мета-сервисом в цепочку, где на уровне связи с клиентом нельзя установить одно ответственное лицо, то указывается вспомогательный мета-провайдер сервиса, и это означает, что мета-сервис несет ответственность перед пользователем за сборку услуги воедино."
  101. )
  102. receiver = models.ForeignKey(
  103. get_user_model(),
  104. null=True,
  105. related_name="user_id",
  106. on_delete=models.DO_NOTHING,
  107. help_text="пользователь/аккаунт, который принимает оказываемые услуги"
  108. )
  109. company = models.ForeignKey(
  110. Company,
  111. on_delete=models.DO_NOTHING,
  112. null=True,
  113. help_text="Идентификатор компании, к которой относится документ, если таковая есть (может не быть)"
  114. )
  115. class Permissions(models.Model):
  116. description = (
  117. "Разрешения - (проверки/экзамены). "
  118. "По смыслу это что-то вроде “документа на право что-то делать” - на данном этапе это ограничено метасервисом/платформой, "
  119. "при этом он может быть полностью цифровым (выданным платформой/сервисом)."
  120. )
  121. # DATA
  122. permission_type = models.BigIntegerField(
  123. help_text="уникальный идентификатор определяющий наличие разрешения из множества в словаре - выданных пользователю/клиенту/аккаунту"
  124. )
  125. check_level = models.CharField(
  126. max_length=10,
  127. help_text="(check-level из классификатора платформы) - информация об уровне проверки. Проверка может быть проведена как платформой, так и мета-сервисом, так и партнером мета-сервиса, а может быть и никем (просто загружен). Указывается, так как достоверность проверки разная. Экзамен, проверенный только на низком уровне, не принимается во внимание как имеющийся до прохождения более высокоуровневой проверки."
  128. )
  129. status = models.CharField(
  130. max_length=150,
  131. help_text="статус обработки заявки в системе заявок"
  132. )
  133. check_date = models.DateTimeField(
  134. null=True,
  135. help_text="timestamp проверки"
  136. )
  137. expire_date = models.DateField(
  138. help_text="Срок окончания действия разрешения"
  139. )
  140. # FK
  141. ticket_status = models.ForeignKey(
  142. Ticket,
  143. on_delete=models.DO_NOTHING,
  144. null=True,
  145. help_text="id заявки, по которой происходит проверка статуса relationship. State меняется только в результате изменений в заявке."
  146. )
  147. user_id = models.ForeignKey(
  148. get_user_model(),
  149. related_name="user_id_perm",
  150. on_delete=models.DO_NOTHING,
  151. null=True,
  152. help_text="уникальный идентификатор пользователя/клиента/аккаунта, которым была пройдена проверка и получено разрешение"
  153. )
  154. checked_by = models.ForeignKey(
  155. get_user_model(),
  156. related_name="checked_by_perm",
  157. on_delete=models.DO_NOTHING,
  158. null=True,
  159. help_text="userid проверившего"
  160. )
  161. class Provider(models.Model):
  162. description = (
  163. "Provider – единица описания поставщика услуг/ответственного лица за определенный ресурс (например, машину). "
  164. "По сути - это надстройка к клиентскому аккаунту, иллюстрирующая, что данный пользователь может выступать не только в роли потребителя. "
  165. "То есть, по тому, какие “провайдеры” находятся по идентификатору пользователя - можно установить конкретный список услуг данного пользователя."
  166. )
  167. # DATA
  168. type = models.CharField(
  169. max_length=150,
  170. help_text="тип поставщика (партнер/ответственное лицо/поставщик услуг). Смысл такой - провайдер это статус пользователя, который, в зависимости от применения, может нести разный смысл и подразумевает под собой какой-то тип действия. Обычные исполнители - это провайдеры услуг (код 3). Ответственные за какое-то имущество, которые сдают его в аренду - это тоже провайдеры (код 2). Ответственные за набор услуг перед метасервисом (фактически - назначенные админы) - это провайдеры-партнеры (код 1)"
  171. )
  172. requirements = models.CharField(
  173. max_length=300,
  174. help_text="требования для того, чтобы можно было предоставлять услуги любые в этом метасервисе в целом (самые строгие)"
  175. )
  176. status = models.CharField(
  177. max_length=150,
  178. help_text="статус пользователя в системе относительно прохождения проверок (activity_status) (может быть active только в том случае, если ticket, влияющий на статус - закрыт."
  179. )
  180. location_type = models.CharField(
  181. max_length=300,
  182. help_text="статическая или динамическая локация оказания услуги. Если статическая, а исполнитель находится существенно за пределами локации - то тогда статус автоматом оффлайн для приема новых заявок."
  183. )
  184. default_location = models.CharField(
  185. max_length=300,
  186. help_text="локация по умолчанию для объекта."
  187. )
  188. # FK
  189. user_id = models.ForeignKey(
  190. get_user_model(),
  191. on_delete=models.DO_NOTHING,
  192. null=True,
  193. help_text="уникальный идентификатор конкретного пользователя системы (meta-user), который будет оказывать услугу. Один пользователь может быть провайдером нескольких услуг. Статус провайдера означает, что с данным пользователем может быть установлена связь, как с исполнителем."
  194. )
  195. company_id = models.ForeignKey(
  196. Company,
  197. on_delete=models.DO_NOTHING,
  198. null=True,
  199. help_text="уникальный идентификатор компании, от лица которой выступает провайдер. Смысл такой - ответственны могут быть только одушевленные лица, компании - не одушевленные. Все услуги предоставляются через компании-партнеры, самозанятые или ИП являются единицами таких компаний."
  200. )
  201. ticket_status = models.ForeignKey(
  202. Ticket,
  203. on_delete=models.DO_NOTHING,
  204. null=True,
  205. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  206. )
  207. service = models.ForeignKey(
  208. Service,
  209. on_delete=models.DO_NOTHING,
  210. null=True,
  211. help_text="id услуги, которую предостовляют"
  212. )
  213. class RatingNeg(models.Model):
  214. description = (
  215. "RatingNeg - это... FIXME: написать описание таблицы"
  216. )
  217. # DATA
  218. count = models.IntegerField(
  219. help_text="" # Написать описание поля
  220. )
  221. # FK
  222. user_who = models.ForeignKey(
  223. get_user_model(),
  224. related_name="rating_neg_user_who",
  225. on_delete=models.DO_NOTHING,
  226. help_text="уникальный идентификатор инициатора договорных отношений"
  227. )
  228. user_whom = models.ForeignKey(
  229. get_user_model(),
  230. related_name="rating_neg_user_whom",
  231. on_delete=models.DO_NOTHING,
  232. help_text=" уникальный идентификатор того с кем связываются"
  233. )
  234. servicetype = models.ForeignKey(
  235. ServiceType,
  236. on_delete=models.DO_NOTHING,
  237. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  238. )
  239. class RatingOk(models.Model):
  240. description = (
  241. "RatingOk - это... FIXME: написать описание таблицы"
  242. )
  243. # DATA
  244. count = models.IntegerField(
  245. help_text="" # Написать описание поля
  246. )
  247. # FK
  248. user_who = models.ForeignKey(
  249. get_user_model(),
  250. related_name="rating_ok_user_who",
  251. on_delete=models.DO_NOTHING,
  252. help_text="уникальный идентификатор инициатора договорных отношений"
  253. )
  254. user_whom = models.ForeignKey(
  255. get_user_model(),
  256. related_name="rating_ok_user_whom",
  257. on_delete=models.DO_NOTHING,
  258. help_text=" уникальный идентификатор того с кем связываются"
  259. )
  260. servicetype = models.ForeignKey(
  261. ServiceType,
  262. on_delete=models.DO_NOTHING,
  263. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  264. )
  265. class RatingPos(models.Model):
  266. description = (
  267. "RatingPos - это... FIXME: написать описание таблицы"
  268. )
  269. # DATA
  270. count = models.IntegerField(
  271. help_text="" # Написать описание поля
  272. )
  273. # FK
  274. user_who = models.ForeignKey(
  275. get_user_model(),
  276. related_name="rating_pos_user_who",
  277. on_delete=models.DO_NOTHING,
  278. help_text="уникальный идентификатор инициатора договорных отношений"
  279. )
  280. user_whom = models.ForeignKey(
  281. get_user_model(),
  282. related_name="rating_pos_user_whom",
  283. on_delete=models.DO_NOTHING,
  284. help_text=" уникальный идентификатор того с кем связываются"
  285. )
  286. servicetype = models.ForeignKey(
  287. ServiceType,
  288. on_delete=models.DO_NOTHING,
  289. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  290. )
  291. class Relationship(models.Model):
  292. description = (
  293. "Relationship - описание связей "
  294. "(желательных - как имеющиеся договорные отношения, "
  295. "и нежелательных - как пожелание любой из сторон)"
  296. )
  297. # DATA
  298. neg_type = models.IntegerField(
  299. help_text="тип договорных отношений по его уникальному идентификатору"
  300. )
  301. requirements = models.CharField(
  302. max_length=150,
  303. help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным. Оно вставляется автоматом, в соответствии с профилем метасервиса. Далее, если кому-то из партнеров или пользователей надо строже - применяется более строгий вариант на данную связь."
  304. )
  305. status = models.CharField(
  306. max_length=150,
  307. help_text="(статус обработки заявки в системе заявок)"
  308. )
  309. # FK
  310. user_id_who = models.ForeignKey(
  311. get_user_model(),
  312. related_name="user_id_who",
  313. on_delete=models.DO_NOTHING,
  314. help_text="уникальный идентификатор инициатора договорных отношений"
  315. )
  316. user_id_whom = models.ForeignKey(
  317. get_user_model(),
  318. related_name="user_id_whom",
  319. on_delete=models.DO_NOTHING,
  320. help_text=" уникальный идентификатор того с кем связываются"
  321. )
  322. ticket_status = models.ForeignKey(
  323. Ticket,
  324. on_delete=models.DO_NOTHING,
  325. help_text="id заявки, по которой происходит проверка статуса relationship. State меняется только в результате изменений в заявке."
  326. )
  327. class Resource(models.Model):
  328. description = (
  329. "Resource/Список ресурсов – автомобили/дома/объекты сервиса"
  330. )
  331. # DATA
  332. resoure_type = models.CharField(
  333. max_length=10,
  334. help_text="определение типа ресурса по его уникальному идентификатору в соответствии с классификатором"
  335. )
  336. requirements = models.CharField(
  337. max_length=150,
  338. help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным"
  339. )
  340. status = models.CharField(
  341. max_length=150,
  342. help_text="статус ресурса в системе относительно прохождения проверок (activity_status) (может быть active только в том случае, если ticket, влияющий на статус - закрыт."
  343. )
  344. # FK
  345. ticket_status = models.ForeignKey(
  346. Ticket,
  347. on_delete=models.DO_NOTHING,
  348. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  349. )
  350. user_id = models.ForeignKey(
  351. get_user_model(),
  352. on_delete=models.DO_NOTHING,
  353. help_text="уникальный идентификатор ответственного (за состояние, доступность и так далее - то есть для договора) пользователя - идентификатор провайдера, по которому восстанавливается конкретный пользовательский аккаунт"
  354. )
  355. class Service(models.Model):
  356. description = (
  357. "service - спецификация услуги каждого конкретного поставщика "
  358. "(например, в рамках сервиса многие могут предоставлять услуги перевозки, "
  359. "но конкретный шаблон с конкретным тарифом относится к отдельному перевозчику)"
  360. )
  361. # DATA
  362. price_alg = models.CharField(
  363. max_length=100,
  364. help_text="шаблон алгоритма расчета цены для оказываемой услуги (по этой переменной определяется, какую функцию для расчета цены вызывать)"
  365. )
  366. price_km = models.DecimalField(
  367. max_digits=9,
  368. decimal_places=2,
  369. help_text="значение параметра стоимости 1км данного поставщика для данного шаблона услуги"
  370. )
  371. price_min = models.DecimalField(
  372. max_digits=9,
  373. decimal_places=2,
  374. help_text="значение параметра стоимости 1мин данного поставщика для данного шаблона услуги"
  375. )
  376. price_amount = models.DecimalField(
  377. max_digits=9,
  378. decimal_places=2,
  379. help_text="значение параметра стоимости 1 услуги данного поставщика для данного шаблона услуги"
  380. )
  381. company_comission = models.FloatField(
  382. help_text="Коммисия сервиса"
  383. )
  384. requirements = models.CharField(
  385. max_length=150,
  386. help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным. Оно вставляется автоматом, в соответствии с профилем метасервиса. Далее, если кому-то из партнеров или пользователей надо строже - применяется более строгий вариант на данную связь."
  387. )
  388. service_status = models.CharField(
  389. max_length=150,
  390. help_text="статус спецификации типа услуги, принимает значения Online, Offline, Preorder with Gap. Online/offline выставляются по проверке параметров и желанию пользователя (например, если пользователь переключает себя online, но по какой-то причине ему такую услугу оказывать запрещено - оно не переключится, то есть надо перед сменой значения этого поля всегда запускать проверку)"
  391. )
  392. status = models.CharField(
  393. max_length=150,
  394. help_text="статус обработки заявки в системе заявок. активность на основе системы заяво"
  395. )
  396. # FK
  397. ticket_status = models.ForeignKey(
  398. Ticket,
  399. on_delete=models.DO_NOTHING,
  400. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  401. )
  402. resource_id = models.ForeignKey(
  403. Resource,
  404. on_delete=models.DO_NOTHING,
  405. blank=True,
  406. null=True,
  407. help_text="ответственный за ресурс(не всегда). так как ресурсы сами услугу оказать не могут, а также один ресурс может быть представлен в виде разных услуг, то фактически с точки зрения смысла системы ресурс - это как неодушевленный пользователь. Без провайдера, который с его помощью оказывает услугу - никуда. Поле остается пустым, если сервис не предусматривает использование услуг. Стоит обратить внимание, что это не обязательно ответственный за ресурс. Например, за состояние автомобиля может быть ответственен пользователь (он и указывается в таблице со свойствами ресурса), а услугу доступа или перевозки может оказывать иное лицо."
  408. )
  409. servicetype_id = models.ForeignKey(
  410. ServiceType,
  411. on_delete=models.DO_NOTHING,
  412. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  413. )
  414. class ServiceType(models.Model):
  415. description = (
  416. "Перечень типов услуг"
  417. )
  418. # DATA
  419. codename = models.CharField(
  420. max_length=255,
  421. help_text="латинское наименование услуги в системе"
  422. )
  423. requirements = models.CharField(
  424. max_length=300,
  425. help_text="код требований на основе вспомогательных таблиц-справочников"
  426. )
  427. status = models.CharField(
  428. max_length=150,
  429. help_text="активность на основе системы заявок"
  430. )
  431. caption = models.CharField(
  432. max_length=255,
  433. help_text="наименование услуги для отображения пользователю"
  434. )
  435. description = models.TextField(
  436. blank=True,
  437. help_text="текстовое описание услуги"
  438. )
  439. link_agreement = models.CharField(
  440. max_length=400,
  441. help_text="ссылка на договор в вики об оказании услуги данного типа (аренда, перевозка и тп)"
  442. )
  443. price_type = models.CharField(
  444. max_length=150,
  445. help_text="ценообразование - код допустимых вариантов или код параметров, принимаемых во внимание и способ их учета (по сути хорошо закодировать формулу)"
  446. )
  447. company_comission = models.FloatField(
  448. help_text="Коммисия сервиса"
  449. )
  450. # FK
  451. ticket_status = models.ForeignKey(
  452. Ticket,
  453. on_delete=models.DO_NOTHING,
  454. null=True,
  455. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  456. )