models.py 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  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 Client():
  17. description = (
  18. "Client - это таблица с клиентами. Клиент/пользователь/аккаунт "
  19. "в системе, который по логике получает услугу."
  20. )
  21. # ID METASERVICE
  22. id_metaservice = Template.id_metaservice
  23. # DATA
  24. requirements = "требования для того, чтобы можно было получать услуги как клиент"
  25. status = "активность на основе системы заявок"
  26. # OTHER
  27. is_global = Template.is_global
  28. is_visible = Template.is_visible
  29. # FK
  30. ticket_status = (
  31. "id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  32. )
  33. user = (
  34. "пользователь, которому соответствует роль клиента"
  35. )
  36. class Company():
  37. description = (
  38. "Company - это таблица с партнерами сервисов. Партнер сервиса - "
  39. "юридическое лицо или ИП, которое непосредственно организует работу с "
  40. "исполнителями и отвечает перед клиентами и перед сервисом за качество "
  41. "оказанных услуг. Юридически это лица, фактически оказывающие услуги "
  42. "по договору."
  43. )
  44. # ID METASERVICE
  45. id_metaservice = Template.id_metaservice
  46. # DATA
  47. requirements = (
  48. "Код необходимый для того, чтобы ресурс мог стать активным"
  49. )
  50. status = "Cтатус обработки заявки"
  51. legal_name = "Настоящее имя юридического лица"
  52. address = "Юридический адрес"
  53. inn = "ИНН компании"
  54. kpp = "КПП компании"
  55. ogrn = "ОГРН компании"
  56. bank_name = "Название банка с расчетным счетом"
  57. bik = "БИК компании"
  58. rs = "Расчетный счет"
  59. ks = (
  60. "Корреспондентский счет (счет, открываемый банковской организацией в подразделении самого банка)"
  61. )
  62. tax_method = "Система налогооблажения"
  63. # OTHER
  64. is_global = Template.is_global
  65. is_visible = Template.is_visible
  66. # FK
  67. repr = "Уникальный идентификатор представителя компании"
  68. ticket_status = "ID заявки, привязанной к текущей записи",
  69. class Documents():
  70. description = (
  71. "Documents - это одна таблица со всеми документами. "
  72. "Вообще в концепции предполагалось, что таких таблиц должно быть много под каждый тип для удобства поиска. "
  73. "То есть отдельно таблица с паспортами, отдельно с правами, отдельно с какими-нибудь разрешениями и так далее. "
  74. "Что пока непонятно - документов может быть много разных."
  75. )
  76. # ID METASERVICE
  77. id_metaservice = Template.id_metaservice
  78. # DATA
  79. check_date = (
  80. "timestamp проверки"
  81. )
  82. check_level = (
  83. "информация об уровне проверки. Документ может быть проверен как платформой, так и мета-сервисом, так и партнером мета-сервиса, а может быть и никем (просто загружен). Указывается, так как достоверность проверки разная. Документ, проверенный только на низком уровне, не принимается во внимание как имеющийся до прохождения более высокоуровневой проверки. Информацию об уровнях проверки можно посмотреть по словарю Requirements. В данной таблице хранится информация о наиболее высоком уровне проверки."
  84. )
  85. expire_date = (
  86. "срок окончания действия документа."
  87. )
  88. status = (
  89. "активность на основе системы заявок"
  90. )
  91. data_path = (
  92. "Путь к документу"
  93. )
  94. doc_type = (
  95. "тип документа (паспорт/паспорт 1 страница и т д) в соответствии с классификатором типов документов (см описание в Requirements)"
  96. )
  97. # OTHER
  98. is_global = Template.is_global
  99. is_visible = Template.is_visible
  100. # FK
  101. company_id = (
  102. "идентификатор компании, к которой относится документ, если таковая есть (может не быть)"
  103. )
  104. user_id = (
  105. "уникальный идентификатор пользователя (конкретного клиентского аккаунта) являющегося владельцем данного документа"
  106. )
  107. ticket_status = (
  108. "id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  109. )
  110. checked_by = (
  111. "userid проверившего"
  112. )
  113. class Orders():
  114. description = (
  115. "Orders - таблица с заказами"
  116. )
  117. # ID METASERVICE
  118. id_metaservice = Template.id_metaservice
  119. # DATA
  120. status = models.CharField(
  121. max_length=150,
  122. help_text="текущий статус заказа из возможных на платформе"
  123. )
  124. title = models.CharField(
  125. max_length=150,
  126. help_text="заголовок заказа",
  127. default='Заголовок'
  128. )
  129. note = models.CharField(
  130. max_length=150,
  131. help_text="задание к заказу",
  132. default='Записи'
  133. )
  134. time_created = models.DateTimeField(
  135. auto_now_add=True,
  136. help_text="время создания заказа"
  137. )
  138. time_placed = models.DateTimeField(
  139. help_text="время размещения заказа"
  140. )
  141. time_start = models.DateTimeField(
  142. null=True,
  143. help_text="время начала оказания услуги"
  144. )
  145. time_start_real = models.DateTimeField(
  146. null=True,
  147. help_text=""
  148. )
  149. time_start_predicted = models.DateTimeField(
  150. null=True,
  151. help_text=""
  152. )
  153. time_finish_real = models.DateTimeField(
  154. null=True,
  155. help_text="фактическое время окончания (точное установленное время)"
  156. )
  157. time_finish_predicted = models.DateTimeField(
  158. help_text="предварительное/расчетное время до окончания оказания услуги"
  159. )
  160. real_price = models.FloatField(
  161. help_text="цена с учетом тарифа поставщика услуг по факту оказания услуги"
  162. )
  163. predicted_price = models.FloatField(
  164. help_text="расчетная цена с учетом тарифа поставщика услуг"
  165. )
  166. # NOTE: Возможно в будующем можнос сделать символом
  167. asap = models.BooleanField(
  168. default=False,
  169. help_text="Срочный ли заказ"
  170. )
  171. # OTHER
  172. is_global = Template.is_global
  173. is_visible = Template.is_visible
  174. # FK
  175. ticket = models.ForeignKey(
  176. Ticket,
  177. null=True,
  178. on_delete=models.DO_NOTHING
  179. )
  180. service = models.ForeignKey(
  181. Service,
  182. null=True,
  183. on_delete=models.DO_NOTHING,
  184. help_text="спецификатор услуги провайдера, нужен для установления цены (id_service - уникальный идентификатор шаблона услуги, необходим для установления цены и исполнителей."
  185. )
  186. service_type = models.ForeignKey(
  187. ServiceType,
  188. null=True,
  189. on_delete=models.DO_NOTHING,
  190. help_text="тип заказа по классификатору услу"
  191. )
  192. client = models.ForeignKey(
  193. Client,
  194. null=True,
  195. on_delete=models.DO_NOTHING,
  196. help_text="клиент/аккаунт, который оплачивает все оказанные услуги"
  197. )
  198. provider = models.ForeignKey(
  199. Provider,
  200. null=True,
  201. on_delete=models.DO_NOTHING,
  202. help_text="уникальный идентификатор поставщика услуги/аккаунта, который оказывает услугу. Если несколько провайдеров собираются мета-сервисом в цепочку, где на уровне связи с клиентом нельзя установить одно ответственное лицо, то указывается вспомогательный мета-провайдер сервиса, и это означает, что мета-сервис несет ответственность перед пользователем за сборку услуги воедино."
  203. )
  204. receiver = models.ForeignKey(
  205. get_user_model(),
  206. null=True,
  207. related_name="user_id",
  208. on_delete=models.DO_NOTHING,
  209. help_text="пользователь/аккаунт, который принимает оказываемые услуги"
  210. )
  211. company = models.ForeignKey(
  212. Company,
  213. on_delete=models.DO_NOTHING,
  214. null=True,
  215. help_text="Идентификатор компании, к которой относится документ, если таковая есть (может не быть)"
  216. )
  217. class Permissions(models.Model):
  218. description = (
  219. "Разрешения - (проверки/экзамены). "
  220. "По смыслу это что-то вроде “документа на право что-то делать” - на данном этапе это ограничено метасервисом/платформой, "
  221. "при этом он может быть полностью цифровым (выданным платформой/сервисом)."
  222. )
  223. # ID METASERVICE
  224. id_metaservice = Template.id_metaservice
  225. # DATA
  226. permission_type = models.BigIntegerField(
  227. help_text="уникальный идентификатор определяющий наличие разрешения из множества в словаре - выданных пользователю/клиенту/аккаунту"
  228. )
  229. check_level = models.CharField(
  230. max_length=10,
  231. help_text="(check-level из классификатора платформы) - информация об уровне проверки. Проверка может быть проведена как платформой, так и мета-сервисом, так и партнером мета-сервиса, а может быть и никем (просто загружен). Указывается, так как достоверность проверки разная. Экзамен, проверенный только на низком уровне, не принимается во внимание как имеющийся до прохождения более высокоуровневой проверки."
  232. )
  233. status = models.CharField(
  234. max_length=150,
  235. help_text="статус обработки заявки в системе заявок"
  236. )
  237. check_date = models.DateTimeField(
  238. null=True,
  239. help_text="timestamp проверки"
  240. )
  241. expire_date = models.DateField(
  242. help_text="Срок окончания действия разрешения"
  243. )
  244. # OTHER
  245. is_global = Template.is_global
  246. is_visible = Template.is_visible
  247. # FK
  248. ticket_status = models.ForeignKey(
  249. Ticket,
  250. on_delete=models.DO_NOTHING,
  251. null=True,
  252. help_text="id заявки, по которой происходит проверка статуса relationship. State меняется только в результате изменений в заявке."
  253. )
  254. user_id = models.ForeignKey(
  255. get_user_model(),
  256. related_name="user_id_perm",
  257. on_delete=models.DO_NOTHING,
  258. null=True,
  259. help_text="уникальный идентификатор пользователя/клиента/аккаунта, которым была пройдена проверка и получено разрешение"
  260. )
  261. checked_by = models.ForeignKey(
  262. get_user_model(),
  263. related_name="checked_by_perm",
  264. on_delete=models.DO_NOTHING,
  265. null=True,
  266. help_text="userid проверившего"
  267. )
  268. class Provider(models.Model):
  269. description = (
  270. "Provider – единица описания поставщика услуг/ответственного лица за определенный ресурс (например, машину). "
  271. "По сути - это надстройка к клиентскому аккаунту, иллюстрирующая, что данный пользователь может выступать не только в роли потребителя. "
  272. "То есть, по тому, какие “провайдеры” находятся по идентификатору пользователя - можно установить конкретный список услуг данного пользователя."
  273. )
  274. # ID METASERVICE
  275. id_metaservice = Template.id_metaservice
  276. # DATA
  277. type = models.CharField(
  278. max_length=150,
  279. help_text="тип поставщика (партнер/ответственное лицо/поставщик услуг). Смысл такой - провайдер это статус пользователя, который, в зависимости от применения, может нести разный смысл и подразумевает под собой какой-то тип действия. Обычные исполнители - это провайдеры услуг (код 3). Ответственные за какое-то имущество, которые сдают его в аренду - это тоже провайдеры (код 2). Ответственные за набор услуг перед метасервисом (фактически - назначенные админы) - это провайдеры-партнеры (код 1)"
  280. )
  281. requirements = models.CharField(
  282. max_length=300,
  283. help_text="требования для того, чтобы можно было предоставлять услуги любые в этом метасервисе в целом (самые строгие)"
  284. )
  285. status = models.CharField(
  286. max_length=150,
  287. help_text="статус пользователя в системе относительно прохождения проверок (activity_status) (может быть active только в том случае, если ticket, влияющий на статус - закрыт."
  288. )
  289. location_type = models.CharField(
  290. max_length=300,
  291. help_text="статическая или динамическая локация оказания услуги. Если статическая, а исполнитель находится существенно за пределами локации - то тогда статус автоматом оффлайн для приема новых заявок."
  292. )
  293. default_location = models.CharField(
  294. max_length=300,
  295. help_text="локация по умолчанию для объекта."
  296. )
  297. # OTHER
  298. is_global = Template.is_global
  299. is_visible = Template.is_visible
  300. # FK
  301. user_id = models.ForeignKey(
  302. get_user_model(),
  303. on_delete=models.DO_NOTHING,
  304. null=True,
  305. help_text="уникальный идентификатор конкретного пользователя системы (meta-user), который будет оказывать услугу. Один пользователь может быть провайдером нескольких услуг. Статус провайдера означает, что с данным пользователем может быть установлена связь, как с исполнителем."
  306. )
  307. company_id = models.ForeignKey(
  308. Company,
  309. on_delete=models.DO_NOTHING,
  310. null=True,
  311. help_text="уникальный идентификатор компании, от лица которой выступает провайдер. Смысл такой - ответственны могут быть только одушевленные лица, компании - не одушевленные. Все услуги предоставляются через компании-партнеры, самозанятые или ИП являются единицами таких компаний."
  312. )
  313. ticket_status = models.ForeignKey(
  314. Ticket,
  315. on_delete=models.DO_NOTHING,
  316. null=True,
  317. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  318. )
  319. service = models.ForeignKey(
  320. Service,
  321. on_delete=models.DO_NOTHING,
  322. null=True,
  323. help_text="id услуги, которую предостовляют"
  324. )
  325. class RatingNeg(models.Model):
  326. description = (
  327. "RatingNeg - это... FIXME: написать описание таблицы"
  328. )
  329. # ID METASERVICE
  330. id_metaservice = Template.id_metaservice
  331. # DATA
  332. count = models.IntegerField(
  333. help_text="" # Написать описание поля
  334. )
  335. # OTHER
  336. is_global = Template.is_global
  337. is_visible = Template.is_visible
  338. # FK
  339. user_who = models.ForeignKey(
  340. get_user_model(),
  341. related_name="rating_neg_user_who",
  342. on_delete=models.DO_NOTHING,
  343. help_text="уникальный идентификатор инициатора договорных отношений"
  344. )
  345. user_whom = models.ForeignKey(
  346. get_user_model(),
  347. related_name="rating_neg_user_whom",
  348. on_delete=models.DO_NOTHING,
  349. help_text=" уникальный идентификатор того с кем связываются"
  350. )
  351. servicetype = models.ForeignKey(
  352. ServiceType,
  353. on_delete=models.DO_NOTHING,
  354. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  355. )
  356. class RatingOk(models.Model):
  357. description = (
  358. "RatingOk - это... FIXME: написать описание таблицы"
  359. )
  360. id = models.IntegerField(
  361. primary_key=True
  362. )
  363. # ID METASERVICE
  364. id_metaservice = models.PositiveIntegerField(
  365. null=True,
  366. help_text="уникальный идентификатор мета-сервиса, необходимый для синхронизации данных. Если при синхронизации возникает конфликт (несовместимость) с другим сервисом, предлагается или форсировать изменения везде (если возможно), либо is_global выставляется как false."
  367. )
  368. # DATA
  369. count = models.IntegerField(
  370. help_text="" # Написать описание поля
  371. )
  372. # OTHER
  373. is_global = Template.is_global
  374. is_visible = Template.is_visible
  375. # FK
  376. user_who = models.ForeignKey(
  377. get_user_model(),
  378. related_name="rating_ok_user_who",
  379. on_delete=models.DO_NOTHING,
  380. help_text="уникальный идентификатор инициатора договорных отношений"
  381. )
  382. user_whom = models.ForeignKey(
  383. get_user_model(),
  384. related_name="rating_ok_user_whom",
  385. on_delete=models.DO_NOTHING,
  386. help_text=" уникальный идентификатор того с кем связываются"
  387. )
  388. servicetype = models.ForeignKey(
  389. ServiceType,
  390. on_delete=models.DO_NOTHING,
  391. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  392. )
  393. class RatingPos(models.Model):
  394. description = (
  395. "RatingPos - это... FIXME: написать описание таблицы"
  396. )
  397. # ID METASERVICE
  398. id_metaservice = Template.id_metaservice
  399. # DATA
  400. count = models.IntegerField(
  401. help_text="" # Написать описание поля
  402. )
  403. # OTHER
  404. is_global = Template.is_global
  405. is_visible = Template.is_visible
  406. # FK
  407. user_who = models.ForeignKey(
  408. get_user_model(),
  409. related_name="rating_pos_user_who",
  410. on_delete=models.DO_NOTHING,
  411. help_text="уникальный идентификатор инициатора договорных отношений"
  412. )
  413. user_whom = models.ForeignKey(
  414. get_user_model(),
  415. related_name="rating_pos_user_whom",
  416. on_delete=models.DO_NOTHING,
  417. help_text=" уникальный идентификатор того с кем связываются"
  418. )
  419. servicetype = models.ForeignKey(
  420. ServiceType,
  421. on_delete=models.DO_NOTHING,
  422. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  423. )
  424. class Relationship(models.Model):
  425. description = (
  426. "Relationship - описание связей "
  427. "(желательных - как имеющиеся договорные отношения, "
  428. "и нежелательных - как пожелание любой из сторон)"
  429. )
  430. # ID METASERVICE
  431. id_metaservice = Template.id_metaservice
  432. # DATA
  433. neg_type = models.IntegerField(
  434. help_text="тип договорных отношений по его уникальному идентификатору"
  435. )
  436. requirements = models.CharField(
  437. max_length=150,
  438. help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным. Оно вставляется автоматом, в соответствии с профилем метасервиса. Далее, если кому-то из партнеров или пользователей надо строже - применяется более строгий вариант на данную связь."
  439. )
  440. status = models.CharField(
  441. max_length=150,
  442. help_text="(статус обработки заявки в системе заявок)"
  443. )
  444. # OTHER
  445. is_global = Template.is_global
  446. is_visible = Template.is_visible
  447. # FK
  448. user_id_who = models.ForeignKey(
  449. get_user_model(),
  450. related_name="user_id_who",
  451. on_delete=models.DO_NOTHING,
  452. help_text="уникальный идентификатор инициатора договорных отношений"
  453. )
  454. user_id_whom = models.ForeignKey(
  455. get_user_model(),
  456. related_name="user_id_whom",
  457. on_delete=models.DO_NOTHING,
  458. help_text=" уникальный идентификатор того с кем связываются"
  459. )
  460. ticket_status = models.ForeignKey(
  461. Ticket,
  462. on_delete=models.DO_NOTHING,
  463. help_text="id заявки, по которой происходит проверка статуса relationship. State меняется только в результате изменений в заявке."
  464. )
  465. class Resource(models.Model):
  466. description = (
  467. "Resource/Список ресурсов – автомобили/дома/объекты сервиса"
  468. )
  469. # ID METASERVICE
  470. id_metaservice = Template.id_metaservice
  471. # DATA
  472. resoure_type = models.CharField(
  473. max_length=10,
  474. help_text="определение типа ресурса по его уникальному идентификатору в соответствии с классификатором"
  475. )
  476. requirements = models.CharField(
  477. max_length=150,
  478. help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным"
  479. )
  480. status = models.CharField(
  481. max_length=150,
  482. help_text="статус ресурса в системе относительно прохождения проверок (activity_status) (может быть active только в том случае, если ticket, влияющий на статус - закрыт."
  483. )
  484. # OTHER
  485. is_global = Template.is_global
  486. is_visible = Template.is_visible
  487. # FK
  488. ticket_status = models.ForeignKey(
  489. Ticket,
  490. on_delete=models.DO_NOTHING,
  491. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  492. )
  493. user_id = models.ForeignKey(
  494. get_user_model(),
  495. on_delete=models.DO_NOTHING,
  496. help_text="уникальный идентификатор ответственного (за состояние, доступность и так далее - то есть для договора) пользователя - идентификатор провайдера, по которому восстанавливается конкретный пользовательский аккаунт"
  497. )
  498. class Service(models.Model):
  499. description = (
  500. "service - спецификация услуги каждого конкретного поставщика "
  501. "(например, в рамках сервиса многие могут предоставлять услуги перевозки, "
  502. "но конкретный шаблон с конкретным тарифом относится к отдельному перевозчику)"
  503. )
  504. # ID METASERVICE
  505. id_metaservice = Template.id_metaservice
  506. # DATA
  507. price_alg = models.CharField(
  508. max_length=100,
  509. help_text="шаблон алгоритма расчета цены для оказываемой услуги (по этой переменной определяется, какую функцию для расчета цены вызывать)"
  510. )
  511. price_km = models.DecimalField(
  512. max_digits=9,
  513. decimal_places=2,
  514. help_text="значение параметра стоимости 1км данного поставщика для данного шаблона услуги"
  515. )
  516. price_min = models.DecimalField(
  517. max_digits=9,
  518. decimal_places=2,
  519. help_text="значение параметра стоимости 1мин данного поставщика для данного шаблона услуги"
  520. )
  521. price_amount = models.DecimalField(
  522. max_digits=9,
  523. decimal_places=2,
  524. help_text="значение параметра стоимости 1 услуги данного поставщика для данного шаблона услуги"
  525. )
  526. company_comission = models.FloatField(
  527. help_text="Коммисия сервиса"
  528. )
  529. requirements = models.CharField(
  530. max_length=150,
  531. help_text="код необходимого (самый строгий) для того, чтобы ресурс мог стать активным. Оно вставляется автоматом, в соответствии с профилем метасервиса. Далее, если кому-то из партнеров или пользователей надо строже - применяется более строгий вариант на данную связь."
  532. )
  533. service_status = models.CharField(
  534. max_length=150,
  535. help_text="статус спецификации типа услуги, принимает значения Online, Offline, Preorder with Gap. Online/offline выставляются по проверке параметров и желанию пользователя (например, если пользователь переключает себя online, но по какой-то причине ему такую услугу оказывать запрещено - оно не переключится, то есть надо перед сменой значения этого поля всегда запускать проверку)"
  536. )
  537. status = models.CharField(
  538. max_length=150,
  539. help_text="статус обработки заявки в системе заявок. активность на основе системы заяво"
  540. )
  541. # OTHER
  542. is_global = Template.is_global
  543. is_visible = Template.is_visible
  544. # FK
  545. ticket_status = models.ForeignKey(
  546. Ticket,
  547. on_delete=models.DO_NOTHING,
  548. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  549. )
  550. resource_id = models.ForeignKey(
  551. Resource,
  552. on_delete=models.DO_NOTHING,
  553. blank=True,
  554. null=True,
  555. help_text="ответственный за ресурс(не всегда). так как ресурсы сами услугу оказать не могут, а также один ресурс может быть представлен в виде разных услуг, то фактически с точки зрения смысла системы ресурс - это как неодушевленный пользователь. Без провайдера, который с его помощью оказывает услугу - никуда. Поле остается пустым, если сервис не предусматривает использование услуг. Стоит обратить внимание, что это не обязательно ответственный за ресурс. Например, за состояние автомобиля может быть ответственен пользователь (он и указывается в таблице со свойствами ресурса), а услугу доступа или перевозки может оказывать иное лицо."
  556. )
  557. servicetype_id = models.ForeignKey(
  558. ServiceType,
  559. on_delete=models.DO_NOTHING,
  560. help_text="тип оказываемой услуги по классификатору услуг сервиса"
  561. )
  562. class ServiceType(models.Model):
  563. description = (
  564. "Перечень типов услуг"
  565. )
  566. # ID METASERVICE
  567. id_metaservice = Template.id_metaservice
  568. # DATA
  569. codename = models.CharField(
  570. max_length=255,
  571. help_text="латинское наименование услуги в системе"
  572. )
  573. requirements = models.CharField(
  574. max_length=300,
  575. help_text="код требований на основе вспомогательных таблиц-справочников"
  576. )
  577. status = models.CharField(
  578. max_length=150,
  579. help_text="активность на основе системы заявок"
  580. )
  581. caption = models.CharField(
  582. max_length=255,
  583. help_text="наименование услуги для отображения пользователю"
  584. )
  585. description = models.TextField(
  586. blank=True,
  587. help_text="текстовое описание услуги"
  588. )
  589. link_agreement = models.CharField(
  590. max_length=400,
  591. help_text="ссылка на договор в вики об оказании услуги данного типа (аренда, перевозка и тп)"
  592. )
  593. price_type = models.CharField(
  594. max_length=150,
  595. help_text="ценообразование - код допустимых вариантов или код параметров, принимаемых во внимание и способ их учета (по сути хорошо закодировать формулу)"
  596. )
  597. company_comission = models.FloatField(
  598. help_text="Коммисия сервиса"
  599. )
  600. # OTHER
  601. is_global = Template.is_global
  602. is_visible = Template.is_visible
  603. # FK
  604. ticket_status = models.ForeignKey(
  605. Ticket,
  606. on_delete=models.DO_NOTHING,
  607. null=True,
  608. help_text="id последнего актуального тикета, касающийся статуса. Если он меняет статус на закрытый - вызывается проверка, которая смотрит, нет ли другого открытого по пользователю."
  609. )