template.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  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 Permissions(models.Model):
  17. description = (
  18. "Разрешения - (проверки/экзамены). "
  19. "По смыслу это что-то вроде “документа на право что-то делать” - на данном этапе это ограничено метасервисом/платформой, "
  20. "при этом он может быть полностью цифровым (выданным платформой/сервисом)."
  21. )
  22. # DATA
  23. permission_type = models.BigIntegerField(
  24. help_text="уникальный идентификатор определяющий наличие разрешения из множества в словаре - выданных пользователю/клиенту/аккаунту"
  25. )
  26. check_level = models.CharField(
  27. max_length=10,
  28. help_text="(check-level из классификатора платформы) - информация об уровне проверки. Проверка может быть проведена как платформой, так и мета-сервисом, так и партнером мета-сервиса, а может быть и никем (просто загружен). Указывается, так как достоверность проверки разная. Экзамен, проверенный только на низком уровне, не принимается во внимание как имеющийся до прохождения более высокоуровневой проверки."
  29. )
  30. status = models.CharField(
  31. max_length=150,
  32. help_text="статус обработки заявки в системе заявок"
  33. )
  34. check_date = models.DateTimeField(
  35. null=True,
  36. help_text="timestamp проверки"
  37. )
  38. expire_date = models.DateField(
  39. help_text="Срок окончания действия разрешения"
  40. )
  41. # FK
  42. ticket_status = models.ForeignKey(
  43. Ticket,
  44. on_delete=models.DO_NOTHING,
  45. null=True,
  46. help_text="id заявки, по которой происходит проверка статуса relationship. State меняется только в результате изменений в заявке."
  47. )
  48. user_id = models.ForeignKey(
  49. get_user_model(),
  50. related_name="user_id_perm",
  51. on_delete=models.DO_NOTHING,
  52. null=True,
  53. help_text="уникальный идентификатор пользователя/клиента/аккаунта, которым была пройдена проверка и получено разрешение"
  54. )
  55. checked_by = models.ForeignKey(
  56. get_user_model(),
  57. related_name="checked_by_perm",
  58. on_delete=models.DO_NOTHING,
  59. null=True,
  60. help_text="userid проверившего"
  61. )
  62. class Provider(models.Model):
  63. description = (
  64. "Provider – единица описания поставщика услуг/ответственного лица за определенный ресурс (например, машину). "
  65. "По сути - это надстройка к клиентскому аккаунту, иллюстрирующая, что данный пользователь может выступать не только в роли потребителя. "
  66. "То есть, по тому, какие “провайдеры” находятся по идентификатору пользователя - можно установить конкретный список услуг данного пользователя."
  67. )
  68. # DATA
  69. type = models.CharField(
  70. max_length=150,
  71. help_text="тип поставщика (партнер/ответственное лицо/поставщик услуг). Смысл такой - провайдер это статус пользователя, который, в зависимости от применения, может нести разный смысл и подразумевает под собой какой-то тип действия. Обычные исполнители - это провайдеры услуг (код 3). Ответственные за какое-то имущество, которые сдают его в аренду - это тоже провайдеры (код 2). Ответственные за набор услуг перед метасервисом (фактически - назначенные админы) - это провайдеры-партнеры (код 1)"
  72. )
  73. requirements = models.CharField(
  74. max_length=300,
  75. help_text="требования для того, чтобы можно было предоставлять услуги любые в этом метасервисе в целом (самые строгие)"
  76. )
  77. status = models.CharField(
  78. max_length=150,
  79. help_text="статус пользователя в системе относительно прохождения проверок (activity_status) (может быть active только в том случае, если ticket, влияющий на статус - закрыт."
  80. )
  81. location_type = models.CharField(
  82. max_length=300,
  83. help_text="статическая или динамическая локация оказания услуги. Если статическая, а исполнитель находится существенно за пределами локации - то тогда статус автоматом оффлайн для приема новых заявок."
  84. )
  85. default_location = models.CharField(
  86. max_length=300,
  87. help_text="локация по умолчанию для объекта."
  88. )
  89. # FK
  90. user_id = models.ForeignKey(
  91. get_user_model(),
  92. on_delete=models.DO_NOTHING,
  93. null=True,
  94. help_text="уникальный идентификатор конкретного пользователя системы (meta-user), который будет оказывать услугу. Один пользователь может быть провайдером нескольких услуг. Статус провайдера означает, что с данным пользователем может быть установлена связь, как с исполнителем."
  95. )
  96. company_id = models.ForeignKey(
  97. Company,
  98. on_delete=models.DO_NOTHING,
  99. null=True,
  100. help_text="уникальный идентификатор компании, от лица которой выступает провайдер. Смысл такой - ответственны могут быть только одушевленные лица, компании - не одушевленные. Все услуги предоставляются через компании-партнеры, самозанятые или ИП являются единицами таких компаний."
  101. )
  102. ticket_status = models.ForeignKey(
  103. Ticket,
  104. on_delete=models.DO_NOTHING,
  105. null=True,
  106. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  107. )
  108. service = models.ForeignKey(
  109. Service,
  110. on_delete=models.DO_NOTHING,
  111. null=True,
  112. help_text="id услуги, которую предостовляют"
  113. )
  114. class RatingNeg(models.Model):
  115. description = (
  116. "RatingNeg - это... FIXME: написать описание таблицы"
  117. )
  118. # DATA
  119. count = models.IntegerField(
  120. help_text="" # Написать описание поля
  121. )
  122. # FK
  123. user_who = models.ForeignKey(
  124. get_user_model(),
  125. related_name="rating_neg_user_who",
  126. on_delete=models.DO_NOTHING,
  127. help_text="уникальный идентификатор инициатора договорных отношений"
  128. )
  129. user_whom = models.ForeignKey(
  130. get_user_model(),
  131. related_name="rating_neg_user_whom",
  132. on_delete=models.DO_NOTHING,
  133. help_text=" уникальный идентификатор того с кем связываются"
  134. )
  135. servicetype = models.ForeignKey(
  136. ServiceType,
  137. on_delete=models.DO_NOTHING,
  138. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  139. )
  140. class RatingOk(models.Model):
  141. description = (
  142. "RatingOk - это... FIXME: написать описание таблицы"
  143. )
  144. # DATA
  145. count = models.IntegerField(
  146. help_text="" # Написать описание поля
  147. )
  148. # FK
  149. user_who = models.ForeignKey(
  150. get_user_model(),
  151. related_name="rating_ok_user_who",
  152. on_delete=models.DO_NOTHING,
  153. help_text="уникальный идентификатор инициатора договорных отношений"
  154. )
  155. user_whom = models.ForeignKey(
  156. get_user_model(),
  157. related_name="rating_ok_user_whom",
  158. on_delete=models.DO_NOTHING,
  159. help_text=" уникальный идентификатор того с кем связываются"
  160. )
  161. servicetype = models.ForeignKey(
  162. ServiceType,
  163. on_delete=models.DO_NOTHING,
  164. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  165. )
  166. class RatingPos(models.Model):
  167. description = (
  168. "RatingPos - это... FIXME: написать описание таблицы"
  169. )
  170. # DATA
  171. count = models.IntegerField(
  172. help_text="" # Написать описание поля
  173. )
  174. # FK
  175. user_who = models.ForeignKey(
  176. get_user_model(),
  177. related_name="rating_pos_user_who",
  178. on_delete=models.DO_NOTHING,
  179. help_text="уникальный идентификатор инициатора договорных отношений"
  180. )
  181. user_whom = models.ForeignKey(
  182. get_user_model(),
  183. related_name="rating_pos_user_whom",
  184. on_delete=models.DO_NOTHING,
  185. help_text=" уникальный идентификатор того с кем связываются"
  186. )
  187. servicetype = models.ForeignKey(
  188. ServiceType,
  189. on_delete=models.DO_NOTHING,
  190. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  191. )
  192. class Relationship(models.Model):
  193. description = (
  194. "Relationship - описание связей "
  195. "(желательных - как имеющиеся договорные отношения, "
  196. "и нежелательных - как пожелание любой из сторон)"
  197. )
  198. # DATA
  199. neg_type = models.IntegerField(
  200. help_text="тип договорных отношений по его уникальному идентификатору"
  201. )
  202. requirements = models.CharField(
  203. max_length=150,
  204. help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным. Оно вставляется автоматом, в соответствии с профилем метасервиса. Далее, если кому-то из партнеров или пользователей надо строже - применяется более строгий вариант на данную связь."
  205. )
  206. status = models.CharField(
  207. max_length=150,
  208. help_text="(статус обработки заявки в системе заявок)"
  209. )
  210. # FK
  211. user_id_who = models.ForeignKey(
  212. get_user_model(),
  213. related_name="user_id_who",
  214. on_delete=models.DO_NOTHING,
  215. help_text="уникальный идентификатор инициатора договорных отношений"
  216. )
  217. user_id_whom = models.ForeignKey(
  218. get_user_model(),
  219. related_name="user_id_whom",
  220. on_delete=models.DO_NOTHING,
  221. help_text=" уникальный идентификатор того с кем связываются"
  222. )
  223. ticket_status = models.ForeignKey(
  224. Ticket,
  225. on_delete=models.DO_NOTHING,
  226. help_text="id заявки, по которой происходит проверка статуса relationship. State меняется только в результате изменений в заявке."
  227. )
  228. class Resource(models.Model):
  229. description = (
  230. "Resource/Список ресурсов – автомобили/дома/объекты сервиса"
  231. )
  232. # DATA
  233. resoure_type = models.CharField(
  234. max_length=10,
  235. help_text="определение типа ресурса по его уникальному идентификатору в соответствии с классификатором"
  236. )
  237. requirements = models.CharField(
  238. max_length=150,
  239. help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным"
  240. )
  241. status = models.CharField(
  242. max_length=150,
  243. help_text="статус ресурса в системе относительно прохождения проверок (activity_status) (может быть active только в том случае, если ticket, влияющий на статус - закрыт."
  244. )
  245. # FK
  246. ticket_status = models.ForeignKey(
  247. Ticket,
  248. on_delete=models.DO_NOTHING,
  249. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  250. )
  251. user_id = models.ForeignKey(
  252. get_user_model(),
  253. on_delete=models.DO_NOTHING,
  254. help_text="уникальный идентификатор ответственного (за состояние, доступность и так далее - то есть для договора) пользователя - идентификатор провайдера, по которому восстанавливается конкретный пользовательский аккаунт"
  255. )
  256. class Service(models.Model):
  257. description = (
  258. "service - спецификация услуги каждого конкретного поставщика "
  259. "(например, в рамках сервиса многие могут предоставлять услуги перевозки, "
  260. "но конкретный шаблон с конкретным тарифом относится к отдельному перевозчику)"
  261. )
  262. # DATA
  263. price_alg = models.CharField(
  264. max_length=100,
  265. help_text="шаблон алгоритма расчета цены для оказываемой услуги (по этой переменной определяется, какую функцию для расчета цены вызывать)"
  266. )
  267. price_km = models.DecimalField(
  268. max_digits=9,
  269. decimal_places=2,
  270. help_text="значение параметра стоимости 1км данного поставщика для данного шаблона услуги"
  271. )
  272. price_min = models.DecimalField(
  273. max_digits=9,
  274. decimal_places=2,
  275. help_text="значение параметра стоимости 1мин данного поставщика для данного шаблона услуги"
  276. )
  277. price_amount = models.DecimalField(
  278. max_digits=9,
  279. decimal_places=2,
  280. help_text="значение параметра стоимости 1 услуги данного поставщика для данного шаблона услуги"
  281. )
  282. company_comission = models.FloatField(
  283. help_text="Коммисия сервиса"
  284. )
  285. requirements = models.CharField(
  286. max_length=150,
  287. help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным. Оно вставляется автоматом, в соответствии с профилем метасервиса. Далее, если кому-то из партнеров или пользователей надо строже - применяется более строгий вариант на данную связь."
  288. )
  289. service_status = models.CharField(
  290. max_length=150,
  291. help_text="статус спецификации типа услуги, принимает значения Online, Offline, Preorder with Gap. Online/offline выставляются по проверке параметров и желанию пользователя (например, если пользователь переключает себя online, но по какой-то причине ему такую услугу оказывать запрещено - оно не переключится, то есть надо перед сменой значения этого поля всегда запускать проверку)"
  292. )
  293. status = models.CharField(
  294. max_length=150,
  295. help_text="статус обработки заявки в системе заявок. активность на основе системы заяво"
  296. )
  297. # FK
  298. ticket_status = models.ForeignKey(
  299. Ticket,
  300. on_delete=models.DO_NOTHING,
  301. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  302. )
  303. resource_id = models.ForeignKey(
  304. Resource,
  305. on_delete=models.DO_NOTHING,
  306. blank=True,
  307. null=True,
  308. help_text="ответственный за ресурс(не всегда). так как ресурсы сами услугу оказать не могут, а также один ресурс может быть представлен в виде разных услуг, то фактически с точки зрения смысла системы ресурс - это как неодушевленный пользователь. Без провайдера, который с его помощью оказывает услугу - никуда. Поле остается пустым, если сервис не предусматривает использование услуг. Стоит обратить внимание, что это не обязательно ответственный за ресурс. Например, за состояние автомобиля может быть ответственен пользователь (он и указывается в таблице со свойствами ресурса), а услугу доступа или перевозки может оказывать иное лицо."
  309. )
  310. servicetype_id = models.ForeignKey(
  311. ServiceType,
  312. on_delete=models.DO_NOTHING,
  313. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  314. )
  315. class ServiceType(models.Model):
  316. description = (
  317. "Перечень типов услуг"
  318. )
  319. # DATA
  320. codename = models.CharField(
  321. max_length=255,
  322. help_text="латинское наименование услуги в системе"
  323. )
  324. requirements = models.CharField(
  325. max_length=300,
  326. help_text="код требований на основе вспомогательных таблиц-справочников"
  327. )
  328. status = models.CharField(
  329. max_length=150,
  330. help_text="активность на основе системы заявок"
  331. )
  332. caption = models.CharField(
  333. max_length=255,
  334. help_text="наименование услуги для отображения пользователю"
  335. )
  336. description = models.TextField(
  337. blank=True,
  338. help_text="текстовое описание услуги"
  339. )
  340. link_agreement = models.CharField(
  341. max_length=400,
  342. help_text="ссылка на договор в вики об оказании услуги данного типа (аренда, перевозка и тп)"
  343. )
  344. price_type = models.CharField(
  345. max_length=150,
  346. help_text="ценообразование - код допустимых вариантов или код параметров, принимаемых во внимание и способ их учета (по сути хорошо закодировать формулу)"
  347. )
  348. company_comission = models.FloatField(
  349. help_text="Коммисия сервиса"
  350. )
  351. # FK
  352. ticket_status = models.ForeignKey(
  353. Ticket,
  354. on_delete=models.DO_NOTHING,
  355. null=True,
  356. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  357. )