employees.typ 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // =============================================================
  2. // INFRASTRUCTURE: ПУБЛИЧНЫЙ СПРАВОЧНИК СОТРУДНИКОВ И ПОДПИСЕЙ
  3. // =============================================================
  4. // ФИО, обычная должность и имя файла не являются приватными.
  5. // Наличие подписи и её индивидуальное смещение задаются только в
  6. // игнорируемом Git файле /.private/settings.typ.
  7. #import "../domain/document.typ": fail
  8. #let employee-directory = (
  9. musikhin: (
  10. name: "Мусихин А.С.",
  11. default-role: "Ответственный исполнитель",
  12. signature-file: "Musikhin.png",
  13. ),
  14. guzeev: (
  15. name: "Гузеев И.А.",
  16. default-role: "Главный геомеханик",
  17. signature-file: "Guzeev.png",
  18. ),
  19. fedorov: (
  20. name: "Федоров Д.А.",
  21. default-role: "Инженер-геомеханик",
  22. signature-file: "Fedorov.png",
  23. ),
  24. ilyasov: (
  25. name: "Ильясов Б.Т.",
  26. default-role: "Технический директор, к.т.н.",
  27. signature-file: "Ilyasov.png",
  28. ),
  29. khimichev: (
  30. name: "Химичев С.С.",
  31. default-role: "Инженер-геомеханик",
  32. signature-file: "Khimichev.png",
  33. ),
  34. brusnicin: (
  35. name: "Брусницын И.В.",
  36. default-role: "Инженер-геомеханик",
  37. signature-file: "Brusnicin.png",
  38. ),
  39. ozornin: (
  40. name: "Озорнин Д.А.",
  41. default-role: "Геолог",
  42. signature-file: "Ozornin.png",
  43. ),
  44. buhartdinov: (
  45. name: "Бухартдинов А.С.",
  46. default-role: "Главный маркшейдер",
  47. signature-file: "Buhartdinov.png",
  48. ),
  49. tkachenko: (
  50. name: "Ткаченко А.С.",
  51. default-role: "Инженер-геомеханик",
  52. signature-file: "Tkachenko.png",
  53. ),
  54. moshin: (
  55. name: "Мошин В.Е.",
  56. default-role: "Гидрогеолог",
  57. signature-file: "Moshin.png",
  58. ),
  59. mitrokhin: (
  60. name: "Митрохин В.А.",
  61. default-role: "Главный гидрогеолог",
  62. signature-file: "Mitrokhin.png",
  63. ),
  64. luzina: (
  65. name: "Лузина М.В.",
  66. default-role: "Геолог",
  67. signature-file: "Luzina.png",
  68. ),
  69. balandin: (
  70. name: "Баландин А.",
  71. default-role: "Геолог",
  72. signature-file: "Balandin.png",
  73. ),
  74. baigali: (
  75. name: "Байгали Р.К.",
  76. default-role: "Инженер-геомеханик",
  77. signature-file: "Baigali.png",
  78. ),
  79. sugatov: (
  80. name: "Сугатов Н.С.",
  81. default-role: "Инженер-геомеханик",
  82. signature-file: "Sugatov.png",
  83. ),
  84. soluyanov: (
  85. name: "Солуянов Н.О.",
  86. default-role: "Ведущий геомеханик",
  87. signature-file: "Soluyanov.png",
  88. ),
  89. ecenkov: (
  90. name: "ЛЕценков И.А.",
  91. default-role: "Инженер-геомеханик",
  92. signature-file: "Ecenkov.png",
  93. ),
  94. savin: (
  95. name: "Савин Д.А.",
  96. default-role: "Делопроизводитель",
  97. signature-file: "Savin.png",
  98. ),
  99. trescov: (
  100. name: "Тресцов Н.Н.",
  101. default-role: "Геолог",
  102. signature-file: "Trescov.png",
  103. ),
  104. )
  105. #let empty-private-settings = (
  106. companies: (:),
  107. signatures: (:),
  108. )
  109. #let validate-private-settings(settings) = {
  110. if type(settings) != dictionary {
  111. fail("private-settings", "ожидался словарь из .private/settings.typ")
  112. }
  113. for field in ("companies", "signatures") {
  114. if type(settings.at(field, default: (:))) != dictionary {
  115. fail("private-settings." + field, "ожидался словарь")
  116. }
  117. }
  118. settings
  119. }
  120. #let private-company-media(settings, company-id) = {
  121. let settings = validate-private-settings(settings)
  122. let company = settings.companies.at(company-id, default: none)
  123. if company == none {
  124. (signature: none, stamp: none)
  125. } else {
  126. if type(company) != dictionary {
  127. fail("private-settings.companies." + company-id, "ожидался словарь")
  128. }
  129. let has-signature = company.at("signature", default: false)
  130. let has-stamp = company.at("stamp", default: false)
  131. if type(has-signature) != bool or type(has-stamp) != bool {
  132. fail(
  133. "private-settings.companies." + company-id,
  134. "поля signature и stamp должны быть true или false",
  135. )
  136. }
  137. (
  138. signature: if has-signature {
  139. path("/.private/" + company-id + "/sign.png")
  140. } else {
  141. none
  142. },
  143. stamp: if has-stamp {
  144. path("/.private/" + company-id + "/stamp.png")
  145. } else {
  146. none
  147. },
  148. )
  149. }
  150. }
  151. #let report-executor(employee-id, role: auto, private-settings: empty-private-settings) = {
  152. if type(employee-id) != str or not employee-directory.keys().contains(employee-id) {
  153. fail(
  154. "report-executor.employee-id",
  155. "неизвестный сотрудник " + repr(employee-id) + "; доступны "
  156. + employee-directory.keys().join(", "),
  157. )
  158. }
  159. let person = employee-directory.at(employee-id)
  160. let resolved-role = if role == auto { person.default-role } else { role }
  161. if type(resolved-role) != str or resolved-role.trim() == "" {
  162. fail("report-executor.role", "должность должна быть непустой строкой")
  163. }
  164. let settings = validate-private-settings(private-settings)
  165. let signature = settings.signatures.at(employee-id, default: none)
  166. let signature-image = none
  167. let signature-offset = 0cm
  168. if signature != none {
  169. if type(signature) != dictionary {
  170. fail("private-settings.signatures." + employee-id, "ожидался словарь")
  171. }
  172. let enabled = signature.at("enabled", default: true)
  173. if type(enabled) != bool {
  174. fail(
  175. "private-settings.signatures." + employee-id + ".enabled",
  176. "ожидалось true или false",
  177. )
  178. }
  179. if enabled {
  180. signature-image = path("/.private/executors/" + person.signature-file)
  181. signature-offset = signature.at("offset", default: 0cm)
  182. if type(signature-offset) != length {
  183. fail(
  184. "private-settings.signatures." + employee-id + ".offset",
  185. "ожидалась длина, например 1.25cm",
  186. )
  187. }
  188. }
  189. }
  190. (
  191. resolved-role,
  192. person.name,
  193. signature-image,
  194. signature-offset,
  195. )
  196. }