@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,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.personnelSpecificationOf = personnelSpecificationOf;
4
+ exports.qualificationGapsFor = qualificationGapsFor;
5
+ exports.judgePersonnel = judgePersonnel;
6
+ exports.nearestQualificationExpiry = nearestQualificationExpiry;
7
+ const ops_contract_1 = require("@operato/ops-contract");
8
+ /**
9
+ * 선언된 필요 인원을 읽는다.
10
+ *
11
+ * `OperationDefinition.personnelSpecification` 은 JSON 칸이라 모양이 보장되지 않는다. 등급 이름이 없는
12
+ * 줄은 **버리지 않고 걸러 낸다** — 그런 줄로 요구를 만들면 아무도 만족시킬 수 없는 공정이 된다.
13
+ * 수량이 없으면 1명으로 읽는다(ISA-95 `Quantity` 는 선택 항목이고, 요구했다는 것 자체가 최소 한 명이다).
14
+ */
15
+ function personnelSpecificationOf(raw) {
16
+ if (!raw?.length) {
17
+ return [];
18
+ }
19
+ const entries = [];
20
+ for (const row of raw) {
21
+ const classId = row?.personnelClassId ?? row?.personnelClassID ?? row?.classId;
22
+ if (typeof classId !== 'string' || !classId) {
23
+ continue;
24
+ }
25
+ const quantity = Number(row?.quantity);
26
+ entries.push({ personnelClassId: classId, quantity: Number.isFinite(quantity) && quantity > 0 ? quantity : 1 });
27
+ }
28
+ return entries;
29
+ }
30
+ /**
31
+ * 이 사람이 이 등급의 자격을 갖췄나. 모자라면 **무엇이** 모자란지 돌려준다.
32
+ *
33
+ * 상속을 탄다 — 「6축 용접 자격」을 가진 사람은 「용접 자격」을 요구하는 공정에 선다. 그 상속은
34
+ * 계약의 `classClosure` 가 닫으므로 여기서 다시 만들지 않는다.
35
+ */
36
+ function qualificationGapsFor(person, classId, classDefs, at) {
37
+ const period = {
38
+ effectiveStart: isoOf(person.effectiveStart),
39
+ effectiveEnd: isoOf(person.effectiveEnd)
40
+ };
41
+ /* 유효기간 밖이면 자격을 볼 것도 없다 — 퇴사자의 용접 자격은 유효해도 배정 대상이 아니다. */
42
+ if ((0, ops_contract_1.effectivityAt)(period, at) !== undefined) {
43
+ return [{ personName: person.name, classId, lack: 'not-effective' }];
44
+ }
45
+ const closure = (0, ops_contract_1.classClosure)(person.personnelClassIds, classDefs, at);
46
+ if (!closure.has(classId)) {
47
+ return [{ personName: person.name, classId, lack: 'not-in-class' }];
48
+ }
49
+ const required = (0, ops_contract_1.requiredTestsFor)([classId], classDefs, at);
50
+ if (!required.length) {
51
+ return [];
52
+ }
53
+ const bySpec = new Map((person.testResults ?? []).map(result => [result.specId, result]));
54
+ const gaps = [];
55
+ for (const specId of required) {
56
+ const result = bySpec.get(specId);
57
+ /*
58
+ * 여기가 커널과 갈리는 한 줄이다. 계약은 없는 결과를 제약으로 보지 않고, 실행 시스템은 막는다.
59
+ * 기록이 없다는 것은 「자격이 있다」가 아니라 「모른다」이고, 모르는 채로 작업을 보내지 않는다.
60
+ */
61
+ if (!result) {
62
+ gaps.push({ personName: person.name, classId, lack: 'test-missing', specId });
63
+ continue;
64
+ }
65
+ if (result.result === 'fail') {
66
+ gaps.push({ personName: person.name, classId, lack: 'test-failed', specId });
67
+ continue;
68
+ }
69
+ /* 판정이 비어 있는 것도 통과가 아니다 — 「재기만 하고 판정하지 않았다」는 합격이 아니다. */
70
+ if (result.result !== 'pass') {
71
+ gaps.push({ personName: person.name, classId, lack: 'test-missing', specId });
72
+ continue;
73
+ }
74
+ if (!(0, ops_contract_1.testPassedAt)(result, at)) {
75
+ gaps.push({ personName: person.name, classId, lack: 'test-expired', specId, expiredAt: result.expiresAt });
76
+ }
77
+ }
78
+ return gaps;
79
+ }
80
+ /**
81
+ * 이 사람들로 이 공정을 돌릴 수 있나.
82
+ *
83
+ * 등급마다 수량을 센다. 한 사람이 여러 등급을 만족시킬 수 있으므로 **등급별로 따로 센다** — 「용접
84
+ * 1명 · 지게차 1명」을 두 자격을 가진 한 사람으로 채울 수 있는지는 현장이 정할 일이지 여기서 정할
85
+ * 일이 아니다. 여기서는 각 요구가 채워졌는지만 본다.
86
+ */
87
+ function judgePersonnel(spec, persons, classDefs, at) {
88
+ if (!spec.length) {
89
+ return { qualified: true, gaps: [], shortfalls: [] };
90
+ }
91
+ const gaps = [];
92
+ const shortfalls = [];
93
+ for (const { personnelClassId, quantity } of spec) {
94
+ const required = quantity ?? 1;
95
+ let count = 0;
96
+ for (const person of persons) {
97
+ const found = qualificationGapsFor(person, personnelClassId, classDefs, at);
98
+ if (!found.length) {
99
+ count += 1;
100
+ continue;
101
+ }
102
+ /*
103
+ * 그 등급에 아예 속하지 않는 사람은 이유로 내지 않는다. 실적에 이름이 다섯이면 그 중 넷은
104
+ * 다른 일을 하는 사람이고, 그들까지 「용접 자격 없음」으로 늘어놓으면 진짜 이유가 묻힌다.
105
+ */
106
+ if (found.some(gap => gap.lack === 'not-in-class')) {
107
+ continue;
108
+ }
109
+ gaps.push(...found);
110
+ }
111
+ if (count < required) {
112
+ shortfalls.push({ classId: personnelClassId, required, qualified: count });
113
+ }
114
+ }
115
+ return { qualified: shortfalls.length === 0, gaps, shortfalls };
116
+ }
117
+ function isoOf(at) {
118
+ if (!at) {
119
+ return undefined;
120
+ }
121
+ return typeof at === 'string' ? at : at.toISOString();
122
+ }
123
+ /**
124
+ * 이 사람의 이 등급 자격이 **언제 가장 먼저 끊기나.**
125
+ *
126
+ * 요구되는 검사가 여럿이면 가장 이른 만료가 그 등급의 만료다 — 하나라도 끊기면 자격이 성립하지 않는다.
127
+ * 만료가 선언되지 않은 검사는 무기한이므로 세지 않는다(모르는 것과 지난 것은 다르다).
128
+ */
129
+ function nearestQualificationExpiry(person, classId, classDefs, at) {
130
+ const required = new Set((0, ops_contract_1.requiredTestsFor)([classId], classDefs, at));
131
+ if (!required.size) {
132
+ return undefined;
133
+ }
134
+ const bySpec = new Map((person.testResults ?? []).map(result => [result.specId, result]));
135
+ let nearest;
136
+ for (const specId of required) {
137
+ const result = bySpec.get(specId);
138
+ if (!result?.expiresAt || result.result !== 'pass') {
139
+ continue;
140
+ }
141
+ if (!nearest || Date.parse(result.expiresAt) < Date.parse(nearest)) {
142
+ nearest = result.expiresAt;
143
+ }
144
+ }
145
+ return nearest;
146
+ }
147
+ //# sourceMappingURL=qualification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qualification.js","sourceRoot":"","sources":["../../../server/service/personnel/qualification.ts"],"names":[],"mappings":"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","sourcesContent":["import { classClosure, effectivityAt, requiredTestsFor, testPassedAt } from '@operato/ops-contract'\nimport type { ResourceClassDef, TestResult } from '@operato/ops-contract'\n\n/**\n * 이 사람이 이 공정을 할 자격이 있나 — **ISA-95 `PersonnelSpecification` 을 실제로 거는 자리.**\n *\n * 공정은 등급으로 요구하고(`OperationDefinition.personnelSpecification`), 등급은 검사를 요구하고\n * (`PersonnelClass.testSpecificationIds`), 사람은 결과를 든다(`Person.testResults`). 세 자리가 다\n * 있었는데 그것을 잇는 판단이 없어서, 마스터에 적힌 자격이 아무 일도 하지 않고 있었다.\n *\n * ── 기록이 없을 때의 판단이 커널과 반대다 ──────────────────────────────────\n * 계약의 `meetsTests` 는 결과가 선언되지 않은 검사를 **제약으로 보지 않는다**(`contract.ts` §meetsTests).\n * 트윈에서는 그것이 맞다 — 모델 데이터가 성긴데 기록이 없다고 다 막으면 라인이 굶는다.\n *\n * 실행 시스템에서는 반대다. 「이 사람의 용접 자격 기록이 없다」는 통과 사유가 아니라 막을 사유다.\n * 그래서 등급 상속(`classClosure`) · 필수 검사 수집(`requiredTestsFor`) · 만료 판정(`testPassedAt`) 은\n * 계약 것을 그대로 쓰고, **없을 때의 판단만 여기서 뒤집는다.** 커널 함수는 고치지 않는다.\n *\n * ── 왜 이유를 종류별로 돌려주나 ────────────────────────────────────────────\n * 막기만 하고 무엇이 모자란지 말하지 않는 화면은 현장에서 우회 대상이 된다. 자격이 없는 것과 만료된\n * 것은 할 일이 다르다 — 앞은 사람을 바꾸고, 뒤는 갱신하면 된다.\n */\n\n/** 무엇이 모자란가. 종류마다 현장이 할 일이 다르다. */\nexport type QualificationLack =\n /** 그 등급에 속하지 않는다 — 다른 사람을 부르는 수밖에 없다. */\n | 'not-in-class'\n /** 등급이 요구하는 검사의 기록이 없다 — 받았는지 확인하고 기록한다. */\n | 'test-missing'\n /** 불합격 기록이다. */\n | 'test-failed'\n /** 합격했으나 유효기간이 지났다 — 갱신하면 된다. */\n | 'test-expired'\n /** 아직 현장에 없거나(입사 전) 이미 없다(퇴사). */\n | 'not-effective'\n /**\n * 그 이름이 인원 마스터에 없다 — 자격을 따질 수가 없다.\n *\n * 「자격 없음」으로 내면 안 된다. 자격이 없는 것과 그 사람이 누구인지 모르는 것은 할 일이 다르다\n * (앞은 사람을 바꾸고, 뒤는 등록하거나 이름을 고친다).\n */\n | 'not-registered'\n\nexport interface QualificationGap {\n /** 누가 — `Person.name`. */\n personName: string\n /** 어느 등급을 요구했나 — `PersonnelClass.name`. */\n classId: string\n lack: QualificationLack\n /** 검사 때문이면 어느 검사인가 — `TestSpecification.id`. */\n specId?: string\n /** 만료된 것이면 언제 만료됐나(ISO). */\n expiredAt?: string\n}\n\n/** 등급별로 몇 명이 필요한데 몇 명이 자격을 갖췄나. */\nexport interface QualificationShortfall {\n classId: string\n required: number\n qualified: number\n}\n\nexport interface QualificationVerdict {\n qualified: boolean\n gaps: QualificationGap[]\n shortfalls: QualificationShortfall[]\n}\n\n/** 판단에 필요한 사람의 사실만. 엔티티를 통째로 받지 않는다 — 그러면 테스트가 DB 를 끌고 온다. */\nexport interface QualifiablePerson {\n name: string\n personnelClassIds?: string[]\n testResults?: TestResult[]\n effectiveStart?: Date | string\n effectiveEnd?: Date | string\n}\n\n/** ISA-95 `PersonnelSpecification` — 등급 하나와 그 등급으로 몇 명이 필요한가. */\nexport interface PersonnelSpecificationEntry {\n personnelClassId: string\n quantity?: number\n}\n\n/**\n * 선언된 필요 인원을 읽는다.\n *\n * `OperationDefinition.personnelSpecification` 은 JSON 칸이라 모양이 보장되지 않는다. 등급 이름이 없는\n * 줄은 **버리지 않고 걸러 낸다** — 그런 줄로 요구를 만들면 아무도 만족시킬 수 없는 공정이 된다.\n * 수량이 없으면 1명으로 읽는다(ISA-95 `Quantity` 는 선택 항목이고, 요구했다는 것 자체가 최소 한 명이다).\n */\nexport function personnelSpecificationOf(raw: readonly Record<string, unknown>[] | undefined): PersonnelSpecificationEntry[] {\n if (!raw?.length) {\n return []\n }\n\n const entries: PersonnelSpecificationEntry[] = []\n\n for (const row of raw) {\n const classId = row?.personnelClassId ?? row?.personnelClassID ?? row?.classId\n if (typeof classId !== 'string' || !classId) {\n continue\n }\n\n const quantity = Number(row?.quantity)\n entries.push({ personnelClassId: classId, quantity: Number.isFinite(quantity) && quantity > 0 ? quantity : 1 })\n }\n\n return entries\n}\n\n/**\n * 이 사람이 이 등급의 자격을 갖췄나. 모자라면 **무엇이** 모자란지 돌려준다.\n *\n * 상속을 탄다 — 「6축 용접 자격」을 가진 사람은 「용접 자격」을 요구하는 공정에 선다. 그 상속은\n * 계약의 `classClosure` 가 닫으므로 여기서 다시 만들지 않는다.\n */\nexport function qualificationGapsFor(\n person: QualifiablePerson,\n classId: string,\n classDefs: readonly ResourceClassDef[],\n at: string\n): QualificationGap[] {\n const period = {\n effectiveStart: isoOf(person.effectiveStart),\n effectiveEnd: isoOf(person.effectiveEnd)\n }\n\n /* 유효기간 밖이면 자격을 볼 것도 없다 — 퇴사자의 용접 자격은 유효해도 배정 대상이 아니다. */\n if (effectivityAt(period, at) !== undefined) {\n return [{ personName: person.name, classId, lack: 'not-effective' }]\n }\n\n const closure = classClosure(person.personnelClassIds, classDefs, at)\n if (!closure.has(classId)) {\n return [{ personName: person.name, classId, lack: 'not-in-class' }]\n }\n\n const required = requiredTestsFor([classId], classDefs, at)\n if (!required.length) {\n return []\n }\n\n const bySpec = new Map((person.testResults ?? []).map(result => [result.specId, result]))\n const gaps: QualificationGap[] = []\n\n for (const specId of required) {\n const result = bySpec.get(specId)\n\n /*\n * 여기가 커널과 갈리는 한 줄이다. 계약은 없는 결과를 제약으로 보지 않고, 실행 시스템은 막는다.\n * 기록이 없다는 것은 「자격이 있다」가 아니라 「모른다」이고, 모르는 채로 작업을 보내지 않는다.\n */\n if (!result) {\n gaps.push({ personName: person.name, classId, lack: 'test-missing', specId })\n continue\n }\n\n if (result.result === 'fail') {\n gaps.push({ personName: person.name, classId, lack: 'test-failed', specId })\n continue\n }\n\n /* 판정이 비어 있는 것도 통과가 아니다 — 「재기만 하고 판정하지 않았다」는 합격이 아니다. */\n if (result.result !== 'pass') {\n gaps.push({ personName: person.name, classId, lack: 'test-missing', specId })\n continue\n }\n\n if (!testPassedAt(result, at)) {\n gaps.push({ personName: person.name, classId, lack: 'test-expired', specId, expiredAt: result.expiresAt })\n }\n }\n\n return gaps\n}\n\n/**\n * 이 사람들로 이 공정을 돌릴 수 있나.\n *\n * 등급마다 수량을 센다. 한 사람이 여러 등급을 만족시킬 수 있으므로 **등급별로 따로 센다** — 「용접\n * 1명 · 지게차 1명」을 두 자격을 가진 한 사람으로 채울 수 있는지는 현장이 정할 일이지 여기서 정할\n * 일이 아니다. 여기서는 각 요구가 채워졌는지만 본다.\n */\nexport function judgePersonnel(\n spec: readonly PersonnelSpecificationEntry[],\n persons: readonly QualifiablePerson[],\n classDefs: readonly ResourceClassDef[],\n at: string\n): QualificationVerdict {\n if (!spec.length) {\n return { qualified: true, gaps: [], shortfalls: [] }\n }\n\n const gaps: QualificationGap[] = []\n const shortfalls: QualificationShortfall[] = []\n\n for (const { personnelClassId, quantity } of spec) {\n const required = quantity ?? 1\n let count = 0\n\n for (const person of persons) {\n const found = qualificationGapsFor(person, personnelClassId, classDefs, at)\n\n if (!found.length) {\n count += 1\n continue\n }\n\n /*\n * 그 등급에 아예 속하지 않는 사람은 이유로 내지 않는다. 실적에 이름이 다섯이면 그 중 넷은\n * 다른 일을 하는 사람이고, 그들까지 「용접 자격 없음」으로 늘어놓으면 진짜 이유가 묻힌다.\n */\n if (found.some(gap => gap.lack === 'not-in-class')) {\n continue\n }\n\n gaps.push(...found)\n }\n\n if (count < required) {\n shortfalls.push({ classId: personnelClassId, required, qualified: count })\n }\n }\n\n return { qualified: shortfalls.length === 0, gaps, shortfalls }\n}\n\nfunction isoOf(at: Date | string | undefined): string | undefined {\n if (!at) {\n return undefined\n }\n\n return typeof at === 'string' ? at : at.toISOString()\n}\n\n/**\n * 이 사람의 이 등급 자격이 **언제 가장 먼저 끊기나.**\n *\n * 요구되는 검사가 여럿이면 가장 이른 만료가 그 등급의 만료다 — 하나라도 끊기면 자격이 성립하지 않는다.\n * 만료가 선언되지 않은 검사는 무기한이므로 세지 않는다(모르는 것과 지난 것은 다르다).\n */\nexport function nearestQualificationExpiry(\n person: QualifiablePerson,\n classId: string,\n classDefs: readonly ResourceClassDef[],\n at: string\n): string | undefined {\n const required = new Set(requiredTestsFor([classId], classDefs, at))\n if (!required.size) {\n return undefined\n }\n\n const bySpec = new Map((person.testResults ?? []).map(result => [result.specId, result]))\n let nearest: string | undefined\n\n for (const specId of required) {\n const result = bySpec.get(specId)\n if (!result?.expiresAt || result.result !== 'pass') {\n continue\n }\n if (!nearest || Date.parse(result.expiresAt) < Date.parse(nearest)) {\n nearest = result.expiresAt\n }\n }\n\n return nearest\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { NonconformanceCause } from './nonconformance-cause';
2
+ import { NonconformanceCauseResolver } from './nonconformance-cause-resolver';
3
+ export declare const entities: (typeof NonconformanceCause)[];
4
+ export declare const resolvers: (typeof NonconformanceCauseResolver)[];
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const nonconformance_cause_1 = require("./nonconformance-cause");
5
+ const nonconformance_cause_resolver_1 = require("./nonconformance-cause-resolver");
6
+ exports.entities = [nonconformance_cause_1.NonconformanceCause];
7
+ exports.resolvers = [nonconformance_cause_resolver_1.NonconformanceCauseResolver];
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/quality/index.ts"],"names":[],"mappings":";;;AAAA,iEAA4D;AAC5D,mFAA6E;AAChE,QAAA,QAAQ,GAAG,CAAC,0CAAmB,CAAC,CAAA;AAChC,QAAA,SAAS,GAAG,CAAC,2DAA2B,CAAC,CAAA","sourcesContent":["import { NonconformanceCause } from './nonconformance-cause'\nimport { NonconformanceCauseResolver } from './nonconformance-cause-resolver'\nexport const entities = [NonconformanceCause]\nexport const resolvers = [NonconformanceCauseResolver]\n"]}
@@ -0,0 +1,12 @@
1
+ import { ListParam } from '@things-factory/shell';
2
+ import { MasterPatch } from '../master-crud';
3
+ import { NonconformanceCause } from './nonconformance-cause';
4
+ declare class NonconformanceCauseList {
5
+ items: NonconformanceCause[];
6
+ total: number;
7
+ }
8
+ export declare class NonconformanceCauseResolver {
9
+ nonconformanceCauseList(params: ListParam, context: ResolverContext): Promise<NonconformanceCauseList>;
10
+ updateMultipleNonconformanceCause(patches: MasterPatch[], context: ResolverContext): Promise<NonconformanceCause[]>;
11
+ }
12
+ export {};
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NonconformanceCauseResolver = 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 nonconformance_cause_1 = require("./nonconformance-cause");
13
+ let NonconformanceCauseList = class NonconformanceCauseList {
14
+ };
15
+ tslib_1.__decorate([
16
+ (0, type_graphql_2.Field)(type => [nonconformance_cause_1.NonconformanceCause]),
17
+ tslib_1.__metadata("design:type", Array)
18
+ ], NonconformanceCauseList.prototype, "items", void 0);
19
+ tslib_1.__decorate([
20
+ (0, type_graphql_2.Field)(type => type_graphql_2.Int),
21
+ tslib_1.__metadata("design:type", Number)
22
+ ], NonconformanceCauseList.prototype, "total", void 0);
23
+ NonconformanceCauseList = tslib_1.__decorate([
24
+ (0, type_graphql_2.ObjectType)()
25
+ ], NonconformanceCauseList);
26
+ let NonconformanceCauseResolver = class NonconformanceCauseResolver {
27
+ async nonconformanceCauseList(params, context) {
28
+ const { items, total } = await (0, master_list_1.listMaster)('nonconformanceCause', params, context.state.domain);
29
+ return { items: items, total };
30
+ }
31
+ async updateMultipleNonconformanceCause(patches, context) {
32
+ const { domain, user, tx } = context.state;
33
+ return await (0, master_crud_1.saveMasterPatches)(tx, domain, (0, master_axis_1.masterAxisOf)('nonconformanceCause').entity, patches, user, { hasEffectivePeriod: true });
34
+ }
35
+ };
36
+ exports.NonconformanceCauseResolver = NonconformanceCauseResolver;
37
+ tslib_1.__decorate([
38
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
39
+ (0, type_graphql_2.Query)(returns => NonconformanceCauseList),
40
+ tslib_1.__param(0, (0, type_graphql_2.Args)(type => shell_2.ListParam)),
41
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
42
+ tslib_1.__metadata("design:type", Function),
43
+ tslib_1.__metadata("design:paramtypes", [shell_2.ListParam, Object]),
44
+ tslib_1.__metadata("design:returntype", Promise)
45
+ ], NonconformanceCauseResolver.prototype, "nonconformanceCauseList", null);
46
+ tslib_1.__decorate([
47
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
48
+ (0, type_graphql_2.Directive)('@transaction'),
49
+ (0, type_graphql_2.Mutation)(returns => [nonconformance_cause_1.NonconformanceCause]),
50
+ tslib_1.__param(0, (0, type_graphql_2.Arg)('patches', type => [shell_2.ScalarObject])),
51
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
52
+ tslib_1.__metadata("design:type", Function),
53
+ tslib_1.__metadata("design:paramtypes", [Array, Object]),
54
+ tslib_1.__metadata("design:returntype", Promise)
55
+ ], NonconformanceCauseResolver.prototype, "updateMultipleNonconformanceCause", null);
56
+ exports.NonconformanceCauseResolver = NonconformanceCauseResolver = tslib_1.__decorate([
57
+ (0, type_graphql_2.Resolver)(nonconformance_cause_1.NonconformanceCause),
58
+ (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
59
+ ], NonconformanceCauseResolver);
60
+ //# sourceMappingURL=nonconformance-cause-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonconformance-cause-resolver.js","sourceRoot":"","sources":["../../../server/service/quality/nonconformance-cause-resolver.ts"],"names":[],"mappings":";;;;AAAA,+CAA4C;AAC5C,iDAAqD;AACrD,+CAA2G;AAC3G,iDAA+D;AAC/D,gDAA+D;AAC/D,gDAA6C;AAC7C,gDAA2C;AAC3C,iEAA4D;AAG5D,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAA0G,CAAA;AAAjE;IAArC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,0CAAmB,CAAC,CAAC;;sDAA8B;AAAqB;IAAnB,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;sDAAc;AAA/H,uBAAuB;IAD5B,IAAA,yBAAU,GAAE;GACP,uBAAuB,CAA0G;AAIhI,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAGhC,AAAN,KAAK,CAAC,uBAAuB,CAA0B,MAAiB,EAAS,OAAwB;QACvG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,wBAAU,EAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC9F,OAAO,EAAE,KAAK,EAAE,KAA8B,EAAE,KAAK,EAAE,CAAA;IACzD,CAAC;IAIK,AAAN,KAAK,CAAC,iCAAiC,CAAyC,OAAsB,EAAS,OAAwB;QACrI,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,OAAO,MAAM,IAAA,+BAAiB,EAAC,EAAE,EAAE,MAAM,EAAE,IAAA,0BAAY,EAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAA0B,CAAA;IAC9J,CAAC;CACF,CAAA;AAdY,kEAA2B;AAGhC;IAFL,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,uBAAuB,CAAC;IACX,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;0EAGvE;AAIK;IAHL,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,0CAAmB,CAAC,CAAC;IACF,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,CAAC,CAAA;IAA0B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;oFAG7G;sCAbU,2BAA2B;IAFvC,IAAA,uBAAQ,EAAC,0CAAmB,CAAC;IAC7B,IAAA,4BAAa,EAAC,qBAAa,CAAC;GAChB,2BAA2B,CAcvC","sourcesContent":["import { UseMiddleware } from 'type-graphql'\nimport { SpeakRefusals } from '@things-factory/shell'\nimport { Arg, Args, Ctx, Directive, Int, Mutation, ObjectType, Field, Query, Resolver } from 'type-graphql'\nimport { ListParam, ScalarObject } from '@things-factory/shell'\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { NonconformanceCause } from './nonconformance-cause'\n\n@ObjectType()\nclass NonconformanceCauseList { @Field(type => [NonconformanceCause]) items: NonconformanceCause[]; @Field(type => Int) total: number }\n\n@Resolver(NonconformanceCause)\n@UseMiddleware(SpeakRefusals)\nexport class NonconformanceCauseResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => NonconformanceCauseList)\n async nonconformanceCauseList(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<NonconformanceCauseList> {\n const { items, total } = await listMaster('nonconformanceCause', params, context.state.domain)\n return { items: items as NonconformanceCause[], total }\n }\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [NonconformanceCause])\n async updateMultipleNonconformanceCause(@Arg('patches', type => [ScalarObject]) patches: MasterPatch[], @Ctx() context: ResolverContext): Promise<NonconformanceCause[]> {\n const { domain, user, tx } = context.state\n return await saveMasterPatches(tx, domain, masterAxisOf('nonconformanceCause').entity, patches, user, { hasEffectivePeriod: true }) as NonconformanceCause[]\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ import { User } from '@things-factory/auth-base';
3
+ /** 제품 부적합의 원인 코드. 설비 상태용 StopReason과 섞지 않는다. */
4
+ export declare class NonconformanceCause {
5
+ readonly id: string;
6
+ domain?: Domain;
7
+ domainId?: string;
8
+ name: string;
9
+ description?: string;
10
+ parentName?: string;
11
+ detailRequired?: boolean;
12
+ effectiveStart?: Date;
13
+ effectiveEnd?: Date;
14
+ createdAt?: Date;
15
+ updatedAt?: Date;
16
+ creator?: User;
17
+ creatorId?: string;
18
+ updater?: User;
19
+ updaterId?: string;
20
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NonconformanceCause = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const typeorm_1 = require("typeorm");
6
+ const type_graphql_1 = require("type-graphql");
7
+ const shell_1 = require("@things-factory/shell");
8
+ const auth_base_1 = require("@things-factory/auth-base");
9
+ /** 제품 부적합의 원인 코드. 설비 상태용 StopReason과 섞지 않는다. */
10
+ let NonconformanceCause = class NonconformanceCause {
11
+ };
12
+ exports.NonconformanceCause = NonconformanceCause;
13
+ tslib_1.__decorate([
14
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
15
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID),
16
+ tslib_1.__metadata("design:type", String)
17
+ ], NonconformanceCause.prototype, "id", void 0);
18
+ tslib_1.__decorate([
19
+ (0, typeorm_1.ManyToOne)(type => shell_1.Domain),
20
+ (0, type_graphql_1.Field)(type => shell_1.Domain),
21
+ tslib_1.__metadata("design:type", shell_1.Domain)
22
+ ], NonconformanceCause.prototype, "domain", void 0);
23
+ tslib_1.__decorate([
24
+ (0, typeorm_1.RelationId)((cause) => cause.domain),
25
+ tslib_1.__metadata("design:type", String)
26
+ ], NonconformanceCause.prototype, "domainId", void 0);
27
+ tslib_1.__decorate([
28
+ (0, typeorm_1.Column)(),
29
+ (0, type_graphql_1.Field)(),
30
+ tslib_1.__metadata("design:type", String)
31
+ ], NonconformanceCause.prototype, "name", void 0);
32
+ tslib_1.__decorate([
33
+ (0, typeorm_1.Column)({ nullable: true }),
34
+ (0, type_graphql_1.Field)({ nullable: true }),
35
+ tslib_1.__metadata("design:type", String)
36
+ ], NonconformanceCause.prototype, "description", void 0);
37
+ tslib_1.__decorate([
38
+ (0, typeorm_1.Column)({ nullable: true }),
39
+ (0, type_graphql_1.Field)({ nullable: true }),
40
+ tslib_1.__metadata("design:type", String)
41
+ ], NonconformanceCause.prototype, "parentName", void 0);
42
+ tslib_1.__decorate([
43
+ (0, typeorm_1.Column)({ type: 'boolean', nullable: true }),
44
+ (0, type_graphql_1.Field)({ nullable: true }),
45
+ tslib_1.__metadata("design:type", Boolean)
46
+ ], NonconformanceCause.prototype, "detailRequired", void 0);
47
+ tslib_1.__decorate([
48
+ (0, typeorm_1.Column)({ nullable: true }),
49
+ (0, type_graphql_1.Field)({ nullable: true }),
50
+ tslib_1.__metadata("design:type", Date)
51
+ ], NonconformanceCause.prototype, "effectiveStart", void 0);
52
+ tslib_1.__decorate([
53
+ (0, typeorm_1.Column)({ nullable: true }),
54
+ (0, type_graphql_1.Field)({ nullable: true }),
55
+ tslib_1.__metadata("design:type", Date)
56
+ ], NonconformanceCause.prototype, "effectiveEnd", void 0);
57
+ tslib_1.__decorate([
58
+ (0, typeorm_1.CreateDateColumn)(),
59
+ (0, type_graphql_1.Field)({ nullable: true }),
60
+ tslib_1.__metadata("design:type", Date)
61
+ ], NonconformanceCause.prototype, "createdAt", void 0);
62
+ tslib_1.__decorate([
63
+ (0, typeorm_1.UpdateDateColumn)(),
64
+ (0, type_graphql_1.Field)({ nullable: true }),
65
+ tslib_1.__metadata("design:type", Date)
66
+ ], NonconformanceCause.prototype, "updatedAt", void 0);
67
+ tslib_1.__decorate([
68
+ (0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
69
+ (0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
70
+ tslib_1.__metadata("design:type", auth_base_1.User)
71
+ ], NonconformanceCause.prototype, "creator", void 0);
72
+ tslib_1.__decorate([
73
+ (0, typeorm_1.RelationId)((cause) => cause.creator),
74
+ tslib_1.__metadata("design:type", String)
75
+ ], NonconformanceCause.prototype, "creatorId", void 0);
76
+ tslib_1.__decorate([
77
+ (0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
78
+ (0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
79
+ tslib_1.__metadata("design:type", auth_base_1.User)
80
+ ], NonconformanceCause.prototype, "updater", void 0);
81
+ tslib_1.__decorate([
82
+ (0, typeorm_1.RelationId)((cause) => cause.updater),
83
+ tslib_1.__metadata("design:type", String)
84
+ ], NonconformanceCause.prototype, "updaterId", void 0);
85
+ exports.NonconformanceCause = NonconformanceCause = tslib_1.__decorate([
86
+ (0, typeorm_1.Entity)({ name: 'ops_nonconformance_cause' }),
87
+ (0, typeorm_1.Index)('ix_ops_nonconformance_cause_0', (cause) => [cause.domain, cause.name], { unique: true }),
88
+ (0, type_graphql_1.ObjectType)({ description: 'A classified product nonconformance cause' })
89
+ ], NonconformanceCause);
90
+ //# sourceMappingURL=nonconformance-cause.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonconformance-cause.js","sourceRoot":"","sources":["../../../server/service/quality/nonconformance-cause.ts"],"names":[],"mappings":"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","sourcesContent":["import { Column, CreateDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId, UpdateDateColumn } from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/** 제품 부적합의 원인 코드. 설비 상태용 StopReason과 섞지 않는다. */\n@Entity({ name: 'ops_nonconformance_cause' })\n@Index('ix_ops_nonconformance_cause_0', (cause: NonconformanceCause) => [cause.domain, cause.name], { unique: true })\n@ObjectType({ description: 'A classified product nonconformance cause' })\nexport class NonconformanceCause {\n @PrimaryGeneratedColumn('uuid') @Field(type => ID) readonly id: string\n @ManyToOne(type => Domain) @Field(type => Domain) domain?: Domain\n @RelationId((cause: NonconformanceCause) => cause.domain) domainId?: string\n @Column() @Field() name: string\n @Column({ nullable: true }) @Field({ nullable: true }) description?: string\n @Column({ nullable: true }) @Field({ nullable: true }) parentName?: string\n @Column({ type: 'boolean', nullable: true }) @Field({ nullable: true }) detailRequired?: boolean\n @Column({ nullable: true }) @Field({ nullable: true }) effectiveStart?: Date\n @Column({ nullable: true }) @Field({ nullable: true }) effectiveEnd?: Date\n @CreateDateColumn() @Field({ nullable: true }) createdAt?: Date\n @UpdateDateColumn() @Field({ nullable: true }) updatedAt?: Date\n @ManyToOne(type => User, { nullable: true }) @Field(type => User, { nullable: true }) creator?: User\n @RelationId((cause: NonconformanceCause) => cause.creator) creatorId?: string\n @ManyToOne(type => User, { nullable: true }) @Field(type => User, { nullable: true }) updater?: User\n @RelationId((cause: NonconformanceCause) => cause.updater) updaterId?: string\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { RecipeDefinition } from './recipe-definition';
2
+ import { RouteDefinition } from './route-definition';
3
+ import { RecipeDefinitionResolver, RouteDefinitionResolver } from './recipe-master-resolver';
4
+ import { RecipeQuery } from './recipe-query';
5
+ import { RecipeRevisionResolver } from './recipe-revision-resolver';
6
+ export declare const entities: (typeof RecipeDefinition | typeof RouteDefinition | typeof import("./recipe-revision").RecipeRevision | typeof import("./recipe-revision-line").RecipeRevisionOutput | typeof import("./recipe-revision").RecipePlan | typeof import("./recipe-revision").RecipeSegment | typeof import("./recipe-revision").RecipeBasis)[];
7
+ export declare const resolvers: (typeof RecipeDefinitionResolver | typeof RouteDefinitionResolver | typeof RecipeRevisionResolver | typeof RecipeQuery)[];
8
+ export * from './recipe-definition';
9
+ export * from './route-definition';
10
+ export * from './recipe-master';
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const recipe_definition_1 = require("./recipe-definition");
6
+ const route_definition_1 = require("./route-definition");
7
+ const recipe_master_resolver_1 = require("./recipe-master-resolver");
8
+ const recipe_query_1 = require("./recipe-query");
9
+ const recipe_revision_1 = require("./recipe-revision");
10
+ const recipe_revision_resolver_1 = require("./recipe-revision-resolver");
11
+ exports.entities = [recipe_definition_1.RecipeDefinition, route_definition_1.RouteDefinition, ...recipe_revision_1.RECIPE_REVISION_ENTITIES];
12
+ exports.resolvers = [recipe_master_resolver_1.RecipeDefinitionResolver, recipe_master_resolver_1.RouteDefinitionResolver, recipe_query_1.RecipeQuery, recipe_revision_resolver_1.RecipeRevisionResolver];
13
+ tslib_1.__exportStar(require("./recipe-definition"), exports);
14
+ tslib_1.__exportStar(require("./route-definition"), exports);
15
+ tslib_1.__exportStar(require("./recipe-master"), exports);
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/recipe/index.ts"],"names":[],"mappings":";;;;AAAA,2DAAsD;AACtD,yDAAoD;AACpD,qEAA4F;AAC5F,iDAA4C;AAC5C,uDAA4D;AAC5D,yEAAmE;AAEtD,QAAA,QAAQ,GAAG,CAAC,oCAAgB,EAAE,kCAAe,EAAE,GAAG,0CAAwB,CAAC,CAAA;AAC3E,QAAA,SAAS,GAAG,CAAC,iDAAwB,EAAE,gDAAuB,EAAE,0BAAW,EAAE,iDAAsB,CAAC,CAAA;AAEjH,8DAAmC;AACnC,6DAAkC;AAClC,0DAA+B","sourcesContent":["import { RecipeDefinition } from './recipe-definition'\nimport { RouteDefinition } from './route-definition'\nimport { RecipeDefinitionResolver, RouteDefinitionResolver } from './recipe-master-resolver'\nimport { RecipeQuery } from './recipe-query'\nimport { RECIPE_REVISION_ENTITIES } from './recipe-revision'\nimport { RecipeRevisionResolver } from './recipe-revision-resolver'\n\nexport const entities = [RecipeDefinition, RouteDefinition, ...RECIPE_REVISION_ENTITIES]\nexport const resolvers = [RecipeDefinitionResolver, RouteDefinitionResolver, RecipeQuery, RecipeRevisionResolver]\n\nexport * from './recipe-definition'\nexport * from './route-definition'\nexport * from './recipe-master'\n"]}
@@ -0,0 +1,75 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ import { User } from '@things-factory/auth-base';
3
+ /**
4
+ * 레시피 — **무엇으로 무엇을 만드나**. 커널 `RecipeDef` 와 같은 모양이다.
5
+ *
6
+ * ── 이 자리가 답하는 것 ──────────────────────────────────────────────────
7
+ * 「이 품목은 무엇으로 만드나」와 「이 품목을 만드는 것은 어느 레시피인가」다. 둘째가 MES 가 물어야 했던
8
+ * 것인데 물을 곳이 없었다.
9
+ *
10
+ * ── 품목에 지시서를 달지 않는 이유 ───────────────────────────────────────
11
+ * ISA-95 에는 자재 명세가 붙는 자리가 둘이고 뜻이 다르다(§`RecipePart.operation`).
12
+ *
13
+ * · `ProcessSegment` — 그 자리가 **할 수 있는 일**. 품목에 매이지 않는다 → `OperationDefinition`
14
+ * · `OperationsSegment` — 그 **품목을 만드는 절차**의 한 단계. 품목에 매인다 → **레시피가 그 범위다**
15
+ *
16
+ * 그래서 품목→지시서를 이으려면 그 사이에 레시피가 있어야 한다. 공정에 품목을 붙이면 범주 오류이고,
17
+ * 실 데이터가 그 크기를 보였다 — 「배합」에 품목별 BOM 을 붙이면 배합을 지나는 **모든** 로트가 자재
18
+ * 631종 36톤을 먹는다.
19
+ *
20
+ * ── 같은 품목에 레시피가 둘일 수 있다 ────────────────────────────────────
21
+ * 대체 레시피가 정상이다(첫 실 연동에서 라우팅이 둘 이상인 레시피가 306/471). 그래서 **품목이 레시피를
22
+ * 가리키지 않고 레시피가 품목을 가리킨다** — 품목은 하나를 고를 수 없다.
23
+ */
24
+ export declare class RecipeDefinition {
25
+ /** Read projection of the effective revision, not a mutable identity column. */
26
+ revisionNumber?: number;
27
+ planGeneration: number;
28
+ revisionLock: number;
29
+ readonly id: string;
30
+ domain?: Domain;
31
+ domainId?: string;
32
+ /** 레시피 키 — 오더의 `recipeKey` 가 이 값을 가리킨다(커널 `RecipeDef.key`). */
33
+ name: string;
34
+ description?: string;
35
+ /**
36
+ * **무엇을 만드나** — `MaterialDefinition.name`.
37
+ *
38
+ * `outputs` 안에도 있지만 이 칸을 따로 둔다. 「이 품목을 만드는 레시피」를 JSON 안을 뒤져 찾으면
39
+ * 다섯 드라이버에서 색인이 서지 않고, 그 질의는 MES 가 지시를 받을 때마다 부른다.
40
+ *
41
+ * 산출이 여럿인 레시피(부산물)에서는 **주 산출**을 적는다. 나머지는 `outputs` 가 든다.
42
+ */
43
+ materialDefinitionName: string;
44
+ /**
45
+ * 투입 — 커널 `RecipePart[]`(`material` · `qty` · `operation?`).
46
+ *
47
+ * `operation` 은 **이 투입이 들어가는 공정**이다. 없으면 오더 착수에 확보한다. 그 태그가 여기 있는
48
+ * 이유는 품목별 소요가 사는 자리가 레시피이기 때문이다.
49
+ */
50
+ inputs: Record<string, unknown>[];
51
+ /** 산출 — 커널 `RecipePart[]`. 부산물이 있으면 여기 함께 든다. */
52
+ outputs: Record<string, unknown>[];
53
+ /**
54
+ * 이 산출물을 만드는 공정 라우팅 — `RouteDefinition.name`(커널 `RecipeDef.route`).
55
+ *
56
+ * 순서는 라우팅이 소유하고 레시피는 그것을 가리킨다. 레시피에 단계 목록을 또 두면 두 목록이 어긋날 수
57
+ * 있고, 어긋났을 때 어느 쪽이 맞는지 말할 근거가 없다.
58
+ */
59
+ route?: string;
60
+ /** 언제부터 유효한가 — 표준 `EffectiveStartDate`. */
61
+ effectiveStart?: Date;
62
+ /**
63
+ * 언제까지 유효한가 — 표준 `EffectiveEndDate`.
64
+ *
65
+ * **개정할 때 행을 고치지 않고 이 칸을 채우고 새 행을 세운다.** 고치면 그 레시피로 만든 지난 실적이
66
+ * 어느 배합으로 만든 것인지 잃는다.
67
+ */
68
+ effectiveEnd?: Date;
69
+ createdAt?: Date;
70
+ updatedAt?: Date;
71
+ creator?: User;
72
+ creatorId?: string;
73
+ updater?: User;
74
+ updaterId?: string;
75
+ }