@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,289 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.claimAt = claimAt;
4
+ exports.hasAssignmentHistory = hasAssignmentHistory;
5
+ exports.claimsDuring = claimsDuring;
6
+ exports.recordClaim = recordClaim;
7
+ exports.projectDueClaims = projectDueClaims;
8
+ exports.valueOnRow = valueOnRow;
9
+ const typeorm_1 = require("typeorm");
10
+ const shell_1 = require("@things-factory/shell");
11
+ const master_axis_1 = require("../master-axis");
12
+ const master_value_claim_1 = require("./master-value-claim");
13
+ const assignment_write_1 = require("./assignment-write");
14
+ const ms = (at) => at.getTime();
15
+ /** 그 기록시점에 서 있던 주장들 — 물러난 것은 뺀다. */
16
+ async function standingClaims(manager, domain, target, asOfRecord) {
17
+ const rows = await manager.find(master_value_claim_1.MasterValueClaim, {
18
+ where: { domain: { id: domain.id }, axis: target.axis, rowId: target.rowId, field: target.field }
19
+ });
20
+ const at = asOfRecord ? ms(asOfRecord) : undefined;
21
+ return rows.filter(one => {
22
+ /* 그 시점 뒤에 적힌 주장은 그때 몰랐다. */
23
+ if (at !== undefined && ms(one.recordedAt) > at)
24
+ return false;
25
+ /* 그 시점에 이미 물러났으면 안 본다. 그 뒤에 물러난 것은 그때는 서 있었다. */
26
+ return !(one.supersededAt && (at === undefined || ms(one.supersededAt) <= at));
27
+ });
28
+ }
29
+ /**
30
+ * 그 업무시각에 유효했던 주장.
31
+ *
32
+ * **없으면 `undefined` 다 — 「선언 없음」과 다르다.** 선언 없음은 `value` 가 `null` 인 주장이 있는
33
+ * 것이고, 여기서 `undefined` 는 **그때 무엇이었는지 모른다**는 뜻이다.
34
+ */
35
+ async function claimAt(manager, domain, target, at) {
36
+ const standing = await standingClaims(manager, domain, target, at.asOfRecord);
37
+ const when = ms(at.asOfBusiness);
38
+ const covering = standing.filter(one => (!one.validFrom || ms(one.validFrom) <= when) && (!one.validTo || when < ms(one.validTo)));
39
+ if (covering.length > 1) {
40
+ throw new shell_1.Refusal('master-value-claim-conflict', { axis: target.axis, field: target.field, at: at.asOfBusiness.toISOString() }, 'two assignment claims cover the same moment. fix the history before asking.');
41
+ }
42
+ return covering[0];
43
+ }
44
+ /**
45
+ * 이 대상에 **주장이 한 건이라도 있나** — 창 밖의 것까지 센다.
46
+ *
47
+ * 창 안에 없는 것과 아예 없는 것은 다른 사실이다. 아예 없으면 이 설치본이 아직 이력을 안 쓰는
48
+ * 것이고, 있는데 그 창을 안 덮으면 **구멍**이다. 부르는 쪽이 둘을 다르게 다뤄야 해서 따로 묻는다.
49
+ */
50
+ async function hasAssignmentHistory(manager, domain, target) {
51
+ const count = await manager.count(master_value_claim_1.MasterValueClaim, {
52
+ where: { domain: { id: domain.id }, axis: target.axis, rowId: target.rowId, field: target.field }
53
+ });
54
+ return count > 0;
55
+ }
56
+ /** 한 창을 덮는 주장들 — **계산 구간을 나눌 경계**가 여기서 나온다. 시작 시각 순이다. */
57
+ async function claimsDuring(manager, domain, target, window, asOfRecord) {
58
+ const standing = await standingClaims(manager, domain, target, asOfRecord);
59
+ const from = ms(window.from);
60
+ const to = ms(window.to);
61
+ return standing
62
+ .filter(one => (!one.validFrom || ms(one.validFrom) < to) && (!one.validTo || from < ms(one.validTo)))
63
+ .sort((a, b) => (a.validFrom ? ms(a.validFrom) : -Infinity) - (b.validFrom ? ms(b.validFrom) : -Infinity));
64
+ }
65
+ /**
66
+ * 주장을 남긴다. **정정이면 겹치는 것을 물러나게 하고 앞뒤 조각을 다시 주장한다.**
67
+ *
68
+ * 부르는 쪽이 마스터 변경과 **같은 트랜잭션**으로 부른다 — 갈라지면 값은 바뀌고 이력은 없는 상태가
69
+ * 생긴다.
70
+ */
71
+ async function recordClaim(manager, domain, said, now = new Date()) {
72
+ const declared = (0, master_value_claim_1.claimedField)(said.target.axis, said.target.field);
73
+ if (!declared) {
74
+ throw new shell_1.Refusal('assignment-field-not-declared', { axis: said.target.axis, field: said.target.field }, 'this field does not keep an assignment history. declare it first.');
75
+ }
76
+ await assertUsableValue(manager, domain, declared, said, now);
77
+ /*
78
+ * **주장은 늘 식별자로 가리킨다.** 부르는 쪽이 이름을 줘도 여기서 푼다 — 한 자리에서 풀지 않으면
79
+ * 어떤 길로는 이름이 그대로 들어가고, 그 줄은 이름을 바꾸는 날 끊긴다.
80
+ */
81
+ const value = await normalisedValue(manager, domain, declared, said.value);
82
+ const validFrom = said.validFrom ?? now;
83
+ const validTo = said.validTo;
84
+ let standing = await standingClaims(manager, domain, said.target, undefined);
85
+ /*
86
+ * ── 첫 주장이면 **바뀌기 전 값도 같이 적는다** (2026-09-23) ───────────────
87
+ * 새 값만 적으면 그 앞이 통째로 구멍이 된다 — 3월에 옮긴 설비의 2월을 아무 주장도 안 덮는다.
88
+ * 그래서 그 칸이 처음 바뀔 때 옛 값을 `[?, 이 시각)` 으로 같이 세운다. 앞끝은 비운다: 언제부터
89
+ * 그랬는지는 아무도 안 적었고, 시각을 지어내면 적은 적 없는 것이 적힌 것이 된다.
90
+ *
91
+ * 이것 덕분에 **아무것도 안 눌러도 된다.** 주장이 하나도 없다는 것은 「이 칸은 한 번도 안 바뀌었다」
92
+ * 는 뜻이 되고, 그때는 오늘 값이 과거에도 그 값이었다. 채택이라는 절차가 필요 없어진다.
93
+ */
94
+ if (!standing.length && said.previous !== undefined && said.reason !== 'initial') {
95
+ await manager.save(master_value_claim_1.MasterValueClaim, {
96
+ domain,
97
+ axis: said.target.axis,
98
+ rowId: said.target.rowId,
99
+ field: said.target.field,
100
+ value: said.previous,
101
+ validFrom: null,
102
+ validTo: validFrom,
103
+ recordedAt: now,
104
+ reason: 'initial',
105
+ recorder: said.recorder
106
+ });
107
+ standing = await standingClaims(manager, domain, said.target, undefined);
108
+ }
109
+ const from = ms(validFrom);
110
+ const to = validTo ? ms(validTo) : undefined;
111
+ const overlapping = standing.filter(one => {
112
+ const start = one.validFrom ? ms(one.validFrom) : Number.NEGATIVE_INFINITY;
113
+ const end = one.validTo ? ms(one.validTo) : undefined;
114
+ return (to === undefined || start < to) && (end === undefined || from < end);
115
+ });
116
+ /*
117
+ * **읽은 뒤에 바뀌었으면 거절한다.** 부르는 쪽이 읽은 것을 주면 지금 서 있는 것과 견준다 —
118
+ * 다르면 그 사이에 누가 고친 것이고, 내 정정이 그 판단을 덮는다.
119
+ */
120
+ if (said.expecting) {
121
+ const now = new Set(overlapping.map(one => one.id));
122
+ const read = new Set(said.expecting);
123
+ const changed = now.size !== read.size || [...now].some(id => !read.has(id));
124
+ if (changed) {
125
+ throw new shell_1.Refusal('master-value-claim-superseded', { axis: said.target.axis, field: said.target.field }, 'this history changed while you were editing. read it again and decide again.');
126
+ }
127
+ }
128
+ for (const one of overlapping) {
129
+ /*
130
+ * 이미 물러난 것을 다시 물러나게 하려는 것은 **동시 정정**이다. 덮지 않고 거절한다.
131
+ */
132
+ if (one.supersededAt) {
133
+ throw new shell_1.Refusal('master-value-claim-superseded', { axis: said.target.axis, field: said.target.field }, 'this history changed while you were editing. read it again and decide again.');
134
+ }
135
+ await manager.save(master_value_claim_1.MasterValueClaim, { ...one, supersededAt: now });
136
+ /* 앞 조각 — 물러난 주장이 이 정정보다 먼저 시작했으면 그만큼은 그대로였다. 앞끝이 비면 「쭉」이다. */
137
+ if (!one.validFrom || ms(one.validFrom) < from) {
138
+ await manager.save(master_value_claim_1.MasterValueClaim, {
139
+ domain, axis: said.target.axis, rowId: said.target.rowId, field: said.target.field,
140
+ value: one.value ?? null, validFrom: one.validFrom, validTo: validFrom,
141
+ recordedAt: now, reason: 'remainder', recorder: said.recorder
142
+ });
143
+ }
144
+ /* 뒤 조각 — 정정이 끝난 뒤에도 그 주장이 이어졌으면 그만큼도 그대로였다. */
145
+ const end = one.validTo ? ms(one.validTo) : undefined;
146
+ if (to !== undefined && (end === undefined || end > to)) {
147
+ await manager.save(master_value_claim_1.MasterValueClaim, {
148
+ domain, axis: said.target.axis, rowId: said.target.rowId, field: said.target.field,
149
+ value: one.value ?? null, validFrom: validTo, validTo: one.validTo,
150
+ recordedAt: now, reason: 'remainder', recorder: said.recorder
151
+ });
152
+ }
153
+ }
154
+ return manager.save(master_value_claim_1.MasterValueClaim, {
155
+ domain, axis: said.target.axis, rowId: said.target.rowId, field: said.target.field,
156
+ value, validFrom, validTo, recordedAt: now, reason: said.reason, recorder: said.recorder
157
+ });
158
+ }
159
+ /**
160
+ * 도래한 미래 주장을 마스터 행에 옮긴다 — **앱의 주기 작업이 부른다.**
161
+ *
162
+ * ops-master 는 라이브러리라 스스로 돌지 않는다. 그 사이 본행은 낡아 있고, **정확해야 하는 소비처는
163
+ * 본행이 아니라 주장을 읽는다.**
164
+ */
165
+ async function projectDueClaims(manager, domain, entities, now = new Date()) {
166
+ let moved = 0;
167
+ for (const { axis, entity } of entities) {
168
+ const fields = [...new Set(claimedFieldsOfAxis(axis))];
169
+ for (const field of fields) {
170
+ const due = await manager.find(master_value_claim_1.MasterValueClaim, {
171
+ where: {
172
+ domain: { id: domain.id }, axis, field,
173
+ supersededAt: (0, typeorm_1.IsNull)(), validFrom: (0, typeorm_1.LessThanOrEqual)(now), reason: (0, typeorm_1.Not)('remainder')
174
+ }
175
+ });
176
+ for (const claim of due) {
177
+ const current = await claimAt(manager, domain, { axis, rowId: claim.rowId, field }, { asOfBusiness: now });
178
+ if (!current || current.id !== claim.id) {
179
+ continue;
180
+ }
181
+ const row = await manager.findOne(entity, { where: { id: claim.rowId, domain: { id: domain.id } } });
182
+ if (!row) {
183
+ continue;
184
+ }
185
+ const next = valueOnRow(claim);
186
+ if (row[field] !== next) {
187
+ await manager.save(entity, { ...row, [field]: next });
188
+ moved++;
189
+ }
190
+ }
191
+ }
192
+ }
193
+ return moved;
194
+ }
195
+ function claimedFieldsOfAxis(axis) {
196
+ return master_value_claim_1.CLAIMED_FIELDS.filter(one => one.axis === axis).map(one => one.field);
197
+ }
198
+ /**
199
+ * 주장의 값을 마스터 칸이 드는 모양으로. 「선언 없음」은 `null` 이다.
200
+ *
201
+ * ⚠ **관계 칸에는 이름을 돌려준다** — 그 칸이 이름을 담기 때문이다. 식별자는 주장 안에만 있고,
202
+ * 그것이 이름이 바뀌어도 과거가 안 끊기는 까닭이다.
203
+ */
204
+ function valueOnRow(claim) {
205
+ const value = claim.value;
206
+ if (value === null || value === undefined) {
207
+ return null;
208
+ }
209
+ if (Array.isArray(value.names)) {
210
+ return value.names;
211
+ }
212
+ const said = value;
213
+ return said.label ?? said.ref ?? null;
214
+ }
215
+ /**
216
+ * 값이 이 칸의 모양인가, 그리고 **우리 도메인의 것인가.**
217
+ *
218
+ * 다른 도메인의 행을 가리키면 그 도메인이 자기 자료를 고쳐도 이쪽 과거가 흔들린다. 그리고 부모
219
+ * 관계는 **그 시점에** 도는지 본다 — 지금 안 돌아도 그때는 돌 수 있다.
220
+ */
221
+ async function assertUsableValue(manager, domain, declared, said, now) {
222
+ const value = said.value;
223
+ if (value === null || value === undefined) {
224
+ return;
225
+ }
226
+ if (declared.kind === 'literal') {
227
+ if (typeof value.literal !== 'string') {
228
+ throw new shell_1.Refusal('claim-value-shape', { field: declared.field }, 'this field takes the value itself, as written.');
229
+ }
230
+ return;
231
+ }
232
+ if (declared.kind === 'names') {
233
+ if (!Array.isArray(value.names)) {
234
+ throw new shell_1.Refusal('assignment-value-shape', { field: declared.field }, 'this field takes a list of names.');
235
+ }
236
+ return;
237
+ }
238
+ const ref = value.ref;
239
+ if (typeof ref !== 'string' || !ref) {
240
+ throw new shell_1.Refusal('assignment-value-shape', { field: declared.field }, 'this field points at a row, so it needs that row identifier — not its name.');
241
+ }
242
+ const axis = master_axis_1.MASTER_AXES.find(one => one.key === declared.target);
243
+ if (!axis) {
244
+ return;
245
+ }
246
+ /* 이름으로 적힌 칸도 있으므로 둘 다 찾아 본다(§`rowOf`). */
247
+ const pointed = await (0, assignment_write_1.rowOf)(manager, domain, declared.target, ref);
248
+ if (!pointed) {
249
+ throw new shell_1.Refusal('assignment-value-unknown', { field: declared.field, ref }, 'that row is not in this site. point at a row that is.');
250
+ }
251
+ if (declared.field === 'parentId') {
252
+ /*
253
+ * **푼 식별자로 걷는다.** 안 풀고 걸으면 이름으로 온 값은 아무 주장도 못 찾아 고리를 그냥
254
+ * 지나간다 — 실제로 그랬다(2026-09-22).
255
+ */
256
+ await assertNoCycleAt(manager, domain, said.target.rowId, pointed.id, said.validFrom ?? now);
257
+ }
258
+ }
259
+ /** 그 시점의 부모 사슬을 걸어 본다. 자기 자신에 닿으면 고리다. */
260
+ async function assertNoCycleAt(manager, domain, rowId, parentRef, at) {
261
+ const walked = new Set([rowId]);
262
+ let cursor = parentRef;
263
+ while (cursor) {
264
+ if (walked.has(cursor)) {
265
+ throw new shell_1.Refusal('assignment-parent-cycle', { at: at.toISOString() }, 'this parent makes a loop at that moment. choose another parent.');
266
+ }
267
+ walked.add(cursor);
268
+ const claim = await claimAt(manager, domain, { axis: 'operationalLocation', rowId: cursor, field: 'parentId' }, { asOfBusiness: at });
269
+ cursor = claim ? (claim.value?.ref ?? undefined) : undefined;
270
+ }
271
+ }
272
+ /**
273
+ * 도입할 때 — **지금 값을 초기 상태로 적는다.**
274
+ *
275
+ * 과거를 소급해 만드는 것과 다르다. 「도입 시각에 이 값이었다는 것을 확인했다」는 주장이고, **그
276
+ * 전은 결측 그대로** 둔다. 이것이 없으면 **한 번도 안 옮긴 설비가 영영 이력이 빈다** — 그런 설비가
277
+ * 가장 많다.
278
+ *
279
+ * 이미 주장이 있는 행은 건너뛴다. 두 번 불러도 같다.
280
+ */
281
+ /** 이름으로 왔든 식별자로 왔든 **식별자와 그때의 이름**으로 만든다. */
282
+ async function normalisedValue(manager, domain, declared, value) {
283
+ if (!value || declared.kind !== 'relation') {
284
+ return value ?? null;
285
+ }
286
+ const found = await (0, assignment_write_1.rowOf)(manager, domain, declared.target, String(value.ref ?? ''));
287
+ return found ? { ref: found.id, label: found.name } : value;
288
+ }
289
+ //# sourceMappingURL=assignment-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assignment-history.js","sourceRoot":"","sources":["../../../server/service/assignment/assignment-history.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, IsNull, LessThanOrEqual, Not, ObjectLiteral } from 'typeorm'\nimport { Domain, Refusal } from '@things-factory/shell'\nimport { MASTER_AXES } from '../master-axis'\n\nimport { CLAIMED_FIELDS, MasterValueClaim, claimedField } from './master-value-claim'\nimport { rowOf, toClaimValue } from './assignment-write'\n\n/**\n * 주장을 남기고 읽는 규칙 — **덮어쓰지 않는다.**\n *\n * ── 정정이 양옆을 남긴다 ───────────────────────────────────────────────────\n * 겹치는 주장을 물러나게 하는 것만으로는 모자란다. `A [1일, ∞)` 에 「10~15는 B」를 정정하면 A 의\n * **앞뒤 조각을 같은 값으로 다시 주장**해야 최신 답이 `A·B·A` 가 된다. 조각도 새 주장이므로 정정 전\n * 기록시점으로 읽으면 원래 A 하나가 그대로 나온다.\n *\n * ── 동시 정정은 거절한다 ───────────────────────────────────────────────────\n * 물러나게 하려던 주장이 이미 물러나 있으면 충돌이다. **자동으로 다시 시도하지 않는다** — 덮으면\n * 한쪽의 판단이 사라진다. 다시 읽고 다시 정하는 것은 사람의 일이다.\n */\n\nexport interface ClaimAt {\n /** 어느 업무시각의 이야기인가. */\n asOfBusiness: Date\n /** 어느 기록시점까지 알려진 것만 볼 것인가. 안 주면 지금까지 아는 전부다. */\n asOfRecord?: Date\n}\n\nexport interface ClaimTarget {\n axis: string\n rowId: string\n field: string\n}\n\nconst ms = (at: Date) => at.getTime()\n\n/** 그 기록시점에 서 있던 주장들 — 물러난 것은 뺀다. */\nasync function standingClaims(\n manager: EntityManager,\n domain: Domain,\n target: ClaimTarget,\n asOfRecord?: Date\n): Promise<MasterValueClaim[]> {\n const rows = await manager.find(MasterValueClaim, {\n where: { domain: { id: domain.id }, axis: target.axis, rowId: target.rowId, field: target.field }\n })\n\n const at = asOfRecord ? ms(asOfRecord) : undefined\n\n return rows.filter(one => {\n /* 그 시점 뒤에 적힌 주장은 그때 몰랐다. */\n if (at !== undefined && ms(one.recordedAt) > at) return false\n\n /* 그 시점에 이미 물러났으면 안 본다. 그 뒤에 물러난 것은 그때는 서 있었다. */\n return !(one.supersededAt && (at === undefined || ms(one.supersededAt) <= at))\n })\n}\n\n/**\n * 그 업무시각에 유효했던 주장.\n *\n * **없으면 `undefined` 다 — 「선언 없음」과 다르다.** 선언 없음은 `value` 가 `null` 인 주장이 있는\n * 것이고, 여기서 `undefined` 는 **그때 무엇이었는지 모른다**는 뜻이다.\n */\nexport async function claimAt(\n manager: EntityManager,\n domain: Domain,\n target: ClaimTarget,\n at: ClaimAt\n): Promise<MasterValueClaim | undefined> {\n const standing = await standingClaims(manager, domain, target, at.asOfRecord)\n const when = ms(at.asOfBusiness)\n\n const covering = standing.filter(one => (!one.validFrom || ms(one.validFrom) <= when) && (!one.validTo || when < ms(one.validTo)))\n\n if (covering.length > 1) {\n throw new Refusal(\n 'master-value-claim-conflict',\n { axis: target.axis, field: target.field, at: at.asOfBusiness.toISOString() },\n 'two assignment claims cover the same moment. fix the history before asking.'\n )\n }\n\n return covering[0]\n}\n\n/**\n * 이 대상에 **주장이 한 건이라도 있나** — 창 밖의 것까지 센다.\n *\n * 창 안에 없는 것과 아예 없는 것은 다른 사실이다. 아예 없으면 이 설치본이 아직 이력을 안 쓰는\n * 것이고, 있는데 그 창을 안 덮으면 **구멍**이다. 부르는 쪽이 둘을 다르게 다뤄야 해서 따로 묻는다.\n */\nexport async function hasAssignmentHistory(\n manager: EntityManager,\n domain: Domain,\n target: ClaimTarget\n): Promise<boolean> {\n const count = await manager.count(MasterValueClaim, {\n where: { domain: { id: domain.id }, axis: target.axis, rowId: target.rowId, field: target.field }\n })\n\n return count > 0\n}\n\n/** 한 창을 덮는 주장들 — **계산 구간을 나눌 경계**가 여기서 나온다. 시작 시각 순이다. */\nexport async function claimsDuring(\n manager: EntityManager,\n domain: Domain,\n target: ClaimTarget,\n window: { from: Date; to: Date },\n asOfRecord?: Date\n): Promise<MasterValueClaim[]> {\n const standing = await standingClaims(manager, domain, target, asOfRecord)\n const from = ms(window.from)\n const to = ms(window.to)\n\n return standing\n .filter(one => (!one.validFrom || ms(one.validFrom) < to) && (!one.validTo || from < ms(one.validTo)))\n .sort((a, b) => (a.validFrom ? ms(a.validFrom) : -Infinity) - (b.validFrom ? ms(b.validFrom) : -Infinity))\n}\n\nexport interface RecordClaim {\n target: ClaimTarget\n value: Record<string, unknown> | null\n /** 언제부터 그러한가. 안 주면 지금부터다 — 그 기본값이 곧 「지금부터」라는 주장이다. */\n validFrom?: Date\n /** 언제까지. 정정에서만 쓴다. */\n validTo?: Date\n reason: 'initial' | 'change' | 'correction'\n recorder?: unknown\n /**\n * 바뀌기 전 값. **첫 주장일 때만 쓴다** — 그 앞을 덮는 줄을 같이 세운다.\n *\n * 부르는 쪽이 같은 트랜잭션에서 이미 알고 있는 값이다(`claimAssignmentChanges`).\n */\n previous?: Record<string, unknown> | null\n /**\n * 내가 읽었을 때 서 있던 주장들의 id.\n *\n * 주면 **그 사이에 누가 바꿨는지** 본다 — 화면에서 읽고 고치는 동안 다른 사람이 같은 구간을\n * 정정했으면 내 정정이 그것을 덮는다. 덮지 않고 거절한다.\n */\n expecting?: readonly string[]\n}\n\n/**\n * 주장을 남긴다. **정정이면 겹치는 것을 물러나게 하고 앞뒤 조각을 다시 주장한다.**\n *\n * 부르는 쪽이 마스터 변경과 **같은 트랜잭션**으로 부른다 — 갈라지면 값은 바뀌고 이력은 없는 상태가\n * 생긴다.\n */\nexport async function recordClaim(\n manager: EntityManager,\n domain: Domain,\n said: RecordClaim,\n now = new Date()\n): Promise<MasterValueClaim> {\n const declared = claimedField(said.target.axis, said.target.field)\n\n if (!declared) {\n throw new Refusal(\n 'assignment-field-not-declared',\n { axis: said.target.axis, field: said.target.field },\n 'this field does not keep an assignment history. declare it first.'\n )\n }\n\n await assertUsableValue(manager, domain, declared, said, now)\n\n /*\n * **주장은 늘 식별자로 가리킨다.** 부르는 쪽이 이름을 줘도 여기서 푼다 — 한 자리에서 풀지 않으면\n * 어떤 길로는 이름이 그대로 들어가고, 그 줄은 이름을 바꾸는 날 끊긴다.\n */\n const value = await normalisedValue(manager, domain, declared, said.value)\n\n const validFrom = said.validFrom ?? now\n const validTo = said.validTo\n let standing = await standingClaims(manager, domain, said.target, undefined)\n\n /*\n * ── 첫 주장이면 **바뀌기 전 값도 같이 적는다** (2026-09-23) ───────────────\n * 새 값만 적으면 그 앞이 통째로 구멍이 된다 — 3월에 옮긴 설비의 2월을 아무 주장도 안 덮는다.\n * 그래서 그 칸이 처음 바뀔 때 옛 값을 `[?, 이 시각)` 으로 같이 세운다. 앞끝은 비운다: 언제부터\n * 그랬는지는 아무도 안 적었고, 시각을 지어내면 적은 적 없는 것이 적힌 것이 된다.\n *\n * 이것 덕분에 **아무것도 안 눌러도 된다.** 주장이 하나도 없다는 것은 「이 칸은 한 번도 안 바뀌었다」\n * 는 뜻이 되고, 그때는 오늘 값이 과거에도 그 값이었다. 채택이라는 절차가 필요 없어진다.\n */\n if (!standing.length && said.previous !== undefined && said.reason !== 'initial') {\n await manager.save(MasterValueClaim, {\n domain,\n axis: said.target.axis,\n rowId: said.target.rowId,\n field: said.target.field,\n value: said.previous,\n validFrom: null,\n validTo: validFrom,\n recordedAt: now,\n reason: 'initial',\n recorder: said.recorder\n } as Partial<MasterValueClaim>)\n\n standing = await standingClaims(manager, domain, said.target, undefined)\n }\n const from = ms(validFrom)\n const to = validTo ? ms(validTo) : undefined\n\n const overlapping = standing.filter(one => {\n const start = one.validFrom ? ms(one.validFrom) : Number.NEGATIVE_INFINITY\n const end = one.validTo ? ms(one.validTo) : undefined\n\n return (to === undefined || start < to) && (end === undefined || from < end)\n })\n\n /*\n * **읽은 뒤에 바뀌었으면 거절한다.** 부르는 쪽이 읽은 것을 주면 지금 서 있는 것과 견준다 —\n * 다르면 그 사이에 누가 고친 것이고, 내 정정이 그 판단을 덮는다.\n */\n if (said.expecting) {\n const now = new Set(overlapping.map(one => one.id))\n const read = new Set(said.expecting)\n const changed = now.size !== read.size || [...now].some(id => !read.has(id))\n\n if (changed) {\n throw new Refusal(\n 'master-value-claim-superseded',\n { axis: said.target.axis, field: said.target.field },\n 'this history changed while you were editing. read it again and decide again.'\n )\n }\n }\n\n for (const one of overlapping) {\n /*\n * 이미 물러난 것을 다시 물러나게 하려는 것은 **동시 정정**이다. 덮지 않고 거절한다.\n */\n if (one.supersededAt) {\n throw new Refusal(\n 'master-value-claim-superseded',\n { axis: said.target.axis, field: said.target.field },\n 'this history changed while you were editing. read it again and decide again.'\n )\n }\n\n await manager.save(MasterValueClaim, { ...one, supersededAt: now })\n\n /* 앞 조각 — 물러난 주장이 이 정정보다 먼저 시작했으면 그만큼은 그대로였다. 앞끝이 비면 「쭉」이다. */\n if (!one.validFrom || ms(one.validFrom) < from) {\n await manager.save(MasterValueClaim, {\n domain, axis: said.target.axis, rowId: said.target.rowId, field: said.target.field,\n value: one.value ?? null, validFrom: one.validFrom, validTo: validFrom,\n recordedAt: now, reason: 'remainder', recorder: said.recorder\n } as Partial<MasterValueClaim>)\n }\n\n /* 뒤 조각 — 정정이 끝난 뒤에도 그 주장이 이어졌으면 그만큼도 그대로였다. */\n const end = one.validTo ? ms(one.validTo) : undefined\n\n if (to !== undefined && (end === undefined || end > to)) {\n await manager.save(MasterValueClaim, {\n domain, axis: said.target.axis, rowId: said.target.rowId, field: said.target.field,\n value: one.value ?? null, validFrom: validTo as Date, validTo: one.validTo,\n recordedAt: now, reason: 'remainder', recorder: said.recorder\n } as Partial<MasterValueClaim>)\n }\n }\n\n return manager.save(MasterValueClaim, {\n domain, axis: said.target.axis, rowId: said.target.rowId, field: said.target.field,\n value, validFrom, validTo, recordedAt: now, reason: said.reason, recorder: said.recorder\n } as Partial<MasterValueClaim>)\n}\n\n/**\n * 도래한 미래 주장을 마스터 행에 옮긴다 — **앱의 주기 작업이 부른다.**\n *\n * ops-master 는 라이브러리라 스스로 돌지 않는다. 그 사이 본행은 낡아 있고, **정확해야 하는 소비처는\n * 본행이 아니라 주장을 읽는다.**\n */\nexport async function projectDueClaims(\n manager: EntityManager,\n domain: Domain,\n entities: { axis: string; entity: Function }[],\n now = new Date()\n): Promise<number> {\n let moved = 0\n\n for (const { axis, entity } of entities) {\n const fields = [...new Set(claimedFieldsOfAxis(axis))]\n\n for (const field of fields) {\n const due = await manager.find(MasterValueClaim, {\n where: {\n domain: { id: domain.id }, axis, field,\n supersededAt: IsNull(), validFrom: LessThanOrEqual(now), reason: Not('remainder')\n }\n })\n\n for (const claim of due) {\n const current = await claimAt(manager, domain, { axis, rowId: claim.rowId, field }, { asOfBusiness: now })\n\n if (!current || current.id !== claim.id) {\n continue\n }\n\n const row = await manager.findOne(entity as never, { where: { id: claim.rowId, domain: { id: domain.id } } } as never)\n\n if (!row) {\n continue\n }\n\n const next = valueOnRow(claim)\n\n if ((row as Record<string, unknown>)[field] !== next) {\n await manager.save(entity as never, { ...(row as object), [field]: next } as never)\n moved++\n }\n }\n }\n }\n\n return moved\n}\n\nfunction claimedFieldsOfAxis(axis: string): string[] {\n return CLAIMED_FIELDS.filter(one => one.axis === axis).map(one => one.field)\n}\n\n/**\n * 주장의 값을 마스터 칸이 드는 모양으로. 「선언 없음」은 `null` 이다.\n *\n * ⚠ **관계 칸에는 이름을 돌려준다** — 그 칸이 이름을 담기 때문이다. 식별자는 주장 안에만 있고,\n * 그것이 이름이 바뀌어도 과거가 안 끊기는 까닭이다.\n */\nexport function valueOnRow(claim: MasterValueClaim): unknown {\n const value = claim.value\n\n if (value === null || value === undefined) {\n return null\n }\n\n if (Array.isArray((value as { names?: unknown }).names)) {\n return (value as { names: unknown[] }).names\n }\n\n const said = value as { ref?: unknown; label?: unknown }\n\n return said.label ?? said.ref ?? null\n}\n\n/**\n * 값이 이 칸의 모양인가, 그리고 **우리 도메인의 것인가.**\n *\n * 다른 도메인의 행을 가리키면 그 도메인이 자기 자료를 고쳐도 이쪽 과거가 흔들린다. 그리고 부모\n * 관계는 **그 시점에** 도는지 본다 — 지금 안 돌아도 그때는 돌 수 있다.\n */\nasync function assertUsableValue(\n manager: EntityManager,\n domain: Domain,\n declared: { axis: string; field: string; kind: 'relation' | 'names' | 'literal'; target?: string },\n said: RecordClaim,\n now: Date\n): Promise<void> {\n const value = said.value\n\n if (value === null || value === undefined) {\n return\n }\n\n if (declared.kind === 'literal') {\n if (typeof (value as { literal?: unknown }).literal !== 'string') {\n throw new Refusal('claim-value-shape', { field: declared.field }, 'this field takes the value itself, as written.')\n }\n\n return\n }\n\n if (declared.kind === 'names') {\n if (!Array.isArray((value as { names?: unknown }).names)) {\n throw new Refusal('assignment-value-shape', { field: declared.field }, 'this field takes a list of names.')\n }\n\n return\n }\n\n const ref = (value as { ref?: unknown }).ref\n\n if (typeof ref !== 'string' || !ref) {\n throw new Refusal(\n 'assignment-value-shape',\n { field: declared.field },\n 'this field points at a row, so it needs that row identifier — not its name.'\n )\n }\n\n const axis = MASTER_AXES.find(one => one.key === declared.target)\n\n if (!axis) {\n return\n }\n\n /* 이름으로 적힌 칸도 있으므로 둘 다 찾아 본다(§`rowOf`). */\n const pointed = await rowOf(manager, domain, declared.target, ref)\n\n if (!pointed) {\n throw new Refusal(\n 'assignment-value-unknown',\n { field: declared.field, ref },\n 'that row is not in this site. point at a row that is.'\n )\n }\n\n if (declared.field === 'parentId') {\n /*\n * **푼 식별자로 걷는다.** 안 풀고 걸으면 이름으로 온 값은 아무 주장도 못 찾아 고리를 그냥\n * 지나간다 — 실제로 그랬다(2026-09-22).\n */\n await assertNoCycleAt(manager, domain, said.target.rowId, pointed.id, said.validFrom ?? now)\n }\n}\n\n/** 그 시점의 부모 사슬을 걸어 본다. 자기 자신에 닿으면 고리다. */\nasync function assertNoCycleAt(\n manager: EntityManager,\n domain: Domain,\n rowId: string,\n parentRef: string,\n at: Date\n): Promise<void> {\n const walked = new Set<string>([rowId])\n let cursor: string | undefined = parentRef\n\n while (cursor) {\n if (walked.has(cursor)) {\n throw new Refusal(\n 'assignment-parent-cycle',\n { at: at.toISOString() },\n 'this parent makes a loop at that moment. choose another parent.'\n )\n }\n\n walked.add(cursor)\n\n const claim = await claimAt(manager, domain, { axis: 'operationalLocation', rowId: cursor, field: 'parentId' }, { asOfBusiness: at })\n\n cursor = claim ? ((claim.value as { ref?: string } | null)?.ref ?? undefined) : undefined\n }\n}\n\n/**\n * 도입할 때 — **지금 값을 초기 상태로 적는다.**\n *\n * 과거를 소급해 만드는 것과 다르다. 「도입 시각에 이 값이었다는 것을 확인했다」는 주장이고, **그\n * 전은 결측 그대로** 둔다. 이것이 없으면 **한 번도 안 옮긴 설비가 영영 이력이 빈다** — 그런 설비가\n * 가장 많다.\n *\n * 이미 주장이 있는 행은 건너뛴다. 두 번 불러도 같다.\n */\n\n/** 이름으로 왔든 식별자로 왔든 **식별자와 그때의 이름**으로 만든다. */\nasync function normalisedValue(\n manager: EntityManager,\n domain: Domain,\n declared: { kind: 'relation' | 'names' | 'literal'; target?: string },\n value: Record<string, unknown> | null | undefined\n): Promise<Record<string, unknown> | null> {\n if (!value || declared.kind !== 'relation') {\n return value ?? null\n }\n\n const found = await rowOf(manager, domain, declared.target, String((value as { ref?: unknown }).ref ?? ''))\n\n return found ? { ref: found.id, label: found.name } : value\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { EntityManager, ObjectLiteral } from 'typeorm';
2
+ import { Domain } from '@things-factory/shell';
3
+ import { claimedField } from './master-value-claim';
4
+ /**
5
+ * 그리드가 보낸 변경에서 **배정·선언 칸을 골라 주장으로 남긴다.**
6
+ *
7
+ * ── 왜 본행을 되돌려 놓나 ──────────────────────────────────────────────────
8
+ * 적용 시각이 미래면 **본행은 그대로여야 한다.** 그리드는 값을 보냈지만 그것은 「다음 달부터」라는
9
+ * 뜻이고, 오늘의 값이 아니다. 그래서 `keepOnRow` 로 옛 값을 되돌려 저장에 얹는다 — 도래하면
10
+ * `projectDueClaims` 가 옮긴다.
11
+ *
12
+ * ── 마스터 변경과 한 트랜잭션이다 ──────────────────────────────────────────
13
+ * 부르는 쪽이 `saveMasterPatches` 안이므로 같은 `manager` 다. 갈라지면 값은 바뀌고 이력은 없는
14
+ * 상태가 생긴다.
15
+ */
16
+ export declare function claimAssignmentChanges(manager: EntityManager, domain: Domain, axis: string, found: ObjectLiteral, values: ObjectLiteral, user: unknown, options: {
17
+ appliedAt?: Date;
18
+ appliedKind?: 'change' | 'correction';
19
+ appliedUntil?: Date;
20
+ }): Promise<{
21
+ keepOnRow: ObjectLiteral;
22
+ }>;
23
+ /**
24
+ * 마스터 칸의 값 → 주장의 값. 「선언 없음」은 `null` 이다.
25
+ *
26
+ * ⚠ **관계 칸은 UUID 가 아니라 이름을 담는다.** `ops_equipment.home_location` 에 `UNCOIL-01` 이
27
+ * 들어 있고, `parentId` 는 id 일 수도 이름일 수도 있다(이 제품의 규약). 처음에 칸 값을 그대로
28
+ * 식별자로 썼다가 **정상 편집이 전부 거절됐다**(2026-09-22, 화면에서 드러남).
29
+ *
30
+ * 그래서 여기서 **가리키는 행을 찾아 식별자와 그때의 이름을 함께 담는다.** 마스터 칸은 그대로
31
+ * 이름을 들고, 주장은 이름이 바뀌어도 안 끊긴다.
32
+ */
33
+ export declare function toClaimValue(manager: EntityManager, domain: Domain, declared: {
34
+ kind: 'relation' | 'names' | 'literal';
35
+ target?: string;
36
+ }, value: unknown): Promise<Record<string, unknown> | null>;
37
+ /** 이름으로도 id 로도 찾는다 — 이 제품의 관계 칸이 둘 다 담는다. */
38
+ export declare function rowOf(manager: EntityManager, domain: Domain, targetAxis: string | undefined, given: string): Promise<{
39
+ id: string;
40
+ name: string;
41
+ } | undefined>;
42
+ export { claimedField };
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.claimedField = void 0;
4
+ exports.claimAssignmentChanges = claimAssignmentChanges;
5
+ exports.toClaimValue = toClaimValue;
6
+ exports.rowOf = rowOf;
7
+ const master_value_claim_1 = require("./master-value-claim");
8
+ Object.defineProperty(exports, "claimedField", { enumerable: true, get: function () { return master_value_claim_1.claimedField; } });
9
+ const master_axis_1 = require("../master-axis");
10
+ const assignment_history_1 = require("./assignment-history");
11
+ /**
12
+ * 그리드가 보낸 변경에서 **배정·선언 칸을 골라 주장으로 남긴다.**
13
+ *
14
+ * ── 왜 본행을 되돌려 놓나 ──────────────────────────────────────────────────
15
+ * 적용 시각이 미래면 **본행은 그대로여야 한다.** 그리드는 값을 보냈지만 그것은 「다음 달부터」라는
16
+ * 뜻이고, 오늘의 값이 아니다. 그래서 `keepOnRow` 로 옛 값을 되돌려 저장에 얹는다 — 도래하면
17
+ * `projectDueClaims` 가 옮긴다.
18
+ *
19
+ * ── 마스터 변경과 한 트랜잭션이다 ──────────────────────────────────────────
20
+ * 부르는 쪽이 `saveMasterPatches` 안이므로 같은 `manager` 다. 갈라지면 값은 바뀌고 이력은 없는
21
+ * 상태가 생긴다.
22
+ */
23
+ async function claimAssignmentChanges(manager, domain, axis, found, values, user, options) {
24
+ const keepOnRow = {};
25
+ const fields = master_value_claim_1.CLAIMED_FIELDS.filter(one => one.axis === axis);
26
+ if (!fields.length) {
27
+ return { keepOnRow };
28
+ }
29
+ const now = new Date();
30
+ const appliedAt = options.appliedAt ?? now;
31
+ const future = appliedAt.getTime() > now.getTime();
32
+ for (const declared of fields) {
33
+ if (!(declared.field in values)) {
34
+ continue;
35
+ }
36
+ const next = values[declared.field];
37
+ /* 안 바뀐 칸은 주장을 남기지 않는다 — 같은 값을 다시 적으면 이력이 뜻 없이 길어진다. */
38
+ if (sameValue(found[declared.field], next)) {
39
+ continue;
40
+ }
41
+ await (0, assignment_history_1.recordClaim)(manager, domain, {
42
+ target: { axis, rowId: String(found.id), field: declared.field },
43
+ value: await toClaimValue(manager, domain, declared, next),
44
+ /* 바뀌기 전 값 — 첫 주장이면 그 앞을 덮는 줄이 같이 선다(§`recordClaim`). */
45
+ previous: await toClaimValue(manager, domain, declared, found[declared.field]),
46
+ validFrom: appliedAt,
47
+ validTo: options.appliedUntil,
48
+ reason: options.appliedKind === 'correction' ? 'correction' : 'change',
49
+ recorder: user
50
+ }, now);
51
+ if (future) {
52
+ keepOnRow[declared.field] = found[declared.field] ?? null;
53
+ }
54
+ }
55
+ return { keepOnRow };
56
+ }
57
+ /**
58
+ * 마스터 칸의 값 → 주장의 값. 「선언 없음」은 `null` 이다.
59
+ *
60
+ * ⚠ **관계 칸은 UUID 가 아니라 이름을 담는다.** `ops_equipment.home_location` 에 `UNCOIL-01` 이
61
+ * 들어 있고, `parentId` 는 id 일 수도 이름일 수도 있다(이 제품의 규약). 처음에 칸 값을 그대로
62
+ * 식별자로 썼다가 **정상 편집이 전부 거절됐다**(2026-09-22, 화면에서 드러남).
63
+ *
64
+ * 그래서 여기서 **가리키는 행을 찾아 식별자와 그때의 이름을 함께 담는다.** 마스터 칸은 그대로
65
+ * 이름을 들고, 주장은 이름이 바뀌어도 안 끊긴다.
66
+ */
67
+ async function toClaimValue(manager, domain, declared, value) {
68
+ if (value === null || value === undefined || value === '') {
69
+ return null;
70
+ }
71
+ /* 값 그 자체인 칸 — 가리키는 것이 없으므로 푸는 일도 없다. */
72
+ if (declared.kind === 'literal') {
73
+ return { literal: String(value) };
74
+ }
75
+ if (declared.kind === 'names') {
76
+ return { names: Array.isArray(value) ? value.map(String) : [String(value)] };
77
+ }
78
+ const found = await rowOf(manager, domain, declared.target, String(value));
79
+ /* 못 찾으면 그대로 담는다 — 검증이 그 다음에 거절한다. 여기서 지어내지 않는다. */
80
+ return found ? { ref: found.id, label: found.name } : { ref: String(value) };
81
+ }
82
+ /** 이름으로도 id 로도 찾는다 — 이 제품의 관계 칸이 둘 다 담는다. */
83
+ async function rowOf(manager, domain, targetAxis, given) {
84
+ const axis = master_axis_1.MASTER_AXES.find(one => one.key === targetAxis);
85
+ if (!axis) {
86
+ return undefined;
87
+ }
88
+ const byId = UUID.test(given)
89
+ ? await manager.findOne(axis.entity, { where: { id: given, domain: { id: domain.id } } })
90
+ : undefined;
91
+ const found = byId ?? (await manager.findOne(axis.entity, { where: { name: given, domain: { id: domain.id } } }));
92
+ return found;
93
+ }
94
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
95
+ function sameValue(before, after) {
96
+ if (Array.isArray(before) || Array.isArray(after)) {
97
+ return JSON.stringify(before ?? null) === JSON.stringify(after ?? null);
98
+ }
99
+ return (before ?? null) === (after ?? null);
100
+ }
101
+ //# sourceMappingURL=assignment-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assignment-write.js","sourceRoot":"","sources":["../../../server/service/assignment/assignment-write.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, ObjectLiteral } from 'typeorm'\nimport { Domain } from '@things-factory/shell'\n\nimport { CLAIMED_FIELDS, claimedField } from './master-value-claim'\nimport { MASTER_AXES } from '../master-axis'\nimport { recordClaim } from './assignment-history'\n\n/**\n * 그리드가 보낸 변경에서 **배정·선언 칸을 골라 주장으로 남긴다.**\n *\n * ── 왜 본행을 되돌려 놓나 ──────────────────────────────────────────────────\n * 적용 시각이 미래면 **본행은 그대로여야 한다.** 그리드는 값을 보냈지만 그것은 「다음 달부터」라는\n * 뜻이고, 오늘의 값이 아니다. 그래서 `keepOnRow` 로 옛 값을 되돌려 저장에 얹는다 — 도래하면\n * `projectDueClaims` 가 옮긴다.\n *\n * ── 마스터 변경과 한 트랜잭션이다 ──────────────────────────────────────────\n * 부르는 쪽이 `saveMasterPatches` 안이므로 같은 `manager` 다. 갈라지면 값은 바뀌고 이력은 없는\n * 상태가 생긴다.\n */\nexport async function claimAssignmentChanges(\n manager: EntityManager,\n domain: Domain,\n axis: string,\n found: ObjectLiteral,\n values: ObjectLiteral,\n user: unknown,\n options: { appliedAt?: Date; appliedKind?: 'change' | 'correction'; appliedUntil?: Date }\n): Promise<{ keepOnRow: ObjectLiteral }> {\n const keepOnRow: ObjectLiteral = {}\n const fields = CLAIMED_FIELDS.filter(one => one.axis === axis)\n\n if (!fields.length) {\n return { keepOnRow }\n }\n\n const now = new Date()\n const appliedAt = options.appliedAt ?? now\n const future = appliedAt.getTime() > now.getTime()\n\n for (const declared of fields) {\n if (!(declared.field in values)) {\n continue\n }\n\n const next = values[declared.field]\n\n /* 안 바뀐 칸은 주장을 남기지 않는다 — 같은 값을 다시 적으면 이력이 뜻 없이 길어진다. */\n if (sameValue(found[declared.field], next)) {\n continue\n }\n\n await recordClaim(\n manager,\n domain,\n {\n target: { axis, rowId: String(found.id), field: declared.field },\n value: await toClaimValue(manager, domain, declared, next),\n /* 바뀌기 전 값 — 첫 주장이면 그 앞을 덮는 줄이 같이 선다(§`recordClaim`). */\n previous: await toClaimValue(manager, domain, declared, found[declared.field]),\n validFrom: appliedAt,\n validTo: options.appliedUntil,\n reason: options.appliedKind === 'correction' ? 'correction' : 'change',\n recorder: user\n },\n now\n )\n\n if (future) {\n keepOnRow[declared.field] = found[declared.field] ?? null\n }\n }\n\n return { keepOnRow }\n}\n\n/**\n * 마스터 칸의 값 → 주장의 값. 「선언 없음」은 `null` 이다.\n *\n * ⚠ **관계 칸은 UUID 가 아니라 이름을 담는다.** `ops_equipment.home_location` 에 `UNCOIL-01` 이\n * 들어 있고, `parentId` 는 id 일 수도 이름일 수도 있다(이 제품의 규약). 처음에 칸 값을 그대로\n * 식별자로 썼다가 **정상 편집이 전부 거절됐다**(2026-09-22, 화면에서 드러남).\n *\n * 그래서 여기서 **가리키는 행을 찾아 식별자와 그때의 이름을 함께 담는다.** 마스터 칸은 그대로\n * 이름을 들고, 주장은 이름이 바뀌어도 안 끊긴다.\n */\nexport async function toClaimValue(\n manager: EntityManager,\n domain: Domain,\n declared: { kind: 'relation' | 'names' | 'literal'; target?: string },\n value: unknown\n): Promise<Record<string, unknown> | null> {\n if (value === null || value === undefined || value === '') {\n return null\n }\n\n /* 값 그 자체인 칸 — 가리키는 것이 없으므로 푸는 일도 없다. */\n if (declared.kind === 'literal') {\n return { literal: String(value) }\n }\n\n if (declared.kind === 'names') {\n return { names: Array.isArray(value) ? value.map(String) : [String(value)] }\n }\n\n const found = await rowOf(manager, domain, declared.target, String(value))\n\n /* 못 찾으면 그대로 담는다 — 검증이 그 다음에 거절한다. 여기서 지어내지 않는다. */\n return found ? { ref: found.id, label: found.name } : { ref: String(value) }\n}\n\n/** 이름으로도 id 로도 찾는다 — 이 제품의 관계 칸이 둘 다 담는다. */\nexport async function rowOf(\n manager: EntityManager,\n domain: Domain,\n targetAxis: string | undefined,\n given: string\n): Promise<{ id: string; name: string } | undefined> {\n const axis = MASTER_AXES.find(one => one.key === targetAxis)\n\n if (!axis) {\n return undefined\n }\n\n const byId = UUID.test(given)\n ? await manager.findOne(axis.entity as never, { where: { id: given, domain: { id: domain.id } } } as never)\n : undefined\n\n const found = byId ?? (await manager.findOne(axis.entity as never, { where: { name: given, domain: { id: domain.id } } } as never))\n\n return found as unknown as { id: string; name: string } | undefined\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nfunction sameValue(before: unknown, after: unknown): boolean {\n if (Array.isArray(before) || Array.isArray(after)) {\n return JSON.stringify(before ?? null) === JSON.stringify(after ?? null)\n }\n\n return (before ?? null) === (after ?? null)\n}\n\nexport { claimedField }\n"]}