@things-factory/ops-master 10.1.248 → 10.1.250

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/dist-client/bootstrap.d.ts +19 -0
  2. package/dist-client/bootstrap.js +66 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/index.d.ts +17 -0
  5. package/dist-client/index.js +21 -0
  6. package/dist-client/index.js.map +1 -0
  7. package/dist-client/master-change-approval.d.ts +14 -0
  8. package/dist-client/master-change-approval.js +36 -0
  9. package/dist-client/master-change-approval.js.map +1 -0
  10. package/dist-client/master-change-policy-axes.d.ts +37 -0
  11. package/dist-client/master-change-policy-axes.js +29 -0
  12. package/dist-client/master-change-policy-axes.js.map +1 -0
  13. package/dist-client/master-change-policy-panel.d.ts +59 -0
  14. package/dist-client/master-change-policy-panel.js +454 -0
  15. package/dist-client/master-change-policy-panel.js.map +1 -0
  16. package/dist-client/master-change-providers.d.ts +4 -0
  17. package/dist-client/master-change-providers.js +91 -0
  18. package/dist-client/master-change-providers.js.map +1 -0
  19. package/dist-client/pages/master/applied-when-dialog.d.ts +48 -0
  20. package/dist-client/pages/master/applied-when-dialog.js +137 -0
  21. package/dist-client/pages/master/applied-when-dialog.js.map +1 -0
  22. package/dist-client/pages/master/assignment-fields.d.ts +27 -0
  23. package/dist-client/pages/master/assignment-fields.js +62 -0
  24. package/dist-client/pages/master/assignment-fields.js.map +1 -0
  25. package/dist-client/pages/master/equipment-class.d.ts +12 -0
  26. package/dist-client/pages/master/equipment-class.js +42 -0
  27. package/dist-client/pages/master/equipment-class.js.map +1 -0
  28. package/dist-client/pages/master/equipment.d.ts +12 -0
  29. package/dist-client/pages/master/equipment.js +58 -0
  30. package/dist-client/pages/master/equipment.js.map +1 -0
  31. package/dist-client/pages/master/grist-iso-duration.d.ts +20 -0
  32. package/dist-client/pages/master/grist-iso-duration.js +70 -0
  33. package/dist-client/pages/master/grist-iso-duration.js.map +1 -0
  34. package/dist-client/pages/master/grist-reference.d.ts +91 -0
  35. package/dist-client/pages/master/grist-reference.js +419 -0
  36. package/dist-client/pages/master/grist-reference.js.map +1 -0
  37. package/dist-client/pages/master/import-rows.d.ts +35 -0
  38. package/dist-client/pages/master/import-rows.js +66 -0
  39. package/dist-client/pages/master/import-rows.js.map +1 -0
  40. package/dist-client/pages/master/iso-duration.d.ts +34 -0
  41. package/dist-client/pages/master/iso-duration.js +76 -0
  42. package/dist-client/pages/master/iso-duration.js.map +1 -0
  43. package/dist-client/pages/master/master-options.d.ts +40 -0
  44. package/dist-client/pages/master/master-options.js +54 -0
  45. package/dist-client/pages/master/master-options.js.map +1 -0
  46. package/dist-client/pages/master/master-page-base.d.ts +369 -0
  47. package/dist-client/pages/master/master-page-base.js +657 -0
  48. package/dist-client/pages/master/master-page-base.js.map +1 -0
  49. package/dist-client/pages/master/material-class.d.ts +12 -0
  50. package/dist-client/pages/master/material-class.js +42 -0
  51. package/dist-client/pages/master/material-class.js.map +1 -0
  52. package/dist-client/pages/master/material-definition.d.ts +5 -0
  53. package/dist-client/pages/master/material-definition.js +14 -0
  54. package/dist-client/pages/master/material-definition.js.map +1 -0
  55. package/dist-client/pages/master/material-revision-fields.d.ts +2 -0
  56. package/dist-client/pages/master/material-revision-fields.js +43 -0
  57. package/dist-client/pages/master/material-revision-fields.js.map +1 -0
  58. package/dist-client/pages/master/operation-definition.d.ts +12 -0
  59. package/dist-client/pages/master/operation-definition.js +49 -0
  60. package/dist-client/pages/master/operation-definition.js.map +1 -0
  61. package/dist-client/pages/master/operational-location.d.ts +84 -0
  62. package/dist-client/pages/master/operational-location.js +432 -0
  63. package/dist-client/pages/master/operational-location.js.map +1 -0
  64. package/dist-client/pages/master/person.d.ts +12 -0
  65. package/dist-client/pages/master/person.js +41 -0
  66. package/dist-client/pages/master/person.js.map +1 -0
  67. package/dist-client/pages/master/personnel-class.d.ts +12 -0
  68. package/dist-client/pages/master/personnel-class.js +43 -0
  69. package/dist-client/pages/master/personnel-class.js.map +1 -0
  70. package/dist-client/pages/master/physical-asset-class.d.ts +12 -0
  71. package/dist-client/pages/master/physical-asset-class.js +40 -0
  72. package/dist-client/pages/master/physical-asset-class.js.map +1 -0
  73. package/dist-client/pages/master/physical-asset.d.ts +12 -0
  74. package/dist-client/pages/master/physical-asset.js +41 -0
  75. package/dist-client/pages/master/physical-asset.js.map +1 -0
  76. package/dist-client/pages/master/recipe-definition.d.ts +5 -0
  77. package/dist-client/pages/master/recipe-definition.js +14 -0
  78. package/dist-client/pages/master/recipe-definition.js.map +1 -0
  79. package/dist-client/pages/master/reference-targets.d.ts +42 -0
  80. package/dist-client/pages/master/reference-targets.js +82 -0
  81. package/dist-client/pages/master/reference-targets.js.map +1 -0
  82. package/dist-client/pages/master/revision-comparison.d.ts +49 -0
  83. package/dist-client/pages/master/revision-comparison.js +560 -0
  84. package/dist-client/pages/master/revision-comparison.js.map +1 -0
  85. package/dist-client/pages/master/revision-view.d.ts +34 -0
  86. package/dist-client/pages/master/revision-view.js +145 -0
  87. package/dist-client/pages/master/revision-view.js.map +1 -0
  88. package/dist-client/pages/master/revision-workspace.d.ts +50 -0
  89. package/dist-client/pages/master/revision-workspace.js +763 -0
  90. package/dist-client/pages/master/revision-workspace.js.map +1 -0
  91. package/dist-client/pages/master/route-definition.d.ts +19 -0
  92. package/dist-client/pages/master/route-definition.js +40 -0
  93. package/dist-client/pages/master/route-definition.js.map +1 -0
  94. package/dist-client/pages/master/stop-reason.d.ts +12 -0
  95. package/dist-client/pages/master/stop-reason.js +48 -0
  96. package/dist-client/pages/master/stop-reason.js.map +1 -0
  97. package/dist-client/pages/master/test-specification.d.ts +5 -0
  98. package/dist-client/pages/master/test-specification.js +14 -0
  99. package/dist-client/pages/master/test-specification.js.map +1 -0
  100. package/dist-client/pages/master-axes.d.ts +24 -0
  101. package/dist-client/pages/master-axes.js +39 -0
  102. package/dist-client/pages/master-axes.js.map +1 -0
  103. package/dist-client/route.d.ts +1 -0
  104. package/dist-client/route.js +81 -0
  105. package/dist-client/route.js.map +1 -0
  106. package/dist-client/tsconfig.tsbuildinfo +1 -0
  107. package/dist-server/index.d.ts +1 -0
  108. package/dist-server/index.js +19 -0
  109. package/dist-server/index.js.map +1 -0
  110. package/dist-server/service/ai-entry/master-entry-rules.d.ts +175 -0
  111. package/dist-server/service/ai-entry/master-entry-rules.js +302 -0
  112. package/dist-server/service/ai-entry/master-entry-rules.js.map +1 -0
  113. package/dist-server/service/ai-entry/master-entry-targets.d.ts +23 -0
  114. package/dist-server/service/ai-entry/master-entry-targets.js +293 -0
  115. package/dist-server/service/ai-entry/master-entry-targets.js.map +1 -0
  116. package/dist-server/service/approval-route.d.ts +37 -0
  117. package/dist-server/service/approval-route.js +34 -0
  118. package/dist-server/service/approval-route.js.map +1 -0
  119. package/dist-server/service/asset/asset-lifecycle.d.ts +106 -0
  120. package/dist-server/service/asset/asset-lifecycle.js +126 -0
  121. package/dist-server/service/asset/asset-lifecycle.js.map +1 -0
  122. package/dist-server/service/asset/asset-master-resolver.d.ts +53 -0
  123. package/dist-server/service/asset/asset-master-resolver.js +185 -0
  124. package/dist-server/service/asset/asset-master-resolver.js.map +1 -0
  125. package/dist-server/service/asset/asset-master.d.ts +21 -0
  126. package/dist-server/service/asset/asset-master.js +25 -0
  127. package/dist-server/service/asset/asset-master.js.map +1 -0
  128. package/dist-server/service/asset/asset-query.d.ts +16 -0
  129. package/dist-server/service/asset/asset-query.js +72 -0
  130. package/dist-server/service/asset/asset-query.js.map +1 -0
  131. package/dist-server/service/asset/index.d.ts +6 -0
  132. package/dist-server/service/asset/index.js +10 -0
  133. package/dist-server/service/asset/index.js.map +1 -0
  134. package/dist-server/service/asset/physical-asset-class.d.ts +34 -0
  135. package/dist-server/service/asset/physical-asset-class.js +104 -0
  136. package/dist-server/service/asset/physical-asset-class.js.map +1 -0
  137. package/dist-server/service/asset/physical-asset.d.ts +66 -0
  138. package/dist-server/service/asset/physical-asset.js +123 -0
  139. package/dist-server/service/asset/physical-asset.js.map +1 -0
  140. package/dist-server/service/assignment/applied-when.d.ts +24 -0
  141. package/dist-server/service/assignment/applied-when.js +16 -0
  142. package/dist-server/service/assignment/applied-when.js.map +1 -0
  143. package/dist-server/service/assignment/assignment-history.d.ts +92 -0
  144. package/dist-server/service/assignment/assignment-history.js +289 -0
  145. package/dist-server/service/assignment/assignment-history.js.map +1 -0
  146. package/dist-server/service/assignment/assignment-write.d.ts +42 -0
  147. package/dist-server/service/assignment/assignment-write.js +101 -0
  148. package/dist-server/service/assignment/assignment-write.js.map +1 -0
  149. package/dist-server/service/assignment/master-value-claim.d.ts +135 -0
  150. package/dist-server/service/assignment/master-value-claim.js +174 -0
  151. package/dist-server/service/assignment/master-value-claim.js.map +1 -0
  152. package/dist-server/service/equipment/equipment-class.d.ts +34 -0
  153. package/dist-server/service/equipment/equipment-class.js +104 -0
  154. package/dist-server/service/equipment/equipment-class.js.map +1 -0
  155. package/dist-server/service/equipment/equipment-master-resolver.d.ts +77 -0
  156. package/dist-server/service/equipment/equipment-master-resolver.js +266 -0
  157. package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -0
  158. package/dist-server/service/equipment/equipment-master.d.ts +30 -0
  159. package/dist-server/service/equipment/equipment-master.js +53 -0
  160. package/dist-server/service/equipment/equipment-master.js.map +1 -0
  161. package/dist-server/service/equipment/equipment-query.d.ts +16 -0
  162. package/dist-server/service/equipment/equipment-query.js +72 -0
  163. package/dist-server/service/equipment/equipment-query.js.map +1 -0
  164. package/dist-server/service/equipment/equipment.d.ts +71 -0
  165. package/dist-server/service/equipment/equipment.js +138 -0
  166. package/dist-server/service/equipment/equipment.js.map +1 -0
  167. package/dist-server/service/equipment/index.d.ts +8 -0
  168. package/dist-server/service/equipment/index.js +12 -0
  169. package/dist-server/service/equipment/index.js.map +1 -0
  170. package/dist-server/service/equipment/state-period-rules.d.ts +95 -0
  171. package/dist-server/service/equipment/state-period-rules.js +122 -0
  172. package/dist-server/service/equipment/state-period-rules.js.map +1 -0
  173. package/dist-server/service/equipment/stop-reason-query.d.ts +11 -0
  174. package/dist-server/service/equipment/stop-reason-query.js +39 -0
  175. package/dist-server/service/equipment/stop-reason-query.js.map +1 -0
  176. package/dist-server/service/equipment/stop-reason.d.ts +58 -0
  177. package/dist-server/service/equipment/stop-reason.js +114 -0
  178. package/dist-server/service/equipment/stop-reason.js.map +1 -0
  179. package/dist-server/service/index.d.ts +82 -0
  180. package/dist-server/service/index.js +145 -0
  181. package/dist-server/service/index.js.map +1 -0
  182. package/dist-server/service/location/index.d.ts +5 -0
  183. package/dist-server/service/location/index.js +9 -0
  184. package/dist-server/service/location/index.js.map +1 -0
  185. package/dist-server/service/location/location-master-resolver.d.ts +60 -0
  186. package/dist-server/service/location/location-master-resolver.js +313 -0
  187. package/dist-server/service/location/location-master-resolver.js.map +1 -0
  188. package/dist-server/service/location/location-master.d.ts +26 -0
  189. package/dist-server/service/location/location-master.js +28 -0
  190. package/dist-server/service/location/location-master.js.map +1 -0
  191. package/dist-server/service/location/location-query.d.ts +15 -0
  192. package/dist-server/service/location/location-query.js +56 -0
  193. package/dist-server/service/location/location-query.js.map +1 -0
  194. package/dist-server/service/location/operational-location.d.ts +116 -0
  195. package/dist-server/service/location/operational-location.js +157 -0
  196. package/dist-server/service/location/operational-location.js.map +1 -0
  197. package/dist-server/service/master-axis.d.ts +40 -0
  198. package/dist-server/service/master-axis.js +57 -0
  199. package/dist-server/service/master-axis.js.map +1 -0
  200. package/dist-server/service/master-change-approval/approval-input.d.ts +17 -0
  201. package/dist-server/service/master-change-approval/approval-input.js +35 -0
  202. package/dist-server/service/master-change-approval/approval-input.js.map +1 -0
  203. package/dist-server/service/master-change-approval/builtin-axes.d.ts +4 -0
  204. package/dist-server/service/master-change-approval/builtin-axes.js +96 -0
  205. package/dist-server/service/master-change-approval/builtin-axes.js.map +1 -0
  206. package/dist-server/service/master-change-approval/index.d.ts +14 -0
  207. package/dist-server/service/master-change-approval/index.js +37 -0
  208. package/dist-server/service/master-change-approval/index.js.map +1 -0
  209. package/dist-server/service/master-change-approval/master-change-axis.d.ts +54 -0
  210. package/dist-server/service/master-change-approval/master-change-axis.js +17 -0
  211. package/dist-server/service/master-change-approval/master-change-axis.js.map +1 -0
  212. package/dist-server/service/master-change-approval/master-change-flow.d.ts +65 -0
  213. package/dist-server/service/master-change-approval/master-change-flow.js +125 -0
  214. package/dist-server/service/master-change-approval/master-change-flow.js.map +1 -0
  215. package/dist-server/service/master-change-approval/master-change-resolver.d.ts +18 -0
  216. package/dist-server/service/master-change-approval/master-change-resolver.js +58 -0
  217. package/dist-server/service/master-change-approval/master-change-resolver.js.map +1 -0
  218. package/dist-server/service/master-change-policy.d.ts +122 -0
  219. package/dist-server/service/master-change-policy.js +304 -0
  220. package/dist-server/service/master-change-policy.js.map +1 -0
  221. package/dist-server/service/master-conformance-resolver.d.ts +34 -0
  222. package/dist-server/service/master-conformance-resolver.js +153 -0
  223. package/dist-server/service/master-conformance-resolver.js.map +1 -0
  224. package/dist-server/service/master-conformance.d.ts +80 -0
  225. package/dist-server/service/master-conformance.js +266 -0
  226. package/dist-server/service/master-conformance.js.map +1 -0
  227. package/dist-server/service/master-crud.d.ts +55 -0
  228. package/dist-server/service/master-crud.js +93 -0
  229. package/dist-server/service/master-crud.js.map +1 -0
  230. package/dist-server/service/master-list.d.ts +12 -0
  231. package/dist-server/service/master-list.js +30 -0
  232. package/dist-server/service/master-list.js.map +1 -0
  233. package/dist-server/service/master-page-query.d.ts +33 -0
  234. package/dist-server/service/master-page-query.js +55 -0
  235. package/dist-server/service/master-page-query.js.map +1 -0
  236. package/dist-server/service/master-page.d.ts +85 -0
  237. package/dist-server/service/master-page.js +104 -0
  238. package/dist-server/service/master-page.js.map +1 -0
  239. package/dist-server/service/material/index.d.ts +7 -0
  240. package/dist-server/service/material/index.js +12 -0
  241. package/dist-server/service/material/index.js.map +1 -0
  242. package/dist-server/service/material/material-axis-status.d.ts +8 -0
  243. package/dist-server/service/material/material-axis-status.js +19 -0
  244. package/dist-server/service/material/material-axis-status.js.map +1 -0
  245. package/dist-server/service/material/material-class.d.ts +34 -0
  246. package/dist-server/service/material/material-class.js +104 -0
  247. package/dist-server/service/material/material-class.js.map +1 -0
  248. package/dist-server/service/material/material-definition.d.ts +45 -0
  249. package/dist-server/service/material/material-definition.js +125 -0
  250. package/dist-server/service/material/material-definition.js.map +1 -0
  251. package/dist-server/service/material/material-effective-list.d.ts +39 -0
  252. package/dist-server/service/material/material-effective-list.js +54 -0
  253. package/dist-server/service/material/material-effective-list.js.map +1 -0
  254. package/dist-server/service/material/material-master-resolver.d.ts +106 -0
  255. package/dist-server/service/material/material-master-resolver.js +351 -0
  256. package/dist-server/service/material/material-master-resolver.js.map +1 -0
  257. package/dist-server/service/material/material-master.d.ts +9 -0
  258. package/dist-server/service/material/material-master.js +24 -0
  259. package/dist-server/service/material/material-master.js.map +1 -0
  260. package/dist-server/service/material/material-query.d.ts +16 -0
  261. package/dist-server/service/material/material-query.js +79 -0
  262. package/dist-server/service/material/material-query.js.map +1 -0
  263. package/dist-server/service/material/material-revision-content.d.ts +10 -0
  264. package/dist-server/service/material/material-revision-content.js +92 -0
  265. package/dist-server/service/material/material-revision-content.js.map +1 -0
  266. package/dist-server/service/material/material-revision-resolver.d.ts +60 -0
  267. package/dist-server/service/material/material-revision-resolver.js +96 -0
  268. package/dist-server/service/material/material-revision-resolver.js.map +1 -0
  269. package/dist-server/service/material/material-revision-service.d.ts +179 -0
  270. package/dist-server/service/material/material-revision-service.js +687 -0
  271. package/dist-server/service/material/material-revision-service.js.map +1 -0
  272. package/dist-server/service/material/material-revision.d.ts +86 -0
  273. package/dist-server/service/material/material-revision.js +339 -0
  274. package/dist-server/service/material/material-revision.js.map +1 -0
  275. package/dist-server/service/material/recipe-index.d.ts +23 -0
  276. package/dist-server/service/material/recipe-index.js +44 -0
  277. package/dist-server/service/material/recipe-index.js.map +1 -0
  278. package/dist-server/service/operation/index.d.ts +6 -0
  279. package/dist-server/service/operation/index.js +10 -0
  280. package/dist-server/service/operation/index.js.map +1 -0
  281. package/dist-server/service/operation/operation-definition.d.ts +52 -0
  282. package/dist-server/service/operation/operation-definition.js +143 -0
  283. package/dist-server/service/operation/operation-definition.js.map +1 -0
  284. package/dist-server/service/operation/operation-master-resolver.d.ts +52 -0
  285. package/dist-server/service/operation/operation-master-resolver.js +187 -0
  286. package/dist-server/service/operation/operation-master-resolver.js.map +1 -0
  287. package/dist-server/service/operation/operation-master.d.ts +21 -0
  288. package/dist-server/service/operation/operation-master.js +28 -0
  289. package/dist-server/service/operation/operation-master.js.map +1 -0
  290. package/dist-server/service/operation/operation-query.d.ts +15 -0
  291. package/dist-server/service/operation/operation-query.js +56 -0
  292. package/dist-server/service/operation/operation-query.js.map +1 -0
  293. package/dist-server/service/operation/operation-readiness-resolver.d.ts +39 -0
  294. package/dist-server/service/operation/operation-readiness-resolver.js +111 -0
  295. package/dist-server/service/operation/operation-readiness-resolver.js.map +1 -0
  296. package/dist-server/service/operation/operation-readiness.d.ts +34 -0
  297. package/dist-server/service/operation/operation-readiness.js +133 -0
  298. package/dist-server/service/operation/operation-readiness.js.map +1 -0
  299. package/dist-server/service/personnel/index.d.ts +6 -0
  300. package/dist-server/service/personnel/index.js +10 -0
  301. package/dist-server/service/personnel/index.js.map +1 -0
  302. package/dist-server/service/personnel/person.d.ts +51 -0
  303. package/dist-server/service/personnel/person.js +119 -0
  304. package/dist-server/service/personnel/person.js.map +1 -0
  305. package/dist-server/service/personnel/personnel-class-readiness.d.ts +22 -0
  306. package/dist-server/service/personnel/personnel-class-readiness.js +98 -0
  307. package/dist-server/service/personnel/personnel-class-readiness.js.map +1 -0
  308. package/dist-server/service/personnel/personnel-class.d.ts +54 -0
  309. package/dist-server/service/personnel/personnel-class.js +114 -0
  310. package/dist-server/service/personnel/personnel-class.js.map +1 -0
  311. package/dist-server/service/personnel/personnel-master-resolver.d.ts +53 -0
  312. package/dist-server/service/personnel/personnel-master-resolver.js +187 -0
  313. package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -0
  314. package/dist-server/service/personnel/personnel-master.d.ts +39 -0
  315. package/dist-server/service/personnel/personnel-master.js +34 -0
  316. package/dist-server/service/personnel/personnel-master.js.map +1 -0
  317. package/dist-server/service/personnel/personnel-query.d.ts +29 -0
  318. package/dist-server/service/personnel/personnel-query.js +79 -0
  319. package/dist-server/service/personnel/personnel-query.js.map +1 -0
  320. package/dist-server/service/personnel/qualification.d.ts +104 -0
  321. package/dist-server/service/personnel/qualification.js +147 -0
  322. package/dist-server/service/personnel/qualification.js.map +1 -0
  323. package/dist-server/service/quality/index.d.ts +4 -0
  324. package/dist-server/service/quality/index.js +8 -0
  325. package/dist-server/service/quality/index.js.map +1 -0
  326. package/dist-server/service/quality/nonconformance-cause-resolver.d.ts +12 -0
  327. package/dist-server/service/quality/nonconformance-cause-resolver.js +60 -0
  328. package/dist-server/service/quality/nonconformance-cause-resolver.js.map +1 -0
  329. package/dist-server/service/quality/nonconformance-cause.d.ts +20 -0
  330. package/dist-server/service/quality/nonconformance-cause.js +90 -0
  331. package/dist-server/service/quality/nonconformance-cause.js.map +1 -0
  332. package/dist-server/service/recipe/index.d.ts +10 -0
  333. package/dist-server/service/recipe/index.js +16 -0
  334. package/dist-server/service/recipe/index.js.map +1 -0
  335. package/dist-server/service/recipe/recipe-definition.d.ts +75 -0
  336. package/dist-server/service/recipe/recipe-definition.js +143 -0
  337. package/dist-server/service/recipe/recipe-definition.js.map +1 -0
  338. package/dist-server/service/recipe/recipe-effective-list.d.ts +49 -0
  339. package/dist-server/service/recipe/recipe-effective-list.js +96 -0
  340. package/dist-server/service/recipe/recipe-effective-list.js.map +1 -0
  341. package/dist-server/service/recipe/recipe-master-resolver.d.ts +28 -0
  342. package/dist-server/service/recipe/recipe-master-resolver.js +128 -0
  343. package/dist-server/service/recipe/recipe-master-resolver.js.map +1 -0
  344. package/dist-server/service/recipe/recipe-master.d.ts +37 -0
  345. package/dist-server/service/recipe/recipe-master.js +47 -0
  346. package/dist-server/service/recipe/recipe-master.js.map +1 -0
  347. package/dist-server/service/recipe/recipe-query.d.ts +21 -0
  348. package/dist-server/service/recipe/recipe-query.js +82 -0
  349. package/dist-server/service/recipe/recipe-query.js.map +1 -0
  350. package/dist-server/service/recipe/recipe-revision-content.d.ts +32 -0
  351. package/dist-server/service/recipe/recipe-revision-content.js +70 -0
  352. package/dist-server/service/recipe/recipe-revision-content.js.map +1 -0
  353. package/dist-server/service/recipe/recipe-revision-line.d.ts +30 -0
  354. package/dist-server/service/recipe/recipe-revision-line.js +95 -0
  355. package/dist-server/service/recipe/recipe-revision-line.js.map +1 -0
  356. package/dist-server/service/recipe/recipe-revision-resolver.d.ts +65 -0
  357. package/dist-server/service/recipe/recipe-revision-resolver.js +96 -0
  358. package/dist-server/service/recipe/recipe-revision-resolver.js.map +1 -0
  359. package/dist-server/service/recipe/recipe-revision-service.d.ts +183 -0
  360. package/dist-server/service/recipe/recipe-revision-service.js +754 -0
  361. package/dist-server/service/recipe/recipe-revision-service.js.map +1 -0
  362. package/dist-server/service/recipe/recipe-revision.d.ts +102 -0
  363. package/dist-server/service/recipe/recipe-revision.js +373 -0
  364. package/dist-server/service/recipe/recipe-revision.js.map +1 -0
  365. package/dist-server/service/recipe/route-definition.d.ts +51 -0
  366. package/dist-server/service/recipe/route-definition.js +114 -0
  367. package/dist-server/service/recipe/route-definition.js.map +1 -0
  368. package/dist-server/service/resource/class-lineage.d.ts +46 -0
  369. package/dist-server/service/resource/class-lineage.js +80 -0
  370. package/dist-server/service/resource/class-lineage.js.map +1 -0
  371. package/dist-server/service/resource/class-members.d.ts +36 -0
  372. package/dist-server/service/resource/class-members.js +59 -0
  373. package/dist-server/service/resource/class-members.js.map +1 -0
  374. package/dist-server/service/resource/referrers.d.ts +54 -0
  375. package/dist-server/service/resource/referrers.js +99 -0
  376. package/dist-server/service/resource/referrers.js.map +1 -0
  377. package/dist-server/service/resource/resource-class.d.ts +25 -0
  378. package/dist-server/service/resource/resource-class.js +29 -0
  379. package/dist-server/service/resource/resource-class.js.map +1 -0
  380. package/dist-server/service/revision-baseline.d.ts +71 -0
  381. package/dist-server/service/revision-baseline.js +87 -0
  382. package/dist-server/service/revision-baseline.js.map +1 -0
  383. package/dist-server/service/row-lock.d.ts +22 -0
  384. package/dist-server/service/row-lock.js +31 -0
  385. package/dist-server/service/row-lock.js.map +1 -0
  386. package/dist-server/service/status/axis-stamp.d.ts +16 -0
  387. package/dist-server/service/status/axis-stamp.js +22 -0
  388. package/dist-server/service/status/axis-stamp.js.map +1 -0
  389. package/dist-server/service/status/index.d.ts +3 -0
  390. package/dist-server/service/status/index.js +7 -0
  391. package/dist-server/service/status/index.js.map +1 -0
  392. package/dist-server/service/status/master-status.d.ts +38 -0
  393. package/dist-server/service/status/master-status.js +129 -0
  394. package/dist-server/service/status/master-status.js.map +1 -0
  395. package/dist-server/service/test-spec/criteria-check.d.ts +53 -0
  396. package/dist-server/service/test-spec/criteria-check.js +142 -0
  397. package/dist-server/service/test-spec/criteria-check.js.map +1 -0
  398. package/dist-server/service/test-spec/criteria-rows.d.ts +89 -0
  399. package/dist-server/service/test-spec/criteria-rows.js +139 -0
  400. package/dist-server/service/test-spec/criteria-rows.js.map +1 -0
  401. package/dist-server/service/test-spec/index.d.ts +6 -0
  402. package/dist-server/service/test-spec/index.js +11 -0
  403. package/dist-server/service/test-spec/index.js.map +1 -0
  404. package/dist-server/service/test-spec/test-spec-effective-list.d.ts +34 -0
  405. package/dist-server/service/test-spec/test-spec-effective-list.js +42 -0
  406. package/dist-server/service/test-spec/test-spec-effective-list.js.map +1 -0
  407. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +44 -0
  408. package/dist-server/service/test-spec/test-spec-master-resolver.js +144 -0
  409. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -0
  410. package/dist-server/service/test-spec/test-spec-master.d.ts +6 -0
  411. package/dist-server/service/test-spec/test-spec-master.js +18 -0
  412. package/dist-server/service/test-spec/test-spec-master.js.map +1 -0
  413. package/dist-server/service/test-spec/test-spec-query.d.ts +15 -0
  414. package/dist-server/service/test-spec/test-spec-query.js +61 -0
  415. package/dist-server/service/test-spec/test-spec-query.js.map +1 -0
  416. package/dist-server/service/test-spec/test-spec-revision-resolver.d.ts +59 -0
  417. package/dist-server/service/test-spec/test-spec-revision-resolver.js +96 -0
  418. package/dist-server/service/test-spec/test-spec-revision-resolver.js.map +1 -0
  419. package/dist-server/service/test-spec/test-spec-revision-service.d.ts +178 -0
  420. package/dist-server/service/test-spec/test-spec-revision-service.js +685 -0
  421. package/dist-server/service/test-spec/test-spec-revision-service.js.map +1 -0
  422. package/dist-server/service/test-spec/test-spec-revision.d.ts +86 -0
  423. package/dist-server/service/test-spec/test-spec-revision.js +334 -0
  424. package/dist-server/service/test-spec/test-spec-revision.js.map +1 -0
  425. package/dist-server/service/test-spec/test-specification.d.ts +47 -0
  426. package/dist-server/service/test-spec/test-specification.js +119 -0
  427. package/dist-server/service/test-spec/test-specification.js.map +1 -0
  428. package/dist-server/tsconfig.tsbuildinfo +1 -0
  429. package/package.json +4 -4
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PersonResolver = exports.PersonList = exports.PersonnelClassResolver = exports.PersonnelClassList = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const shell_1 = require("@things-factory/shell");
7
+ const type_graphql_2 = require("type-graphql");
8
+ const shell_2 = require("@things-factory/shell");
9
+ const master_crud_1 = require("../master-crud");
10
+ const master_axis_1 = require("../master-axis");
11
+ const master_list_1 = require("../master-list");
12
+ const class_members_1 = require("../resource/class-members");
13
+ const personnel_class_1 = require("./personnel-class");
14
+ const person_1 = require("./person");
15
+ /**
16
+ * 인원 축을 채우고 고친다.
17
+ *
18
+ * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────
19
+ * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의
20
+ * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —
21
+ * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
22
+ *
23
+ * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.
24
+ */
25
+ let PersonnelClassList = class PersonnelClassList {
26
+ };
27
+ exports.PersonnelClassList = PersonnelClassList;
28
+ tslib_1.__decorate([
29
+ (0, type_graphql_2.Field)(type => [personnel_class_1.PersonnelClass]),
30
+ tslib_1.__metadata("design:type", Array)
31
+ ], PersonnelClassList.prototype, "items", void 0);
32
+ tslib_1.__decorate([
33
+ (0, type_graphql_2.Field)(type => type_graphql_2.Int),
34
+ tslib_1.__metadata("design:type", Number)
35
+ ], PersonnelClassList.prototype, "total", void 0);
36
+ exports.PersonnelClassList = PersonnelClassList = tslib_1.__decorate([
37
+ (0, type_graphql_2.ObjectType)({ description: 'A page of personnel classes' })
38
+ ], PersonnelClassList);
39
+ /**
40
+ * **이 등급에 무엇이 드나** — 들어오는 관계.
41
+ *
42
+ * 등급을 만들어 놓고 아무도 안 들어 있는 일이 실제로 있었다. 화면에는 등급 이름만 있어서 그 사실이
43
+ * 안 보였다. 없앨 때 무엇이 딸려 자격을 잃는지도 알 수 없었다.
44
+ *
45
+ * 세는 방식과 상한은 `class-members.ts` 머리말에 적었다 — 등급 넷이 같은 함수를 쓴다.
46
+ */
47
+ function personnelClassMembersOf(context) {
48
+ const state = context.state;
49
+ state.personnelClassMembers = state.personnelClassMembers || (0, class_members_1.scanClassMembers)(person_1.Person, 'personnelClassIds', state.domain);
50
+ return state.personnelClassMembers;
51
+ }
52
+ let PersonnelClassResolver = class PersonnelClassResolver {
53
+ async personnelClasses(params, context) {
54
+ const { domain } = context.state;
55
+ const { items, total } = await (0, master_list_1.listMaster)('personnelClass', params, domain);
56
+ return { items: items, total };
57
+ }
58
+ /**
59
+ * 이 등급을 가진 사람들
60
+ *
61
+ * 아무도 안 들면 빈 목록이다. 다만 그것이 「없다」인지 「다 못 봤다」인지는 `memberScanCapped`
62
+ * 가 말한다 — 조용히 자르면 고쳐야 할 선언과 멀쩡한 등급이 같아 보인다.
63
+ */
64
+ async members(klass, context) {
65
+ return (await personnelClassMembersOf(context)).members.get(klass.name) ?? [];
66
+ }
67
+ /** 소속을 다 보지 못했나. */
68
+ async memberScanCapped(klass, context) {
69
+ return (await personnelClassMembersOf(context)).capped;
70
+ }
71
+ /**
72
+ * 그리드가 보낸 변경을 한 번에 적용한다.
73
+ *
74
+ * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
75
+ * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
76
+ * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
77
+ */
78
+ async updateMultiplePersonnelClass(patches, context) {
79
+ const { domain, user, tx } = context.state;
80
+ const axis = (0, master_axis_1.masterAxisOf)('personnelClass');
81
+ const saved = await (0, master_crud_1.saveMasterPatches)(tx, domain, axis.entity, patches, user, {
82
+ hasEffectivePeriod: axis.hasEffectivePeriod
83
+ });
84
+ return saved;
85
+ }
86
+ };
87
+ exports.PersonnelClassResolver = PersonnelClassResolver;
88
+ tslib_1.__decorate([
89
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
90
+ (0, type_graphql_2.Query)(returns => PersonnelClassList, { description: 'To fetch personnel classes' }),
91
+ tslib_1.__param(0, (0, type_graphql_2.Args)(type => shell_2.ListParam)),
92
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
93
+ tslib_1.__metadata("design:type", Function),
94
+ tslib_1.__metadata("design:paramtypes", [shell_2.ListParam, Object]),
95
+ tslib_1.__metadata("design:returntype", Promise)
96
+ ], PersonnelClassResolver.prototype, "personnelClasses", null);
97
+ tslib_1.__decorate([
98
+ (0, type_graphql_2.FieldResolver)(type => [String], { description: 'People holding this class' }),
99
+ tslib_1.__param(0, (0, type_graphql_2.Root)()),
100
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
101
+ tslib_1.__metadata("design:type", Function),
102
+ tslib_1.__metadata("design:paramtypes", [personnel_class_1.PersonnelClass, Object]),
103
+ tslib_1.__metadata("design:returntype", Promise)
104
+ ], PersonnelClassResolver.prototype, "members", null);
105
+ tslib_1.__decorate([
106
+ (0, type_graphql_2.FieldResolver)(type => Boolean, { description: 'True when members were too many to scan fully' }),
107
+ tslib_1.__param(0, (0, type_graphql_2.Root)()),
108
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
109
+ tslib_1.__metadata("design:type", Function),
110
+ tslib_1.__metadata("design:paramtypes", [personnel_class_1.PersonnelClass, Object]),
111
+ tslib_1.__metadata("design:returntype", Promise)
112
+ ], PersonnelClassResolver.prototype, "memberScanCapped", null);
113
+ tslib_1.__decorate([
114
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
115
+ (0, type_graphql_2.Directive)('@transaction'),
116
+ (0, type_graphql_2.Mutation)(returns => [personnel_class_1.PersonnelClass], { description: 'To create, change or retire personnel classes' }),
117
+ tslib_1.__param(0, (0, type_graphql_2.Arg)('patches', type => [shell_2.ScalarObject])),
118
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
119
+ tslib_1.__metadata("design:type", Function),
120
+ tslib_1.__metadata("design:paramtypes", [Array, Object]),
121
+ tslib_1.__metadata("design:returntype", Promise)
122
+ ], PersonnelClassResolver.prototype, "updateMultiplePersonnelClass", null);
123
+ exports.PersonnelClassResolver = PersonnelClassResolver = tslib_1.__decorate([
124
+ (0, type_graphql_2.Resolver)(personnel_class_1.PersonnelClass),
125
+ (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
126
+ ], PersonnelClassResolver);
127
+ let PersonList = class PersonList {
128
+ };
129
+ exports.PersonList = PersonList;
130
+ tslib_1.__decorate([
131
+ (0, type_graphql_2.Field)(type => [person_1.Person]),
132
+ tslib_1.__metadata("design:type", Array)
133
+ ], PersonList.prototype, "items", void 0);
134
+ tslib_1.__decorate([
135
+ (0, type_graphql_2.Field)(type => type_graphql_2.Int),
136
+ tslib_1.__metadata("design:type", Number)
137
+ ], PersonList.prototype, "total", void 0);
138
+ exports.PersonList = PersonList = tslib_1.__decorate([
139
+ (0, type_graphql_2.ObjectType)({ description: 'A page of people' })
140
+ ], PersonList);
141
+ let PersonResolver = class PersonResolver {
142
+ async persons(params, context) {
143
+ const { domain } = context.state;
144
+ const { items, total } = await (0, master_list_1.listMaster)('person', params, domain);
145
+ return { items: items, total };
146
+ }
147
+ /**
148
+ * 그리드가 보낸 변경을 한 번에 적용한다.
149
+ *
150
+ * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
151
+ * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
152
+ * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
153
+ */
154
+ async updateMultiplePerson(patches, context) {
155
+ const { domain, user, tx } = context.state;
156
+ const axis = (0, master_axis_1.masterAxisOf)('person');
157
+ const saved = await (0, master_crud_1.saveMasterPatches)(tx, domain, axis.entity, patches, user, {
158
+ hasEffectivePeriod: axis.hasEffectivePeriod
159
+ });
160
+ return saved;
161
+ }
162
+ };
163
+ exports.PersonResolver = PersonResolver;
164
+ tslib_1.__decorate([
165
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
166
+ (0, type_graphql_2.Query)(returns => PersonList, { description: 'To fetch people' }),
167
+ tslib_1.__param(0, (0, type_graphql_2.Args)(type => shell_2.ListParam)),
168
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
169
+ tslib_1.__metadata("design:type", Function),
170
+ tslib_1.__metadata("design:paramtypes", [shell_2.ListParam, Object]),
171
+ tslib_1.__metadata("design:returntype", Promise)
172
+ ], PersonResolver.prototype, "persons", null);
173
+ tslib_1.__decorate([
174
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
175
+ (0, type_graphql_2.Directive)('@transaction'),
176
+ (0, type_graphql_2.Mutation)(returns => [person_1.Person], { description: 'To create, change or retire people' }),
177
+ tslib_1.__param(0, (0, type_graphql_2.Arg)('patches', type => [shell_2.ScalarObject])),
178
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
179
+ tslib_1.__metadata("design:type", Function),
180
+ tslib_1.__metadata("design:paramtypes", [Array, Object]),
181
+ tslib_1.__metadata("design:returntype", Promise)
182
+ ], PersonResolver.prototype, "updateMultiplePerson", null);
183
+ exports.PersonResolver = PersonResolver = tslib_1.__decorate([
184
+ (0, type_graphql_2.Resolver)(person_1.Person),
185
+ (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
186
+ ], PersonResolver);
187
+ //# sourceMappingURL=personnel-master-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personnel-master-resolver.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-master-resolver.ts"],"names":[],"mappings":";;;;AAAA,+CAA4C;AAC5C,iDAAqD;AACrD,+CAAgI;AAEhI,iDAAuE;AAEvE,gDAA+D;AAC/D,gDAA6C;AAC7C,gDAA2C;AAC3C,6DAA0E;AAC1E,uDAAkD;AAClD,qCAAiC;AAEjC;;;;;;;;;GASG;AAGI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAM9B,CAAA;AANY,gDAAkB;AAE7B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,gCAAc,CAAC,CAAC;;iDACT;AAGvB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;iDACN;6BALF,kBAAkB;IAD9B,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC;GAC9C,kBAAkB,CAM9B;AAED;;;;;;;GAOG;AACH,SAAS,uBAAuB,CAAC,OAAwB;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAA0E,CAAA;IAEhG,KAAK,CAAC,qBAAqB,GAAG,KAAK,CAAC,qBAAqB,IAAI,IAAA,gCAAgB,EAAC,eAAM,EAAE,mBAAmB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAExH,OAAO,KAAK,CAAC,qBAAqB,CAAA;AACpC,CAAC;AAIM,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAG3B,AAAN,KAAK,CAAC,gBAAgB,CAA0B,MAAiB,EAAS,OAAwB;QAChG,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,wBAAU,EAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAE3E,OAAO,EAAE,KAAK,EAAE,KAAyB,EAAE,KAAK,EAAE,CAAA;IACpD,CAAC;IAED;;;;;OAKG;IAEG,AAAN,KAAK,CAAC,OAAO,CAAS,KAAqB,EAAS,OAAwB;QAC1E,OAAO,CAAC,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IAC/E,CAAC;IAED,oBAAoB;IAEd,AAAN,KAAK,CAAC,gBAAgB,CAAS,KAAqB,EAAS,OAAwB;QACnF,OAAO,CAAC,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;IACxD,CAAC;IAED;;;;;;OAMG;IAIG,AAAN,KAAK,CAAC,4BAA4B,CACQ,OAAsB,EACvD,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,IAAI,GAAG,IAAA,0BAAY,EAAC,gBAAgB,CAAC,CAAA;QAE3C,MAAM,KAAK,GAAG,MAAM,IAAA,+BAAiB,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YAC5E,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C,CAAC,CAAA;QAEF,OAAO,KAAyB,CAAA;IAClC,CAAC;CACF,CAAA;AAlDY,wDAAsB;AAG3B;IAFL,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,kBAAkB,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;IAC5D,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;8DAKhE;AASK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;IAC/D,mBAAA,IAAA,mBAAI,GAAE,CAAA;IAAyB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAtB,gCAAc;;qDAE1C;AAIK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,+CAA+C,EAAE,CAAC;IACzE,mBAAA,IAAA,mBAAI,GAAE,CAAA;IAAyB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAtB,gCAAc;;8DAEnD;AAYK;IAHL,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,gCAAc,CAAC,EAAE,EAAE,WAAW,EAAE,+CAA+C,EAAE,CAAC;IAErG,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,CAAC,CAAA;IACtC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;0EAUP;iCAjDU,sBAAsB;IAFlC,IAAA,uBAAQ,EAAC,gCAAc,CAAC;IACxB,IAAA,4BAAa,EAAC,qBAAa,CAAC;GAChB,sBAAsB,CAkDlC;AAGM,IAAM,UAAU,GAAhB,MAAM,UAAU;CAMtB,CAAA;AANY,gCAAU;AAErB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,eAAM,CAAC,CAAC;;yCACT;AAGf;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;yCACN;qBALF,UAAU;IADtB,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;GACnC,UAAU,CAMtB;AAIM,IAAM,cAAc,GAApB,MAAM,cAAc;IAGnB,AAAN,KAAK,CAAC,OAAO,CAA0B,MAAiB,EAAS,OAAwB;QACvF,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,wBAAU,EAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAEnE,OAAO,EAAE,KAAK,EAAE,KAAiB,EAAE,KAAK,EAAE,CAAA;IAC5C,CAAC;IAED;;;;;;OAMG;IAIG,AAAN,KAAK,CAAC,oBAAoB,CACgB,OAAsB,EACvD,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,IAAI,GAAG,IAAA,0BAAY,EAAC,QAAQ,CAAC,CAAA;QAEnC,MAAM,KAAK,GAAG,MAAM,IAAA,+BAAiB,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YAC5E,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C,CAAC,CAAA;QAEF,OAAO,KAAiB,CAAA;IAC1B,CAAC;CACF,CAAA;AAjCY,wCAAc;AAGnB;IAFL,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;IAClD,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;6CAKvD;AAYK;IAHL,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,eAAM,CAAC,EAAE,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC;IAElF,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,CAAC,CAAA;IACtC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;0DAUP;yBAhCU,cAAc;IAF1B,IAAA,uBAAQ,EAAC,eAAM,CAAC;IAChB,IAAA,4BAAa,EAAC,qBAAa,CAAC;GAChB,cAAc,CAiC1B","sourcesContent":["import { UseMiddleware } from 'type-graphql'\nimport { SpeakRefusals } from '@things-factory/shell'\nimport { FieldResolver, Root, Args, Arg, Ctx, Directive, Int, Mutation, ObjectType, Field, Query, Resolver } from 'type-graphql'\n\nimport { Domain, ListParam, ScalarObject } from '@things-factory/shell'\n\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { ClassMembers, scanClassMembers } from '../resource/class-members'\nimport { PersonnelClass } from './personnel-class'\nimport { Person } from './person'\n\n/**\n * 인원 축을 채우고 고친다.\n *\n * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────\n * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의\n * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —\n * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.\n *\n * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.\n */\n\n@ObjectType({ description: 'A page of personnel classes' })\nexport class PersonnelClassList {\n @Field(type => [PersonnelClass])\n items: PersonnelClass[]\n\n @Field(type => Int)\n total: number\n}\n\n/**\n * **이 등급에 무엇이 드나** — 들어오는 관계.\n *\n * 등급을 만들어 놓고 아무도 안 들어 있는 일이 실제로 있었다. 화면에는 등급 이름만 있어서 그 사실이\n * 안 보였다. 없앨 때 무엇이 딸려 자격을 잃는지도 알 수 없었다.\n *\n * 세는 방식과 상한은 `class-members.ts` 머리말에 적었다 — 등급 넷이 같은 함수를 쓴다.\n */\nfunction personnelClassMembersOf(context: ResolverContext): Promise<ClassMembers> {\n const state = context.state as { domain: Domain; personnelClassMembers?: Promise<ClassMembers> }\n\n state.personnelClassMembers = state.personnelClassMembers || scanClassMembers(Person, 'personnelClassIds', state.domain)\n\n return state.personnelClassMembers\n}\n\n@Resolver(PersonnelClass)\n@UseMiddleware(SpeakRefusals)\nexport class PersonnelClassResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => PersonnelClassList, { description: 'To fetch personnel classes' })\n async personnelClasses(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<PersonnelClassList> {\n const { domain } = context.state\n const { items, total } = await listMaster('personnelClass', params, domain)\n\n return { items: items as PersonnelClass[], total }\n }\n\n /**\n * 이 등급을 가진 사람들\n *\n * 아무도 안 들면 빈 목록이다. 다만 그것이 「없다」인지 「다 못 봤다」인지는 `memberScanCapped`\n * 가 말한다 — 조용히 자르면 고쳐야 할 선언과 멀쩡한 등급이 같아 보인다.\n */\n @FieldResolver(type => [String], { description: 'People holding this class' })\n async members(@Root() klass: PersonnelClass, @Ctx() context: ResolverContext): Promise<string[]> {\n return (await personnelClassMembersOf(context)).members.get(klass.name) ?? []\n }\n\n /** 소속을 다 보지 못했나. */\n @FieldResolver(type => Boolean, { description: 'True when members were too many to scan fully' })\n async memberScanCapped(@Root() klass: PersonnelClass, @Ctx() context: ResolverContext): Promise<boolean> {\n return (await personnelClassMembersOf(context)).capped\n }\n\n /**\n * 그리드가 보낸 변경을 한 번에 적용한다.\n *\n * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을\n * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는\n * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [PersonnelClass], { description: 'To create, change or retire personnel classes' })\n async updateMultiplePersonnelClass(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<PersonnelClass[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('personnelClass')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as PersonnelClass[]\n }\n}\n\n@ObjectType({ description: 'A page of people' })\nexport class PersonList {\n @Field(type => [Person])\n items: Person[]\n\n @Field(type => Int)\n total: number\n}\n\n@Resolver(Person)\n@UseMiddleware(SpeakRefusals)\nexport class PersonResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => PersonList, { description: 'To fetch people' })\n async persons(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<PersonList> {\n const { domain } = context.state\n const { items, total } = await listMaster('person', params, domain)\n\n return { items: items as Person[], total }\n }\n\n /**\n * 그리드가 보낸 변경을 한 번에 적용한다.\n *\n * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을\n * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는\n * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [Person], { description: 'To create, change or retire people' })\n async updateMultiplePerson(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Person[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('person')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as Person[]\n }\n}\n"]}
@@ -0,0 +1,39 @@
1
+ import type { ResourceClassDef } from '@operato/ops-contract';
2
+ import type { Person } from './person';
3
+ import type { PersonnelClass } from './personnel-class';
4
+ /**
5
+ * MES 의 인원 마스터를 **트윈이 받는 모양**으로 옮긴다.
6
+ *
7
+ * ── 여기가 어긋남이 생기는 자리다 ───────────────────────────────────────────
8
+ * 필드 이름을 계약과 같게 지었으므로 옮기는 일은 거의 없다. 그래도 옮기는 함수를 따로 두는 이유는,
9
+ * **어긋난다면 반드시 여기서 어긋나기** 때문이다. 한 곳에 모아 두면 테스트가 그 한 곳을 본다.
10
+ *
11
+ * 계약 층의 타입(`ResourceClassDef`)을 그대로 쓴다. 우리가 다시 선언하면 그것이 두 번째 어휘가 된다.
12
+ */
13
+ /** 트윈 `ReferenceMaster.persons` 의 한 항목. 계약에 이름 붙은 타입이 없어 여기서 모양만 적는다. */
14
+ export interface PersonEntry {
15
+ id: string;
16
+ personnelClassIds?: string[];
17
+ homeLocation?: string;
18
+ workCalendar?: unknown[];
19
+ properties?: unknown[];
20
+ testSpecificationIds?: string[];
21
+ testResults?: unknown[];
22
+ effectiveStart?: string;
23
+ effectiveEnd?: string;
24
+ }
25
+ export declare function toPersonEntry(person: Person): PersonEntry;
26
+ /**
27
+ * 인원 축 전체 — 트윈이 당겨 갈 조각.
28
+ *
29
+ * ── 왜 구조는 밀지 않고 당겨 가나 ───────────────────────────────────────────
30
+ * 사실(생산·이동·검사)은 한 건씩 밀어야 실시간이 된다. 구조는 다르다. 사람이 자기 등급을 가리키므로
31
+ * **서로 맞아야** 하고, 한 건씩 밀면 사람이 먼저 도착하고 등급이 나중에 오는 순간이 생긴다.
32
+ * 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.
33
+ *
34
+ * 그래서 구조는 **바뀌었다는 것만 알리고 트윈이 이 조각을 통째로 당겨 간다.**
35
+ */
36
+ export declare function personnelMaster(classes: PersonnelClass[], persons: Person[]): {
37
+ personnelClasses: ResourceClassDef[];
38
+ persons: PersonEntry[];
39
+ };
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toPersonEntry = toPersonEntry;
4
+ exports.personnelMaster = personnelMaster;
5
+ const resource_class_1 = require("../resource/resource-class");
6
+ function toPersonEntry(person) {
7
+ const out = { id: person.name };
8
+ (0, resource_class_1.put)(out, 'personnelClassIds', person.personnelClassIds);
9
+ (0, resource_class_1.put)(out, 'homeLocationId', person.homeLocation);
10
+ (0, resource_class_1.put)(out, 'workCalendar', person.workCalendar);
11
+ (0, resource_class_1.put)(out, 'properties', person.properties);
12
+ (0, resource_class_1.put)(out, 'testSpecificationIds', person.testSpecificationIds);
13
+ (0, resource_class_1.put)(out, 'testResults', person.testResults);
14
+ (0, resource_class_1.put)(out, 'effectiveStart', (0, resource_class_1.iso)(person.effectiveStart));
15
+ (0, resource_class_1.put)(out, 'effectiveEnd', (0, resource_class_1.iso)(person.effectiveEnd));
16
+ return out;
17
+ }
18
+ /**
19
+ * 인원 축 전체 — 트윈이 당겨 갈 조각.
20
+ *
21
+ * ── 왜 구조는 밀지 않고 당겨 가나 ───────────────────────────────────────────
22
+ * 사실(생산·이동·검사)은 한 건씩 밀어야 실시간이 된다. 구조는 다르다. 사람이 자기 등급을 가리키므로
23
+ * **서로 맞아야** 하고, 한 건씩 밀면 사람이 먼저 도착하고 등급이 나중에 오는 순간이 생긴다.
24
+ * 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.
25
+ *
26
+ * 그래서 구조는 **바뀌었다는 것만 알리고 트윈이 이 조각을 통째로 당겨 간다.**
27
+ */
28
+ function personnelMaster(classes, persons) {
29
+ return {
30
+ personnelClasses: classes.map(resource_class_1.toResourceClassDef),
31
+ persons: persons.map(toPersonEntry)
32
+ };
33
+ }
34
+ //# sourceMappingURL=personnel-master.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personnel-master.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-master.ts"],"names":[],"mappings":";;AA6BA,sCAaC;AAYD,0CAQC;AA5DD,+DAAyE;AA2BzE,SAAgB,aAAa,CAAC,MAAc;IAC1C,MAAM,GAAG,GAA4B,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;IAExD,IAAA,oBAAG,EAAC,GAAG,EAAE,mBAAmB,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAA;IACvD,IAAA,oBAAG,EAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;IAC/C,IAAA,oBAAG,EAAC,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;IAC7C,IAAA,oBAAG,EAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IACzC,IAAA,oBAAG,EAAC,GAAG,EAAE,sBAAsB,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAA;IAC7D,IAAA,oBAAG,EAAC,GAAG,EAAE,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IAC3C,IAAA,oBAAG,EAAC,GAAG,EAAE,gBAAgB,EAAE,IAAA,oBAAG,EAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;IACtD,IAAA,oBAAG,EAAC,GAAG,EAAE,cAAc,EAAE,IAAA,oBAAG,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;IAElD,OAAO,GAA6B,CAAA;AACtC,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,eAAe,CAC7B,OAAyB,EACzB,OAAiB;IAEjB,OAAO;QACL,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,mCAAkB,CAAC;QACjD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;KACpC,CAAA;AACH,CAAC","sourcesContent":["import type { ResourceClassDef } from '@operato/ops-contract'\n\nimport { iso, put, toResourceClassDef } from '../resource/resource-class'\nimport type { Person } from './person'\nimport type { PersonnelClass } from './personnel-class'\n\n/**\n * MES 의 인원 마스터를 **트윈이 받는 모양**으로 옮긴다.\n *\n * ── 여기가 어긋남이 생기는 자리다 ───────────────────────────────────────────\n * 필드 이름을 계약과 같게 지었으므로 옮기는 일은 거의 없다. 그래도 옮기는 함수를 따로 두는 이유는,\n * **어긋난다면 반드시 여기서 어긋나기** 때문이다. 한 곳에 모아 두면 테스트가 그 한 곳을 본다.\n *\n * 계약 층의 타입(`ResourceClassDef`)을 그대로 쓴다. 우리가 다시 선언하면 그것이 두 번째 어휘가 된다.\n */\n\n/** 트윈 `ReferenceMaster.persons` 의 한 항목. 계약에 이름 붙은 타입이 없어 여기서 모양만 적는다. */\nexport interface PersonEntry {\n id: string\n personnelClassIds?: string[]\n homeLocation?: string\n workCalendar?: unknown[]\n properties?: unknown[]\n testSpecificationIds?: string[]\n testResults?: unknown[]\n effectiveStart?: string\n effectiveEnd?: string\n}\n\nexport function toPersonEntry(person: Person): PersonEntry {\n const out: Record<string, unknown> = { id: person.name }\n\n put(out, 'personnelClassIds', person.personnelClassIds)\n put(out, 'homeLocationId', person.homeLocation)\n put(out, 'workCalendar', person.workCalendar)\n put(out, 'properties', person.properties)\n put(out, 'testSpecificationIds', person.testSpecificationIds)\n put(out, 'testResults', person.testResults)\n put(out, 'effectiveStart', iso(person.effectiveStart))\n put(out, 'effectiveEnd', iso(person.effectiveEnd))\n\n return out as unknown as PersonEntry\n}\n\n/**\n * 인원 축 전체 — 트윈이 당겨 갈 조각.\n *\n * ── 왜 구조는 밀지 않고 당겨 가나 ───────────────────────────────────────────\n * 사실(생산·이동·검사)은 한 건씩 밀어야 실시간이 된다. 구조는 다르다. 사람이 자기 등급을 가리키므로\n * **서로 맞아야** 하고, 한 건씩 밀면 사람이 먼저 도착하고 등급이 나중에 오는 순간이 생긴다.\n * 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.\n *\n * 그래서 구조는 **바뀌었다는 것만 알리고 트윈이 이 조각을 통째로 당겨 간다.**\n */\nexport function personnelMaster(\n classes: PersonnelClass[],\n persons: Person[]\n): { personnelClasses: ResourceClassDef[]; persons: PersonEntry[] } {\n return {\n personnelClasses: classes.map(toResourceClassDef),\n persons: persons.map(toPersonEntry)\n }\n}\n"]}
@@ -0,0 +1,29 @@
1
+ export declare class PersonnelMaster {
2
+ /**
3
+ * 트윈이 그대로 받는 모양이라 JSON 문자열로 낸다.
4
+ *
5
+ * 계약 층의 타입을 GraphQL 타입으로 다시 선언하지 않는 이유는, 그렇게 하면 같은 모양이 두 곳에
6
+ * 적히고 한쪽만 고쳐지기 때문이다. 받는 쪽은 이 문자열을 계약 층의 타입으로 읽는다.
7
+ */
8
+ personnelClasses: string;
9
+ persons: string;
10
+ /**
11
+ * 더 있나 — **이 값을 안 보고 쓰면 조용히 잘린 마스터로 트윈을 세우게 된다.**
12
+ *
13
+ * 거짓이 될 때까지 `next` 를 `after` 로 넘겨 이어 받는다.
14
+ */
15
+ hasMore: boolean;
16
+ /** 이어 받을 자리. 더 없으면 없다. */
17
+ next?: string;
18
+ }
19
+ export declare class PersonnelQuery {
20
+ /**
21
+ * 인원 축 전체를 한 번에 낸다 — 트윈이 당겨 가는 자리.
22
+ *
23
+ * 사람이 자기 등급을 가리키므로 **둘이 서로 맞아야 한다.** 한 건씩 밀면 사람이 먼저 도착하고 등급이
24
+ * 나중에 오는 순간이 생기고, 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.
25
+ *
26
+ * 자르지 않는다. 인원 마스터는 현장 하나에서 수천을 넘지 않고, 잘라서 보내면 등급과 사람이 나뉜다.
27
+ */
28
+ personnelMaster(after: string | undefined, limit: number | undefined, context: ResolverContext): Promise<PersonnelMaster>;
29
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PersonnelQuery = exports.PersonnelMaster = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const shell_1 = require("@things-factory/shell");
7
+ const master_page_query_1 = require("../master-page-query");
8
+ const person_1 = require("./person");
9
+ const personnel_class_1 = require("./personnel-class");
10
+ const personnel_master_1 = require("./personnel-master");
11
+ let PersonnelMaster = class PersonnelMaster {
12
+ };
13
+ exports.PersonnelMaster = PersonnelMaster;
14
+ tslib_1.__decorate([
15
+ (0, type_graphql_1.Field)(type => String, { description: 'ResourceClassDef[] as JSON text' }),
16
+ tslib_1.__metadata("design:type", String)
17
+ ], PersonnelMaster.prototype, "personnelClasses", void 0);
18
+ tslib_1.__decorate([
19
+ (0, type_graphql_1.Field)(type => String, { description: 'ReferenceMaster persons[] as JSON text' }),
20
+ tslib_1.__metadata("design:type", String)
21
+ ], PersonnelMaster.prototype, "persons", void 0);
22
+ tslib_1.__decorate([
23
+ (0, type_graphql_1.Field)({ description: 'true when more rows remain — keep pulling with next as after' }),
24
+ tslib_1.__metadata("design:type", Boolean)
25
+ ], PersonnelMaster.prototype, "hasMore", void 0);
26
+ tslib_1.__decorate([
27
+ (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'cursor for the next page — the last name in this page' }),
28
+ tslib_1.__metadata("design:type", String)
29
+ ], PersonnelMaster.prototype, "next", void 0);
30
+ exports.PersonnelMaster = PersonnelMaster = tslib_1.__decorate([
31
+ (0, type_graphql_1.ObjectType)({ description: 'Personnel master as the twin receives it' })
32
+ ], PersonnelMaster);
33
+ let PersonnelQuery = class PersonnelQuery {
34
+ /**
35
+ * 인원 축 전체를 한 번에 낸다 — 트윈이 당겨 가는 자리.
36
+ *
37
+ * 사람이 자기 등급을 가리키므로 **둘이 서로 맞아야 한다.** 한 건씩 밀면 사람이 먼저 도착하고 등급이
38
+ * 나중에 오는 순간이 생기고, 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.
39
+ *
40
+ * 자르지 않는다. 인원 마스터는 현장 하나에서 수천을 넘지 않고, 잘라서 보내면 등급과 사람이 나뉜다.
41
+ */
42
+ async personnelMaster(after, limit, context) {
43
+ const { domain } = context.state;
44
+ const request = { after, limit };
45
+ /*
46
+ * **등급은 통째로, 구성원만 나눈다.** 구성원이 자기 등급을 이름으로 가리키므로 둘을 함께 나누면
47
+ * 구성원이 먼저 도착하고 등급이 나중에 오는 순간이 생긴다 — 그 순간 받는 쪽은 없는 등급을
48
+ * 가리키는 구성원을 갖는다. 등급은 수십 단위라 매 쪽에 실어도 크지 않다.
49
+ */
50
+ const [classes, page] = await Promise.all([
51
+ (0, shell_1.getRepository)(personnel_class_1.PersonnelClass).find({ where: { domain: { id: domain.id } }, order: { name: 'ASC' } }),
52
+ (0, master_page_query_1.pullPage)(person_1.Person, domain, request)
53
+ ]);
54
+ /* 통째로 달라고 했는데 한도를 넘으면 **자르지 않고 거절한다**(§`master-page`). */
55
+ (0, master_page_query_1.refuseIfTooLarge)('인원', request, page);
56
+ const persons = page.rows;
57
+ const master = (0, personnel_master_1.personnelMaster)(classes, persons);
58
+ return {
59
+ personnelClasses: JSON.stringify(master.personnelClasses),
60
+ persons: JSON.stringify(master.persons),
61
+ hasMore: page.hasMore,
62
+ ...(page.next ? { next: page.next } : {})
63
+ };
64
+ }
65
+ };
66
+ exports.PersonnelQuery = PersonnelQuery;
67
+ tslib_1.__decorate([
68
+ (0, type_graphql_1.Query)(returns => PersonnelMaster, { description: 'Personnel master for the twin to pull' }),
69
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('after', { nullable: true, description: 'resume after this name — the previous page\'s next' })),
70
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('limit', type => type_graphql_1.Int, { nullable: true, description: 'rows per page — omit only when the axis is small enough to pull whole' })),
71
+ tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
72
+ tslib_1.__metadata("design:type", Function),
73
+ tslib_1.__metadata("design:paramtypes", [String, Number, Object]),
74
+ tslib_1.__metadata("design:returntype", Promise)
75
+ ], PersonnelQuery.prototype, "personnelMaster", null);
76
+ exports.PersonnelQuery = PersonnelQuery = tslib_1.__decorate([
77
+ (0, type_graphql_1.Resolver)(person_1.Person)
78
+ ], PersonnelQuery);
79
+ //# sourceMappingURL=personnel-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personnel-query.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Field, Int, ObjectType, Query, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { pullPage, refuseIfTooLarge } from '../master-page-query'\n\nimport { Person } from './person'\nimport { PersonnelClass } from './personnel-class'\nimport { personnelMaster as buildPersonnelMaster } from './personnel-master'\n\n@ObjectType({ description: 'Personnel master as the twin receives it' })\nexport class PersonnelMaster {\n /**\n * 트윈이 그대로 받는 모양이라 JSON 문자열로 낸다.\n *\n * 계약 층의 타입을 GraphQL 타입으로 다시 선언하지 않는 이유는, 그렇게 하면 같은 모양이 두 곳에\n * 적히고 한쪽만 고쳐지기 때문이다. 받는 쪽은 이 문자열을 계약 층의 타입으로 읽는다.\n */\n @Field(type => String, { description: 'ResourceClassDef[] as JSON text' })\n personnelClasses: string\n\n @Field(type => String, { description: 'ReferenceMaster persons[] as JSON text' })\n persons: string\n\n /**\n * 더 있나 — **이 값을 안 보고 쓰면 조용히 잘린 마스터로 트윈을 세우게 된다.**\n *\n * 거짓이 될 때까지 `next` 를 `after` 로 넘겨 이어 받는다.\n */\n @Field({ description: 'true when more rows remain — keep pulling with next as after' })\n hasMore: boolean\n\n /** 이어 받을 자리. 더 없으면 없다. */\n @Field(type => String, { nullable: true, description: 'cursor for the next page — the last name in this page' })\n next?: string\n\n}\n\n@Resolver(Person)\nexport class PersonnelQuery {\n /**\n * 인원 축 전체를 한 번에 낸다 — 트윈이 당겨 가는 자리.\n *\n * 사람이 자기 등급을 가리키므로 **둘이 서로 맞아야 한다.** 한 건씩 밀면 사람이 먼저 도착하고 등급이\n * 나중에 오는 순간이 생기고, 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.\n *\n * 자르지 않는다. 인원 마스터는 현장 하나에서 수천을 넘지 않고, 잘라서 보내면 등급과 사람이 나뉜다.\n */\n @Query(returns => PersonnelMaster, { description: 'Personnel master for the twin to pull' })\n async personnelMaster(\n @Arg('after', { nullable: true, description: 'resume after this name — the previous page\\'s next' }) after: string | undefined,\n @Arg('limit', type => Int, { nullable: true, description: 'rows per page — omit only when the axis is small enough to pull whole' }) limit: number | undefined,\n @Ctx() context: ResolverContext\n ): Promise<PersonnelMaster> {\n const { domain } = context.state\n\n const request = { after, limit }\n\n /*\n * **등급은 통째로, 구성원만 나눈다.** 구성원이 자기 등급을 이름으로 가리키므로 둘을 함께 나누면\n * 구성원이 먼저 도착하고 등급이 나중에 오는 순간이 생긴다 — 그 순간 받는 쪽은 없는 등급을\n * 가리키는 구성원을 갖는다. 등급은 수십 단위라 매 쪽에 실어도 크지 않다.\n */\n const [classes, page] = await Promise.all([\n getRepository(PersonnelClass).find({ where: { domain: { id: domain.id } }, order: { name: 'ASC' } }),\n pullPage<Person>(Person, domain, request)\n ])\n\n /* 통째로 달라고 했는데 한도를 넘으면 **자르지 않고 거절한다**(§`master-page`). */\n refuseIfTooLarge('인원', request, page)\n\n const persons = page.rows\n\n const master = buildPersonnelMaster(classes, persons)\n\n return {\n personnelClasses: JSON.stringify(master.personnelClasses),\n persons: JSON.stringify(master.persons),\n hasMore: page.hasMore,\n ...(page.next ? { next: page.next } : {})\n }\n }\n}\n"]}
@@ -0,0 +1,104 @@
1
+ import type { ResourceClassDef, TestResult } from '@operato/ops-contract';
2
+ /**
3
+ * 이 사람이 이 공정을 할 자격이 있나 — **ISA-95 `PersonnelSpecification` 을 실제로 거는 자리.**
4
+ *
5
+ * 공정은 등급으로 요구하고(`OperationDefinition.personnelSpecification`), 등급은 검사를 요구하고
6
+ * (`PersonnelClass.testSpecificationIds`), 사람은 결과를 든다(`Person.testResults`). 세 자리가 다
7
+ * 있었는데 그것을 잇는 판단이 없어서, 마스터에 적힌 자격이 아무 일도 하지 않고 있었다.
8
+ *
9
+ * ── 기록이 없을 때의 판단이 커널과 반대다 ──────────────────────────────────
10
+ * 계약의 `meetsTests` 는 결과가 선언되지 않은 검사를 **제약으로 보지 않는다**(`contract.ts` §meetsTests).
11
+ * 트윈에서는 그것이 맞다 — 모델 데이터가 성긴데 기록이 없다고 다 막으면 라인이 굶는다.
12
+ *
13
+ * 실행 시스템에서는 반대다. 「이 사람의 용접 자격 기록이 없다」는 통과 사유가 아니라 막을 사유다.
14
+ * 그래서 등급 상속(`classClosure`) · 필수 검사 수집(`requiredTestsFor`) · 만료 판정(`testPassedAt`) 은
15
+ * 계약 것을 그대로 쓰고, **없을 때의 판단만 여기서 뒤집는다.** 커널 함수는 고치지 않는다.
16
+ *
17
+ * ── 왜 이유를 종류별로 돌려주나 ────────────────────────────────────────────
18
+ * 막기만 하고 무엇이 모자란지 말하지 않는 화면은 현장에서 우회 대상이 된다. 자격이 없는 것과 만료된
19
+ * 것은 할 일이 다르다 — 앞은 사람을 바꾸고, 뒤는 갱신하면 된다.
20
+ */
21
+ /** 무엇이 모자란가. 종류마다 현장이 할 일이 다르다. */
22
+ export type QualificationLack =
23
+ /** 그 등급에 속하지 않는다 — 다른 사람을 부르는 수밖에 없다. */
24
+ 'not-in-class'
25
+ /** 등급이 요구하는 검사의 기록이 없다 — 받았는지 확인하고 기록한다. */
26
+ | 'test-missing'
27
+ /** 불합격 기록이다. */
28
+ | 'test-failed'
29
+ /** 합격했으나 유효기간이 지났다 — 갱신하면 된다. */
30
+ | 'test-expired'
31
+ /** 아직 현장에 없거나(입사 전) 이미 없다(퇴사). */
32
+ | 'not-effective'
33
+ /**
34
+ * 그 이름이 인원 마스터에 없다 — 자격을 따질 수가 없다.
35
+ *
36
+ * 「자격 없음」으로 내면 안 된다. 자격이 없는 것과 그 사람이 누구인지 모르는 것은 할 일이 다르다
37
+ * (앞은 사람을 바꾸고, 뒤는 등록하거나 이름을 고친다).
38
+ */
39
+ | 'not-registered';
40
+ export interface QualificationGap {
41
+ /** 누가 — `Person.name`. */
42
+ personName: string;
43
+ /** 어느 등급을 요구했나 — `PersonnelClass.name`. */
44
+ classId: string;
45
+ lack: QualificationLack;
46
+ /** 검사 때문이면 어느 검사인가 — `TestSpecification.id`. */
47
+ specId?: string;
48
+ /** 만료된 것이면 언제 만료됐나(ISO). */
49
+ expiredAt?: string;
50
+ }
51
+ /** 등급별로 몇 명이 필요한데 몇 명이 자격을 갖췄나. */
52
+ export interface QualificationShortfall {
53
+ classId: string;
54
+ required: number;
55
+ qualified: number;
56
+ }
57
+ export interface QualificationVerdict {
58
+ qualified: boolean;
59
+ gaps: QualificationGap[];
60
+ shortfalls: QualificationShortfall[];
61
+ }
62
+ /** 판단에 필요한 사람의 사실만. 엔티티를 통째로 받지 않는다 — 그러면 테스트가 DB 를 끌고 온다. */
63
+ export interface QualifiablePerson {
64
+ name: string;
65
+ personnelClassIds?: string[];
66
+ testResults?: TestResult[];
67
+ effectiveStart?: Date | string;
68
+ effectiveEnd?: Date | string;
69
+ }
70
+ /** ISA-95 `PersonnelSpecification` — 등급 하나와 그 등급으로 몇 명이 필요한가. */
71
+ export interface PersonnelSpecificationEntry {
72
+ personnelClassId: string;
73
+ quantity?: number;
74
+ }
75
+ /**
76
+ * 선언된 필요 인원을 읽는다.
77
+ *
78
+ * `OperationDefinition.personnelSpecification` 은 JSON 칸이라 모양이 보장되지 않는다. 등급 이름이 없는
79
+ * 줄은 **버리지 않고 걸러 낸다** — 그런 줄로 요구를 만들면 아무도 만족시킬 수 없는 공정이 된다.
80
+ * 수량이 없으면 1명으로 읽는다(ISA-95 `Quantity` 는 선택 항목이고, 요구했다는 것 자체가 최소 한 명이다).
81
+ */
82
+ export declare function personnelSpecificationOf(raw: readonly Record<string, unknown>[] | undefined): PersonnelSpecificationEntry[];
83
+ /**
84
+ * 이 사람이 이 등급의 자격을 갖췄나. 모자라면 **무엇이** 모자란지 돌려준다.
85
+ *
86
+ * 상속을 탄다 — 「6축 용접 자격」을 가진 사람은 「용접 자격」을 요구하는 공정에 선다. 그 상속은
87
+ * 계약의 `classClosure` 가 닫으므로 여기서 다시 만들지 않는다.
88
+ */
89
+ export declare function qualificationGapsFor(person: QualifiablePerson, classId: string, classDefs: readonly ResourceClassDef[], at: string): QualificationGap[];
90
+ /**
91
+ * 이 사람들로 이 공정을 돌릴 수 있나.
92
+ *
93
+ * 등급마다 수량을 센다. 한 사람이 여러 등급을 만족시킬 수 있으므로 **등급별로 따로 센다** — 「용접
94
+ * 1명 · 지게차 1명」을 두 자격을 가진 한 사람으로 채울 수 있는지는 현장이 정할 일이지 여기서 정할
95
+ * 일이 아니다. 여기서는 각 요구가 채워졌는지만 본다.
96
+ */
97
+ export declare function judgePersonnel(spec: readonly PersonnelSpecificationEntry[], persons: readonly QualifiablePerson[], classDefs: readonly ResourceClassDef[], at: string): QualificationVerdict;
98
+ /**
99
+ * 이 사람의 이 등급 자격이 **언제 가장 먼저 끊기나.**
100
+ *
101
+ * 요구되는 검사가 여럿이면 가장 이른 만료가 그 등급의 만료다 — 하나라도 끊기면 자격이 성립하지 않는다.
102
+ * 만료가 선언되지 않은 검사는 무기한이므로 세지 않는다(모르는 것과 지난 것은 다르다).
103
+ */
104
+ export declare function nearestQualificationExpiry(person: QualifiablePerson, classId: string, classDefs: readonly ResourceClassDef[], at: string): string | undefined;