@tailor-platform/erp-kit 0.7.0 → 0.8.0

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 (635) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +8 -4
  3. package/dist/cli.mjs +70 -70
  4. package/package.json +1 -1
  5. package/skills/erp-kit-app-5-impl-backend/SKILL.md +5 -5
  6. package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -1
  7. package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +37 -12
  8. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +3 -1
  9. package/skills/erp-kit-app-6-impl-frontend/references/component.md +90 -0
  10. package/skills/erp-kit-app-6-impl-frontend/references/detail-view.md +255 -0
  11. package/skills/erp-kit-app-6-impl-frontend/references/pages.md +1 -5
  12. package/skills/erp-kit-app-7-impl-review/SKILL.md +3 -2
  13. package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +14 -8
  14. package/skills/erp-kit-module-6-impl-review/SKILL.md +16 -19
  15. package/skills/erp-kit-module-shared/references/commands.md +68 -1
  16. package/src/commands/index.ts +8 -2
  17. package/src/commands/init.test.ts +24 -8
  18. package/src/commands/init.ts +5 -12
  19. package/src/commands/lib/distribute.test.ts +1 -20
  20. package/src/commands/lib/distribute.ts +0 -14
  21. package/src/commands/update.test.ts +1 -1
  22. package/src/generator/scaffold.ts +25 -4
  23. package/src/module.ts +4 -1
  24. package/src/modules/accounting/README.md +63 -0
  25. package/src/modules/accounting/command/activateBudget.generated.ts +6 -0
  26. package/src/modules/accounting/command/activateBudget.test.ts +119 -0
  27. package/src/modules/accounting/command/activateBudget.ts +77 -0
  28. package/src/modules/accounting/command/activateCostElement.generated.ts +6 -0
  29. package/src/modules/accounting/command/activateCostElement.test.ts +59 -0
  30. package/src/modules/accounting/command/activateCostElement.ts +41 -0
  31. package/src/modules/accounting/command/activateProfitCenter.generated.ts +6 -0
  32. package/src/modules/accounting/command/activateProfitCenter.test.ts +60 -0
  33. package/src/modules/accounting/command/activateProfitCenter.ts +38 -0
  34. package/src/modules/accounting/command/approveBudget.generated.ts +6 -0
  35. package/src/modules/accounting/command/approveBudget.test.ts +69 -0
  36. package/src/modules/accounting/command/approveBudget.ts +47 -0
  37. package/src/modules/accounting/command/assignCostCenterToHierarchyNode.generated.ts +6 -0
  38. package/src/modules/accounting/command/assignCostCenterToHierarchyNode.test.ts +112 -0
  39. package/src/modules/accounting/command/assignCostCenterToHierarchyNode.ts +67 -0
  40. package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.generated.ts +6 -0
  41. package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.test.ts +123 -0
  42. package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.ts +71 -0
  43. package/src/modules/accounting/command/closeBudget.generated.ts +6 -0
  44. package/src/modules/accounting/command/closeBudget.test.ts +93 -0
  45. package/src/modules/accounting/command/closeBudget.ts +40 -0
  46. package/src/modules/accounting/command/closeInternalOrder.generated.ts +6 -0
  47. package/src/modules/accounting/command/closeInternalOrder.test.ts +74 -0
  48. package/src/modules/accounting/command/closeInternalOrder.ts +38 -0
  49. package/src/modules/accounting/command/consumeCommitment.generated.ts +6 -0
  50. package/src/modules/accounting/command/consumeCommitment.test.ts +123 -0
  51. package/src/modules/accounting/command/consumeCommitment.ts +62 -0
  52. package/src/modules/accounting/command/createAllocationCycle.generated.ts +6 -0
  53. package/src/modules/accounting/command/createAllocationCycle.test.ts +166 -0
  54. package/src/modules/accounting/command/createAllocationCycle.ts +68 -0
  55. package/src/modules/accounting/command/createAllocationRule.generated.ts +6 -0
  56. package/src/modules/accounting/command/createAllocationRule.test.ts +195 -0
  57. package/src/modules/accounting/command/createAllocationRule.ts +103 -0
  58. package/src/modules/accounting/command/createBudget.generated.ts +6 -0
  59. package/src/modules/accounting/command/createBudget.test.ts +159 -0
  60. package/src/modules/accounting/command/createBudget.ts +100 -0
  61. package/src/modules/accounting/command/createBudgetLineItem.generated.ts +6 -0
  62. package/src/modules/accounting/command/createBudgetLineItem.test.ts +178 -0
  63. package/src/modules/accounting/command/createBudgetLineItem.ts +104 -0
  64. package/src/modules/accounting/command/createCostCenter.generated.ts +6 -0
  65. package/src/modules/accounting/command/createCostCenter.test.ts +179 -0
  66. package/src/modules/accounting/command/createCostCenter.ts +112 -0
  67. package/src/modules/accounting/command/createCostCenterHierarchy.generated.ts +6 -0
  68. package/src/modules/accounting/command/createCostCenterHierarchy.test.ts +91 -0
  69. package/src/modules/accounting/command/createCostCenterHierarchy.ts +48 -0
  70. package/src/modules/accounting/command/createCostCenterHierarchyNode.generated.ts +6 -0
  71. package/src/modules/accounting/command/createCostCenterHierarchyNode.test.ts +171 -0
  72. package/src/modules/accounting/command/createCostCenterHierarchyNode.ts +117 -0
  73. package/src/modules/accounting/command/createCostElement.generated.ts +6 -0
  74. package/src/modules/accounting/command/createCostElement.test.ts +317 -0
  75. package/src/modules/accounting/command/createCostElement.ts +149 -0
  76. package/src/modules/accounting/command/createInternalOrder.generated.ts +6 -0
  77. package/src/modules/accounting/command/createInternalOrder.test.ts +206 -0
  78. package/src/modules/accounting/command/createInternalOrder.ts +104 -0
  79. package/src/modules/accounting/command/createPlanVersion.generated.ts +6 -0
  80. package/src/modules/accounting/command/createPlanVersion.test.ts +230 -0
  81. package/src/modules/accounting/command/createPlanVersion.ts +71 -0
  82. package/src/modules/accounting/command/createProfitCenter.generated.ts +6 -0
  83. package/src/modules/accounting/command/createProfitCenter.test.ts +227 -0
  84. package/src/modules/accounting/command/createProfitCenter.ts +81 -0
  85. package/src/modules/accounting/command/createProfitCenterHierarchy.generated.ts +6 -0
  86. package/src/modules/accounting/command/createProfitCenterHierarchy.test.ts +91 -0
  87. package/src/modules/accounting/command/createProfitCenterHierarchy.ts +46 -0
  88. package/src/modules/accounting/command/createProfitCenterHierarchyNode.generated.ts +6 -0
  89. package/src/modules/accounting/command/createProfitCenterHierarchyNode.test.ts +160 -0
  90. package/src/modules/accounting/command/createProfitCenterHierarchyNode.ts +109 -0
  91. package/src/modules/accounting/command/deactivateCostElement.generated.ts +6 -0
  92. package/src/modules/accounting/command/deactivateCostElement.test.ts +59 -0
  93. package/src/modules/accounting/command/deactivateCostElement.ts +41 -0
  94. package/src/modules/accounting/command/deactivateProfitCenter.generated.ts +6 -0
  95. package/src/modules/accounting/command/deactivateProfitCenter.test.ts +60 -0
  96. package/src/modules/accounting/command/deactivateProfitCenter.ts +42 -0
  97. package/src/modules/accounting/command/deleteAllocationCycle.generated.ts +6 -0
  98. package/src/modules/accounting/command/deleteAllocationCycle.test.ts +90 -0
  99. package/src/modules/accounting/command/deleteAllocationCycle.ts +39 -0
  100. package/src/modules/accounting/command/deleteAllocationRule.generated.ts +6 -0
  101. package/src/modules/accounting/command/deleteAllocationRule.test.ts +98 -0
  102. package/src/modules/accounting/command/deleteAllocationRule.ts +40 -0
  103. package/src/modules/accounting/command/deleteBudget.generated.ts +6 -0
  104. package/src/modules/accounting/command/deleteBudget.test.ts +90 -0
  105. package/src/modules/accounting/command/deleteBudget.ts +35 -0
  106. package/src/modules/accounting/command/deleteBudgetLineItem.generated.ts +6 -0
  107. package/src/modules/accounting/command/deleteBudgetLineItem.test.ts +85 -0
  108. package/src/modules/accounting/command/deleteBudgetLineItem.ts +50 -0
  109. package/src/modules/accounting/command/deleteCostCenter.generated.ts +6 -0
  110. package/src/modules/accounting/command/deleteCostCenter.test.ts +79 -0
  111. package/src/modules/accounting/command/deleteCostCenter.ts +67 -0
  112. package/src/modules/accounting/command/deleteCostCenterHierarchyNode.generated.ts +6 -0
  113. package/src/modules/accounting/command/deleteCostCenterHierarchyNode.test.ts +59 -0
  114. package/src/modules/accounting/command/deleteCostCenterHierarchyNode.ts +58 -0
  115. package/src/modules/accounting/command/deleteCostElement.generated.ts +6 -0
  116. package/src/modules/accounting/command/deleteCostElement.test.ts +58 -0
  117. package/src/modules/accounting/command/deleteCostElement.ts +33 -0
  118. package/src/modules/accounting/command/deleteInternalOrder.generated.ts +6 -0
  119. package/src/modules/accounting/command/deleteInternalOrder.test.ts +81 -0
  120. package/src/modules/accounting/command/deleteInternalOrder.ts +37 -0
  121. package/src/modules/accounting/command/deleteProfitCenter.generated.ts +6 -0
  122. package/src/modules/accounting/command/deleteProfitCenter.test.ts +68 -0
  123. package/src/modules/accounting/command/deleteProfitCenter.ts +39 -0
  124. package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.generated.ts +6 -0
  125. package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.test.ts +72 -0
  126. package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.ts +61 -0
  127. package/src/modules/accounting/command/executeAllocationCycle.generated.ts +6 -0
  128. package/src/modules/accounting/command/executeAllocationCycle.test.ts +167 -0
  129. package/src/modules/accounting/command/executeAllocationCycle.ts +94 -0
  130. package/src/modules/accounting/command/finalizeVarianceReport.generated.ts +6 -0
  131. package/src/modules/accounting/command/finalizeVarianceReport.test.ts +60 -0
  132. package/src/modules/accounting/command/finalizeVarianceReport.ts +45 -0
  133. package/src/modules/accounting/command/generateVarianceReport.generated.ts +6 -0
  134. package/src/modules/accounting/command/generateVarianceReport.test.ts +386 -0
  135. package/src/modules/accounting/command/generateVarianceReport.ts +219 -0
  136. package/src/modules/accounting/command/invalidateAllocationCycle.generated.ts +6 -0
  137. package/src/modules/accounting/command/invalidateAllocationCycle.test.ts +84 -0
  138. package/src/modules/accounting/command/invalidateAllocationCycle.ts +45 -0
  139. package/src/modules/accounting/command/moveCostCenterHierarchyNode.generated.ts +6 -0
  140. package/src/modules/accounting/command/moveCostCenterHierarchyNode.test.ts +135 -0
  141. package/src/modules/accounting/command/moveCostCenterHierarchyNode.ts +81 -0
  142. package/src/modules/accounting/command/postAllocationCycle.generated.ts +6 -0
  143. package/src/modules/accounting/command/postAllocationCycle.test.ts +98 -0
  144. package/src/modules/accounting/command/postAllocationCycle.ts +65 -0
  145. package/src/modules/accounting/command/reactivateCostElement.generated.ts +6 -0
  146. package/src/modules/accounting/command/reactivateCostElement.test.ts +59 -0
  147. package/src/modules/accounting/command/reactivateCostElement.ts +41 -0
  148. package/src/modules/accounting/command/reactivateProfitCenter.generated.ts +6 -0
  149. package/src/modules/accounting/command/reactivateProfitCenter.test.ts +60 -0
  150. package/src/modules/accounting/command/reactivateProfitCenter.ts +42 -0
  151. package/src/modules/accounting/command/recordCommitment.generated.ts +6 -0
  152. package/src/modules/accounting/command/recordCommitment.test.ts +157 -0
  153. package/src/modules/accounting/command/recordCommitment.ts +113 -0
  154. package/src/modules/accounting/command/rejectBudget.generated.ts +6 -0
  155. package/src/modules/accounting/command/rejectBudget.test.ts +105 -0
  156. package/src/modules/accounting/command/rejectBudget.ts +51 -0
  157. package/src/modules/accounting/command/releaseCommitment.generated.ts +6 -0
  158. package/src/modules/accounting/command/releaseCommitment.test.ts +94 -0
  159. package/src/modules/accounting/command/releaseCommitment.ts +51 -0
  160. package/src/modules/accounting/command/releaseInternalOrder.generated.ts +6 -0
  161. package/src/modules/accounting/command/releaseInternalOrder.test.ts +74 -0
  162. package/src/modules/accounting/command/releaseInternalOrder.ts +38 -0
  163. package/src/modules/accounting/command/reverseAllocationCycle.generated.ts +6 -0
  164. package/src/modules/accounting/command/reverseAllocationCycle.test.ts +124 -0
  165. package/src/modules/accounting/command/reverseAllocationCycle.ts +63 -0
  166. package/src/modules/accounting/command/submitBudget.generated.ts +6 -0
  167. package/src/modules/accounting/command/submitBudget.test.ts +60 -0
  168. package/src/modules/accounting/command/submitBudget.ts +51 -0
  169. package/src/modules/accounting/command/technicallyCompleteInternalOrder.generated.ts +6 -0
  170. package/src/modules/accounting/command/technicallyCompleteInternalOrder.test.ts +74 -0
  171. package/src/modules/accounting/command/technicallyCompleteInternalOrder.ts +42 -0
  172. package/src/modules/accounting/command/updateAllocationCycle.generated.ts +6 -0
  173. package/src/modules/accounting/command/updateAllocationCycle.test.ts +112 -0
  174. package/src/modules/accounting/command/updateAllocationCycle.ts +41 -0
  175. package/src/modules/accounting/command/updateBudget.generated.ts +6 -0
  176. package/src/modules/accounting/command/updateBudget.test.ts +112 -0
  177. package/src/modules/accounting/command/updateBudget.ts +44 -0
  178. package/src/modules/accounting/command/updateCostCenter.generated.ts +6 -0
  179. package/src/modules/accounting/command/updateCostCenter.test.ts +105 -0
  180. package/src/modules/accounting/command/updateCostCenter.ts +79 -0
  181. package/src/modules/accounting/command/updateCostElement.generated.ts +6 -0
  182. package/src/modules/accounting/command/updateCostElement.test.ts +265 -0
  183. package/src/modules/accounting/command/updateCostElement.ts +158 -0
  184. package/src/modules/accounting/command/updateInternalOrder.generated.ts +6 -0
  185. package/src/modules/accounting/command/updateInternalOrder.test.ts +209 -0
  186. package/src/modules/accounting/command/updateInternalOrder.ts +88 -0
  187. package/src/modules/accounting/command/updateProfitCenter.generated.ts +6 -0
  188. package/src/modules/accounting/command/updateProfitCenter.test.ts +162 -0
  189. package/src/modules/accounting/command/updateProfitCenter.ts +73 -0
  190. package/src/modules/accounting/command/validateAllocationCycle.generated.ts +6 -0
  191. package/src/modules/accounting/command/validateAllocationCycle.test.ts +141 -0
  192. package/src/modules/accounting/command/validateAllocationCycle.ts +80 -0
  193. package/src/modules/accounting/db/allocationCycle.ts +59 -0
  194. package/src/modules/accounting/db/allocationResult.ts +58 -0
  195. package/src/modules/accounting/db/allocationRule.ts +48 -0
  196. package/src/modules/accounting/db/budget.ts +84 -0
  197. package/src/modules/accounting/db/budgetLineItem.ts +64 -0
  198. package/src/modules/accounting/db/commitment.ts +60 -0
  199. package/src/modules/accounting/db/costCenter.ts +73 -0
  200. package/src/modules/accounting/db/costCenterHierarchy.ts +37 -0
  201. package/src/modules/accounting/db/costCenterHierarchyNode.ts +48 -0
  202. package/src/modules/accounting/db/costElement.ts +56 -0
  203. package/src/modules/accounting/db/internalOrder.ts +69 -0
  204. package/src/modules/accounting/db/planVersion.ts +47 -0
  205. package/src/modules/accounting/db/profitCenter.ts +52 -0
  206. package/src/modules/accounting/db/profitCenterHierarchy.ts +36 -0
  207. package/src/modules/accounting/db/profitCenterHierarchyAssignment.ts +62 -0
  208. package/src/modules/accounting/db/profitCenterHierarchyNode.ts +48 -0
  209. package/src/modules/accounting/db/varianceReport.ts +54 -0
  210. package/src/modules/accounting/db/varianceReportLine.ts +62 -0
  211. package/src/modules/accounting/docs/commands/ActivateBudget.md +54 -0
  212. package/src/modules/accounting/docs/commands/ActivateCostElement.md +43 -0
  213. package/src/modules/accounting/docs/commands/ActivateProfitCenter.md +43 -0
  214. package/src/modules/accounting/docs/commands/ApproveBudget.md +46 -0
  215. package/src/modules/accounting/docs/commands/AssignCostCenterToHierarchyNode.md +46 -0
  216. package/src/modules/accounting/docs/commands/AssignProfitCenterToHierarchyNode.md +47 -0
  217. package/src/modules/accounting/docs/commands/CloseBudget.md +47 -0
  218. package/src/modules/accounting/docs/commands/CloseInternalOrder.md +45 -0
  219. package/src/modules/accounting/docs/commands/ConsumeCommitment.md +53 -0
  220. package/src/modules/accounting/docs/commands/CreateAllocationCycle.md +55 -0
  221. package/src/modules/accounting/docs/commands/CreateAllocationRule.md +60 -0
  222. package/src/modules/accounting/docs/commands/CreateBudget.md +65 -0
  223. package/src/modules/accounting/docs/commands/CreateBudgetLineItem.md +66 -0
  224. package/src/modules/accounting/docs/commands/CreateCostCenter.md +64 -0
  225. package/src/modules/accounting/docs/commands/CreateCostCenterHierarchy.md +45 -0
  226. package/src/modules/accounting/docs/commands/CreateCostCenterHierarchyNode.md +61 -0
  227. package/src/modules/accounting/docs/commands/CreateCostElement.md +91 -0
  228. package/src/modules/accounting/docs/commands/CreateInternalOrder.md +72 -0
  229. package/src/modules/accounting/docs/commands/CreatePlanVersion.md +59 -0
  230. package/src/modules/accounting/docs/commands/CreateProfitCenter.md +63 -0
  231. package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchy.md +45 -0
  232. package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchyNode.md +60 -0
  233. package/src/modules/accounting/docs/commands/DeactivateCostElement.md +43 -0
  234. package/src/modules/accounting/docs/commands/DeactivateProfitCenter.md +44 -0
  235. package/src/modules/accounting/docs/commands/DeleteAllocationCycle.md +46 -0
  236. package/src/modules/accounting/docs/commands/DeleteAllocationRule.md +45 -0
  237. package/src/modules/accounting/docs/commands/DeleteBudget.md +46 -0
  238. package/src/modules/accounting/docs/commands/DeleteBudgetLineItem.md +45 -0
  239. package/src/modules/accounting/docs/commands/DeleteCostCenter.md +50 -0
  240. package/src/modules/accounting/docs/commands/DeleteCostCenterHierarchyNode.md +45 -0
  241. package/src/modules/accounting/docs/commands/DeleteCostElement.md +43 -0
  242. package/src/modules/accounting/docs/commands/DeleteInternalOrder.md +45 -0
  243. package/src/modules/accounting/docs/commands/DeleteProfitCenter.md +46 -0
  244. package/src/modules/accounting/docs/commands/DeleteProfitCenterHierarchyNode.md +46 -0
  245. package/src/modules/accounting/docs/commands/ExecuteAllocationCycle.md +54 -0
  246. package/src/modules/accounting/docs/commands/FinalizeVarianceReport.md +44 -0
  247. package/src/modules/accounting/docs/commands/GenerateVarianceReport.md +83 -0
  248. package/src/modules/accounting/docs/commands/InvalidateAllocationCycle.md +45 -0
  249. package/src/modules/accounting/docs/commands/MoveCostCenterHierarchyNode.md +51 -0
  250. package/src/modules/accounting/docs/commands/PostAllocationCycle.md +58 -0
  251. package/src/modules/accounting/docs/commands/ReactivateCostElement.md +43 -0
  252. package/src/modules/accounting/docs/commands/ReactivateProfitCenter.md +43 -0
  253. package/src/modules/accounting/docs/commands/RecordCommitment.md +60 -0
  254. package/src/modules/accounting/docs/commands/RejectBudget.md +49 -0
  255. package/src/modules/accounting/docs/commands/ReleaseCommitment.md +45 -0
  256. package/src/modules/accounting/docs/commands/ReleaseInternalOrder.md +44 -0
  257. package/src/modules/accounting/docs/commands/ReverseAllocationCycle.md +55 -0
  258. package/src/modules/accounting/docs/commands/SubmitBudget.md +47 -0
  259. package/src/modules/accounting/docs/commands/TechnicallyCompleteInternalOrder.md +44 -0
  260. package/src/modules/accounting/docs/commands/UpdateAllocationCycle.md +45 -0
  261. package/src/modules/accounting/docs/commands/UpdateBudget.md +47 -0
  262. package/src/modules/accounting/docs/commands/UpdateCostCenter.md +50 -0
  263. package/src/modules/accounting/docs/commands/UpdateCostElement.md +82 -0
  264. package/src/modules/accounting/docs/commands/UpdateInternalOrder.md +62 -0
  265. package/src/modules/accounting/docs/commands/UpdateProfitCenter.md +56 -0
  266. package/src/modules/accounting/docs/commands/ValidateAllocationCycle.md +57 -0
  267. package/src/modules/accounting/docs/features/budget-management.md +147 -0
  268. package/src/modules/accounting/docs/features/cost-allocation.md +129 -0
  269. package/src/modules/accounting/docs/features/cost-center-management.md +118 -0
  270. package/src/modules/accounting/docs/features/cost-element-management.md +114 -0
  271. package/src/modules/accounting/docs/features/internal-order-management.md +111 -0
  272. package/src/modules/accounting/docs/features/profit-center-management.md +120 -0
  273. package/src/modules/accounting/docs/features/variance-analysis.md +130 -0
  274. package/src/modules/accounting/docs/models/AllocationCycle.md +81 -0
  275. package/src/modules/accounting/docs/models/AllocationResult.md +37 -0
  276. package/src/modules/accounting/docs/models/AllocationRule.md +41 -0
  277. package/src/modules/accounting/docs/models/Budget.md +77 -0
  278. package/src/modules/accounting/docs/models/BudgetLineItem.md +40 -0
  279. package/src/modules/accounting/docs/models/Commitment.md +45 -0
  280. package/src/modules/accounting/docs/models/CostCenter.md +51 -0
  281. package/src/modules/accounting/docs/models/CostCenterHierarchy.md +38 -0
  282. package/src/modules/accounting/docs/models/CostCenterHierarchyNode.md +41 -0
  283. package/src/modules/accounting/docs/models/CostElement.md +66 -0
  284. package/src/modules/accounting/docs/models/InternalOrder.md +67 -0
  285. package/src/modules/accounting/docs/models/PlanVersion.md +36 -0
  286. package/src/modules/accounting/docs/models/ProfitCenter.md +66 -0
  287. package/src/modules/accounting/docs/models/ProfitCenterHierarchy.md +36 -0
  288. package/src/modules/accounting/docs/models/ProfitCenterHierarchyAssignment.md +36 -0
  289. package/src/modules/accounting/docs/models/ProfitCenterHierarchyNode.md +39 -0
  290. package/src/modules/accounting/docs/models/VarianceReport.md +58 -0
  291. package/src/modules/accounting/docs/models/VarianceReportLine.md +43 -0
  292. package/src/modules/accounting/docs/queries/CalculateBudgetAvailability.md +64 -0
  293. package/src/modules/accounting/docs/queries/GetAllocationCycle.md +43 -0
  294. package/src/modules/accounting/docs/queries/GetBudget.md +42 -0
  295. package/src/modules/accounting/docs/queries/GetCostCenter.md +38 -0
  296. package/src/modules/accounting/docs/queries/GetCostCenterHierarchy.md +45 -0
  297. package/src/modules/accounting/docs/queries/GetCostElement.md +39 -0
  298. package/src/modules/accounting/docs/queries/GetInternalOrder.md +42 -0
  299. package/src/modules/accounting/docs/queries/GetProfitCenter.md +38 -0
  300. package/src/modules/accounting/docs/queries/GetProfitCenterHierarchy.md +46 -0
  301. package/src/modules/accounting/docs/queries/GetVarianceReport.md +45 -0
  302. package/src/modules/accounting/docs/queries/ListAllocationCycles.md +63 -0
  303. package/src/modules/accounting/docs/queries/ListBudgets.md +70 -0
  304. package/src/modules/accounting/docs/queries/ListCostCenters.md +55 -0
  305. package/src/modules/accounting/docs/queries/ListCostElements.md +63 -0
  306. package/src/modules/accounting/docs/queries/ListInternalOrders.md +62 -0
  307. package/src/modules/accounting/docs/queries/ListProfitCenters.md +49 -0
  308. package/src/modules/accounting/generated/enums.ts +110 -0
  309. package/src/modules/accounting/generated/kysely-tailordb.ts +302 -0
  310. package/src/modules/accounting/index.ts +2 -0
  311. package/src/modules/accounting/lib/_db_deps.ts +70 -0
  312. package/src/modules/accounting/lib/actualAmounts.ts +93 -0
  313. package/src/modules/accounting/lib/allocationPosting.ts +152 -0
  314. package/src/modules/accounting/lib/errors.generated.ts +432 -0
  315. package/src/modules/accounting/lib/permissions.generated.ts +61 -0
  316. package/src/modules/accounting/lib/types.ts +114 -0
  317. package/src/modules/accounting/module.ts +428 -0
  318. package/src/modules/accounting/permissions.ts +3 -0
  319. package/src/modules/accounting/query/calculateBudgetAvailability.generated.ts +5 -0
  320. package/src/modules/accounting/query/calculateBudgetAvailability.test.ts +229 -0
  321. package/src/modules/accounting/query/calculateBudgetAvailability.ts +147 -0
  322. package/src/modules/accounting/query/getAllocationCycle.generated.ts +5 -0
  323. package/src/modules/accounting/query/getAllocationCycle.test.ts +94 -0
  324. package/src/modules/accounting/query/getAllocationCycle.ts +37 -0
  325. package/src/modules/accounting/query/getBudget.generated.ts +5 -0
  326. package/src/modules/accounting/query/getBudget.test.ts +80 -0
  327. package/src/modules/accounting/query/getBudget.ts +31 -0
  328. package/src/modules/accounting/query/getCostCenter.generated.ts +5 -0
  329. package/src/modules/accounting/query/getCostCenter.test.ts +50 -0
  330. package/src/modules/accounting/query/getCostCenter.ts +33 -0
  331. package/src/modules/accounting/query/getCostCenterHierarchy.generated.ts +5 -0
  332. package/src/modules/accounting/query/getCostCenterHierarchy.test.ts +100 -0
  333. package/src/modules/accounting/query/getCostCenterHierarchy.ts +80 -0
  334. package/src/modules/accounting/query/getCostElement.generated.ts +5 -0
  335. package/src/modules/accounting/query/getCostElement.test.ts +57 -0
  336. package/src/modules/accounting/query/getCostElement.ts +21 -0
  337. package/src/modules/accounting/query/getInternalOrder.generated.ts +5 -0
  338. package/src/modules/accounting/query/getInternalOrder.test.ts +73 -0
  339. package/src/modules/accounting/query/getInternalOrder.ts +21 -0
  340. package/src/modules/accounting/query/getProfitCenter.generated.ts +5 -0
  341. package/src/modules/accounting/query/getProfitCenter.test.ts +65 -0
  342. package/src/modules/accounting/query/getProfitCenter.ts +31 -0
  343. package/src/modules/accounting/query/getProfitCenterHierarchy.generated.ts +5 -0
  344. package/src/modules/accounting/query/getProfitCenterHierarchy.test.ts +97 -0
  345. package/src/modules/accounting/query/getProfitCenterHierarchy.ts +87 -0
  346. package/src/modules/accounting/query/getVarianceReport.generated.ts +5 -0
  347. package/src/modules/accounting/query/getVarianceReport.test.ts +108 -0
  348. package/src/modules/accounting/query/getVarianceReport.ts +31 -0
  349. package/src/modules/accounting/query/listAllocationCycles.generated.ts +5 -0
  350. package/src/modules/accounting/query/listAllocationCycles.test.ts +152 -0
  351. package/src/modules/accounting/query/listAllocationCycles.ts +96 -0
  352. package/src/modules/accounting/query/listBudgets.generated.ts +5 -0
  353. package/src/modules/accounting/query/listBudgets.test.ts +150 -0
  354. package/src/modules/accounting/query/listBudgets.ts +85 -0
  355. package/src/modules/accounting/query/listCostCenters.generated.ts +5 -0
  356. package/src/modules/accounting/query/listCostCenters.test.ts +111 -0
  357. package/src/modules/accounting/query/listCostCenters.ts +71 -0
  358. package/src/modules/accounting/query/listCostElements.generated.ts +5 -0
  359. package/src/modules/accounting/query/listCostElements.test.ts +138 -0
  360. package/src/modules/accounting/query/listCostElements.ts +105 -0
  361. package/src/modules/accounting/query/listInternalOrders.generated.ts +5 -0
  362. package/src/modules/accounting/query/listInternalOrders.test.ts +129 -0
  363. package/src/modules/accounting/query/listInternalOrders.ts +94 -0
  364. package/src/modules/accounting/query/listProfitCenters.generated.ts +5 -0
  365. package/src/modules/accounting/query/listProfitCenters.test.ts +94 -0
  366. package/src/modules/accounting/query/listProfitCenters.ts +56 -0
  367. package/src/modules/accounting/seed/index.ts +19 -0
  368. package/src/modules/accounting/tailor.config.ts +13 -0
  369. package/src/modules/accounting/testing/commandTestUtils.ts +35 -0
  370. package/src/modules/accounting/testing/fixtures.ts +502 -0
  371. package/src/modules/audit/command/logAuditEvent.ts +43 -38
  372. package/src/modules/audit/command/updateAuditPolicy.ts +2 -2
  373. package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +1 -1
  374. package/src/modules/audit/module.ts +4 -0
  375. package/src/modules/business-partner/command/updateContactPerson.ts +3 -4
  376. package/src/modules/business-partner/command/updatePartner.ts +13 -6
  377. package/src/modules/business-partner/command/updatePartnerAddress.ts +13 -6
  378. package/src/modules/business-partner/command/updatePartnerBankAccount.ts +3 -4
  379. package/src/modules/business-partner/command/updatePartnerIdentification.ts +3 -4
  380. package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +3 -3
  381. package/src/modules/business-partner/docs/commands/UpdatePartner.md +2 -2
  382. package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +2 -2
  383. package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +2 -2
  384. package/src/modules/coa-management/command/updateAccount.ts +3 -3
  385. package/src/modules/coa-management/command/updateAccountGroup.test.ts +22 -0
  386. package/src/modules/coa-management/command/updateAccountGroup.ts +30 -18
  387. package/src/modules/coa-management/command/updateChartOfAccounts.ts +3 -4
  388. package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +4 -3
  389. package/src/modules/finance-ledger/command/updateFiscalYear.ts +2 -3
  390. package/src/modules/finance-ledger/command/updateJournalEntry.test.ts +0 -17
  391. package/src/modules/finance-ledger/command/updateJournalEntry.ts +2 -10
  392. package/src/modules/finance-ledger/command/updateJournalLine.ts +2 -3
  393. package/src/modules/finance-ledger/docs/commands/UpdateJournalEntry.md +1 -4
  394. package/src/modules/inventory/command/updateLot.test.ts +1 -1
  395. package/src/modules/inventory/command/updateLot.ts +2 -3
  396. package/src/modules/inventory/command/updateStockMovement.ts +2 -3
  397. package/src/modules/inventory/command/updateStorageLocation.ts +12 -17
  398. package/src/modules/inventory/command/updateValuationPolicy.ts +2 -3
  399. package/src/modules/inventory/command/updateWarehouse.ts +2 -3
  400. package/src/modules/inventory/docs/commands/UpdateLot.md +3 -3
  401. package/src/modules/inventory/docs/commands/UpdateStorageLocation.md +6 -6
  402. package/src/modules/inventory/docs/commands/UpdateWarehouse.md +2 -2
  403. package/src/modules/item-management/command/updateItem.test.ts +16 -12
  404. package/src/modules/item-management/command/updateItem.ts +47 -31
  405. package/src/modules/item-management/command/updateTaxonomyNode.test.ts +15 -16
  406. package/src/modules/item-management/command/updateTaxonomyNode.ts +42 -29
  407. package/src/modules/item-management/docs/commands/UpdateItem.md +7 -11
  408. package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +10 -14
  409. package/src/modules/manufacturing/command/updateBillOfMaterial.ts +3 -4
  410. package/src/modules/manufacturing/command/updateProductionOrder.ts +3 -4
  411. package/src/modules/manufacturing/command/updateRouting.ts +3 -4
  412. package/src/modules/manufacturing/command/updateWorkCenter.test.ts +16 -7
  413. package/src/modules/manufacturing/command/updateWorkCenter.ts +41 -38
  414. package/src/modules/manufacturing/docs/commands/ActivateWorkCenter.md +2 -0
  415. package/src/modules/manufacturing/docs/commands/CompleteWorkOrder.md +2 -0
  416. package/src/modules/manufacturing/docs/commands/CreateBillOfMaterial.md +1 -0
  417. package/src/modules/manufacturing/docs/commands/ReviewManufacturingCostSummary.md +1 -0
  418. package/src/modules/manufacturing/docs/commands/UpdateWorkCenter.md +6 -5
  419. package/src/modules/manufacturing/docs/models/BillOfMaterialLine.md +42 -0
  420. package/src/modules/manufacturing/docs/models/CostVarianceLine.md +36 -0
  421. package/src/modules/manufacturing/docs/models/ManufacturingCostLine.md +37 -0
  422. package/src/modules/manufacturing/docs/models/ManufacturingCostSettlementRecord.md +34 -0
  423. package/src/modules/manufacturing/docs/models/ProductionOrderBomSnapshot.md +35 -0
  424. package/src/modules/manufacturing/docs/models/ProductionOrderCostBaseline.md +36 -0
  425. package/src/modules/manufacturing/docs/models/ProductionOrderMaterialRequirement.md +35 -0
  426. package/src/modules/manufacturing/docs/models/ProductionOrderRoutingSnapshot.md +34 -0
  427. package/src/modules/manufacturing/docs/models/RoutingOperation.md +40 -0
  428. package/src/modules/manufacturing/docs/models/WorkOrderExecutionEvent.md +38 -0
  429. package/src/modules/manufacturing/docs/queries/ExplodeBillOfMaterial.md +1 -0
  430. package/src/modules/manufacturing/docs/queries/ListWorkCentersBySite.md +1 -0
  431. package/src/modules/organization/command/updateCompany.test.ts +6 -6
  432. package/src/modules/organization/command/updateCompany.ts +3 -4
  433. package/src/modules/organization/command/updateDepartment.test.ts +7 -7
  434. package/src/modules/organization/command/updateDepartment.ts +13 -12
  435. package/src/modules/organization/command/updateSite.test.ts +10 -10
  436. package/src/modules/organization/command/updateSite.ts +3 -4
  437. package/src/modules/organization/docs/commands/UpdateCompany.md +6 -6
  438. package/src/modules/organization/docs/commands/UpdateDepartment.md +9 -10
  439. package/src/modules/organization/docs/commands/UpdateSite.md +12 -12
  440. package/src/modules/product-management/command/updateProduct.test.ts +17 -11
  441. package/src/modules/product-management/command/updateProduct.ts +45 -28
  442. package/src/modules/product-management/command/updateProductAttribute.test.ts +16 -21
  443. package/src/modules/product-management/command/updateProductAttribute.ts +40 -26
  444. package/src/modules/product-management/command/updateProductAttributeValue.ts +2 -3
  445. package/src/modules/product-management/command/updateProductCategory.test.ts +14 -19
  446. package/src/modules/product-management/command/updateProductCategory.ts +42 -26
  447. package/src/modules/product-management/docs/commands/UpdateProduct.md +16 -20
  448. package/src/modules/product-management/docs/commands/UpdateProductAttribute.md +10 -14
  449. package/src/modules/product-management/docs/commands/UpdateProductCategory.md +10 -14
  450. package/src/modules/purchase/command/updateGoodsReceipt.ts +2 -3
  451. package/src/modules/purchase/command/updatePurchaseBill.ts +2 -3
  452. package/src/modules/purchase/command/updatePurchaseOrder.ts +2 -3
  453. package/src/modules/purchase/command/updatePurchasePaymentTerm.ts +2 -3
  454. package/src/modules/purchase/command/updatePurchasePriceList.ts +2 -3
  455. package/src/modules/purchase/command/updatePurchasePriceRule.ts +2 -3
  456. package/src/modules/sales/command/updateChannel.test.ts +4 -4
  457. package/src/modules/sales/command/updateChannel.ts +2 -3
  458. package/src/modules/sales/command/updateListing.test.ts +2 -2
  459. package/src/modules/sales/command/updateListing.ts +2 -3
  460. package/src/modules/sales/command/updateSalesCreditNote.test.ts +2 -2
  461. package/src/modules/sales/command/updateSalesCreditNote.ts +2 -3
  462. package/src/modules/sales/command/updateSalesInvoice.test.ts +2 -2
  463. package/src/modules/sales/command/updateSalesInvoice.ts +2 -3
  464. package/src/modules/sales/command/updateSalesOrder.test.ts +3 -3
  465. package/src/modules/sales/command/updateSalesOrder.ts +2 -3
  466. package/src/modules/sales/command/updateSalesPaymentTerm.test.ts +2 -2
  467. package/src/modules/sales/command/updateSalesPaymentTerm.ts +2 -3
  468. package/src/modules/sales/command/updateSalesPriceList.test.ts +3 -3
  469. package/src/modules/sales/command/updateSalesPriceList.ts +2 -3
  470. package/src/modules/sales/command/updateSalesPriceRule.test.ts +3 -3
  471. package/src/modules/sales/command/updateSalesPriceRule.ts +2 -3
  472. package/src/modules/sales/command/updateShipment.test.ts +2 -2
  473. package/src/modules/sales/command/updateShipment.ts +2 -3
  474. package/src/modules/sales/docs/commands/UpdateChannel.md +4 -4
  475. package/src/modules/sales/docs/commands/UpdateListing.md +2 -2
  476. package/src/modules/sales/docs/commands/UpdateSalesCreditNote.md +2 -2
  477. package/src/modules/sales/docs/commands/UpdateSalesInvoice.md +2 -2
  478. package/src/modules/sales/docs/commands/UpdateSalesOrder.md +3 -3
  479. package/src/modules/sales/docs/commands/UpdateSalesPaymentTerm.md +2 -2
  480. package/src/modules/sales/docs/commands/UpdateSalesPriceList.md +3 -3
  481. package/src/modules/sales/docs/commands/UpdateSalesPriceRule.md +3 -3
  482. package/src/modules/sales/docs/commands/UpdateShipment.md +2 -2
  483. package/src/modules/user-management/README.md +2 -1
  484. package/src/modules/user-management/command/updateOwnProfile.generated.ts +6 -0
  485. package/src/modules/user-management/command/updateOwnProfile.test.ts +191 -0
  486. package/src/modules/user-management/command/updateOwnProfile.ts +82 -0
  487. package/src/modules/user-management/command/updateUser.generated.ts +6 -0
  488. package/src/modules/user-management/command/updateUser.test.ts +195 -0
  489. package/src/modules/user-management/command/updateUser.ts +76 -0
  490. package/src/modules/user-management/docs/commands/UpdateOwnProfile.md +68 -0
  491. package/src/modules/user-management/docs/commands/UpdateUser.md +67 -0
  492. package/src/modules/user-management/docs/features/user-account-management.md +28 -3
  493. package/src/modules/user-management/docs/models/User.md +2 -0
  494. package/src/modules/user-management/lib/errors.generated.ts +5 -0
  495. package/src/modules/user-management/lib/permissions.generated.ts +2 -0
  496. package/src/modules/user-management/module.ts +5 -0
  497. package/src/modules/user-management/seed/index.ts +19 -0
  498. package/templates/scaffold/app/backend/seed/data/AuditEntry.schema.ts +20 -0
  499. package/templates/scaffold/app/backend/seed/data/AuditPolicy.jsonl +7 -0
  500. package/templates/scaffold/app/backend/seed/data/AuditPolicy.schema.ts +15 -0
  501. package/templates/scaffold/app/backend/seed/data/AuditableEntity.jsonl +4 -0
  502. package/templates/scaffold/app/backend/seed/data/AuditableEntity.schema.ts +20 -0
  503. package/templates/scaffold/app/backend/seed/data/ChangeDetail.schema.ts +20 -0
  504. package/templates/scaffold/app/backend/seed/data/Company.schema.ts +15 -0
  505. package/templates/scaffold/app/backend/seed/data/Permission.jsonl +13 -0
  506. package/templates/scaffold/app/backend/seed/data/Permission.schema.ts +1 -1
  507. package/templates/scaffold/app/backend/seed/data/PolicyFieldRule.schema.ts +20 -0
  508. package/templates/scaffold/app/backend/seed/data/Role.jsonl +1 -0
  509. package/templates/scaffold/app/backend/seed/data/Role.schema.ts +1 -1
  510. package/templates/scaffold/app/backend/seed/data/RolePermission.jsonl +13 -0
  511. package/templates/scaffold/app/backend/seed/data/RolePermission.schema.ts +1 -1
  512. package/templates/scaffold/app/backend/seed/data/User.jsonl +1 -1
  513. package/templates/scaffold/app/backend/seed/data/User.schema.ts +1 -1
  514. package/templates/scaffold/app/backend/seed/data/UserRole.jsonl +1 -0
  515. package/templates/scaffold/app/backend/seed/data/UserRole.schema.ts +1 -1
  516. package/templates/scaffold/app/backend/seed/data/_User.jsonl +1 -1
  517. package/templates/scaffold/app/backend/seed/exec.mjs +12 -0
  518. package/templates/scaffold/app/backend/src/executors/permissionCreated.ts +2 -2
  519. package/templates/scaffold/app/backend/src/executors/permissionDeleted.ts +2 -2
  520. package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +62 -0
  521. package/templates/scaffold/app/backend/src/modules-db.ts +13 -0
  522. package/templates/scaffold/app/backend/src/modules.ts +3 -5
  523. package/templates/scaffold/app/backend/src/resolvers/assignPermissionToRole.ts +70 -0
  524. package/templates/scaffold/app/backend/src/resolvers/assignRoleToUser.ts +72 -0
  525. package/templates/scaffold/app/backend/src/resolvers/createRole.ts +92 -0
  526. package/templates/scaffold/app/backend/src/resolvers/createUser.ts +113 -13
  527. package/templates/scaffold/app/backend/src/resolvers/deactivateUser.ts +67 -0
  528. package/templates/scaffold/app/backend/src/resolvers/reactivateUser.ts +63 -0
  529. package/templates/scaffold/app/backend/src/resolvers/revokePermissionFromRole.ts +72 -0
  530. package/templates/scaffold/app/backend/src/resolvers/revokeRoleFromUser.ts +72 -0
  531. package/templates/scaffold/app/backend/src/resolvers/updateOwnProfile.ts +107 -0
  532. package/templates/scaffold/app/backend/src/resolvers/updateUserProfile.ts +107 -0
  533. package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log-detail.test.ts +79 -0
  534. package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log.test.ts +86 -0
  535. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--assign-role-to-user.test.ts +103 -0
  536. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--create-role.test.ts +61 -0
  537. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--remove-role-from-user.test.ts +89 -0
  538. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--update-role-permissions.test.ts +125 -0
  539. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--browse-user-list.test.ts +91 -0
  540. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--create-user-account.test.ts +97 -0
  541. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--toggle-user-status.test.ts +131 -0
  542. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-own-profile.test.ts +85 -0
  543. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-user-profile.test.ts +158 -0
  544. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-own-profile.test.ts +30 -0
  545. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-user-detail.test.ts +98 -0
  546. package/templates/scaffold/app/backend/tailor.config.ts +6 -2
  547. package/templates/scaffold/app/docs/actors/user.md +11 -0
  548. package/templates/scaffold/app/docs/business-flow/audit-log/README.md +31 -0
  549. package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log-detail.md +35 -0
  550. package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log.md +44 -0
  551. package/templates/scaffold/app/docs/business-flow/role-management/README.md +33 -0
  552. package/templates/scaffold/app/docs/business-flow/role-management/story/user--assign-role-to-user.md +35 -0
  553. package/templates/scaffold/app/docs/business-flow/role-management/story/user--create-role.md +41 -0
  554. package/templates/scaffold/app/docs/business-flow/role-management/story/user--remove-role-from-user.md +33 -0
  555. package/templates/scaffold/app/docs/business-flow/role-management/story/user--update-role-permissions.md +41 -0
  556. package/templates/scaffold/app/docs/business-flow/user-lifecycle/README.md +48 -0
  557. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--browse-user-list.md +38 -0
  558. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--create-user-account.md +45 -0
  559. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--toggle-user-status.md +38 -0
  560. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-own-profile.md +36 -0
  561. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-user-profile.md +41 -0
  562. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-own-profile.md +30 -0
  563. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-user-detail.md +33 -0
  564. package/templates/scaffold/app/docs/resolver/assignPermissionToRole.md +16 -0
  565. package/templates/scaffold/app/docs/resolver/assignRoleToUser.md +17 -0
  566. package/templates/scaffold/app/docs/resolver/createRole.md +17 -0
  567. package/templates/scaffold/app/docs/resolver/createUser.md +23 -0
  568. package/templates/scaffold/app/docs/resolver/deactivateUser.md +17 -0
  569. package/templates/scaffold/app/docs/resolver/reactivateUser.md +16 -0
  570. package/templates/scaffold/app/docs/resolver/revokePermissionFromRole.md +17 -0
  571. package/templates/scaffold/app/docs/resolver/revokeRoleFromUser.md +17 -0
  572. package/templates/scaffold/app/docs/resolver/updateOwnProfile.md +20 -0
  573. package/templates/scaffold/app/docs/resolver/updateUserProfile.md +19 -0
  574. package/templates/scaffold/app/docs/screen/audit-entry-detail.md +30 -0
  575. package/templates/scaffold/app/docs/screen/audit-entry-list.md +25 -0
  576. package/templates/scaffold/app/docs/screen/my-profile-edit-form.md +22 -0
  577. package/templates/scaffold/app/docs/screen/my-profile.md +27 -0
  578. package/templates/scaffold/app/docs/screen/role-create-form.md +23 -0
  579. package/templates/scaffold/app/docs/screen/role-detail.md +27 -0
  580. package/templates/scaffold/app/docs/screen/role-edit-form.md +21 -0
  581. package/templates/scaffold/app/docs/screen/role-list.md +23 -0
  582. package/templates/scaffold/app/docs/screen/user-create-form.md +23 -0
  583. package/templates/scaffold/app/docs/screen/user-detail.md +33 -0
  584. package/templates/scaffold/app/docs/screen/user-edit-form.md +22 -0
  585. package/templates/scaffold/app/docs/screen/user-list.md +24 -0
  586. package/templates/scaffold/app/frontend/package.json +1 -1
  587. package/templates/scaffold/app/frontend/src/App.tsx +4 -0
  588. package/templates/scaffold/app/frontend/src/components/composed/error-fallback.tsx +1 -1
  589. package/templates/scaffold/app/frontend/src/graphql/generated/graphql-env.d.ts +59 -31
  590. package/templates/scaffold/app/frontend/src/graphql/generated/schema.graphql +1411 -688
  591. package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +1 -1
  592. package/templates/scaffold/app/frontend/src/lib/permission-groups.ts +59 -0
  593. package/templates/scaffold/app/frontend/src/pages/user-management/audit/[id]/components/audit-entry-detail.tsx +102 -0
  594. package/templates/scaffold/app/frontend/src/pages/user-management/audit/[id]/page.tsx +65 -0
  595. package/templates/scaffold/app/frontend/src/pages/user-management/audit/components/audit-entries-table.tsx +90 -0
  596. package/templates/scaffold/app/frontend/src/pages/user-management/audit/page.tsx +52 -0
  597. package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/components/edit-profile-form.tsx +125 -0
  598. package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/page.tsx +19 -0
  599. package/templates/scaffold/app/frontend/src/pages/user-management/profile/page.tsx +41 -21
  600. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-actions.tsx +26 -0
  601. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-detail.tsx +69 -0
  602. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/components/edit-role-form.tsx +192 -0
  603. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/page.tsx +51 -0
  604. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/page.tsx +56 -0
  605. package/templates/scaffold/app/frontend/src/pages/user-management/role/components/roles-table.tsx +85 -0
  606. package/templates/scaffold/app/frontend/src/pages/user-management/role/create/components/create-role-form.tsx +204 -0
  607. package/templates/scaffold/app/frontend/src/pages/user-management/role/create/page.tsx +19 -0
  608. package/templates/scaffold/app/frontend/src/pages/user-management/role/page.tsx +60 -0
  609. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-actions.tsx +216 -0
  610. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-detail.tsx +97 -33
  611. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/components/edit-user-form.tsx +115 -0
  612. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/page.tsx +51 -0
  613. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/page.tsx +8 -2
  614. package/templates/scaffold/app/frontend/src/pages/user-management/user/components/users-table.tsx +43 -42
  615. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +120 -45
  616. package/templates/scaffold/app/frontend/src/pages/user-management/user/page.tsx +3 -4
  617. package/templates/scaffold/app/frontend/src/providers/graphql-provider.tsx +8 -1
  618. package/templates/scaffold/module/eslint.config.js +8 -0
  619. package/templates/scaffold/project/__dot__gitignore +1 -0
  620. package/templates/scaffold/project/__pnpm-workspace.yaml +3 -0
  621. package/templates/scaffold/project/apps/.gitkeep +0 -0
  622. package/templates/scaffold/project/modules/.gitkeep +0 -0
  623. package/templates/scaffold/project/package.json +15 -0
  624. package/templates/workflows/erp-kit-check.yml +10 -4
  625. package/templates/scaffold/app/frontend/src/components/ui/badge.tsx +0 -39
  626. package/templates/scaffold/app/frontend/src/components/ui/button.tsx +0 -60
  627. package/templates/scaffold/app/frontend/src/components/ui/card.tsx +0 -75
  628. package/templates/scaffold/app/frontend/src/components/ui/input.tsx +0 -21
  629. package/templates/scaffold/app/frontend/src/components/ui/table.tsx +0 -90
  630. /package/src/modules/{supplier-portal → accounting/executor}/.gitkeep +0 -0
  631. /package/templates/scaffold/app/{docs/actors/.gitkeep → backend/seed/data/AuditEntry.jsonl} +0 -0
  632. /package/templates/scaffold/app/{docs/business-flow/.gitkeep → backend/seed/data/ChangeDetail.jsonl} +0 -0
  633. /package/templates/scaffold/app/{docs/resolver/.gitkeep → backend/seed/data/Company.jsonl} +0 -0
  634. /package/templates/scaffold/app/{docs/screen/.gitkeep → backend/seed/data/PolicyFieldRule.jsonl} +0 -0
  635. /package/templates/{config → scaffold/project}/license.config.json +0 -0
@@ -2,19 +2,17 @@ import type { Transaction } from "../generated/kysely-tailordb";
2
2
  import { StorageLocationNotFoundError, DuplicateLocationNameError } from "../lib/errors.generated";
3
3
  import { ok, err, type CommandContext } from "@tailor-platform/erp-kit/module";
4
4
 
5
- export interface UpdateStorageLocationInput {
5
+ export type UpdateStorageLocationInput = {
6
6
  id: string;
7
7
  name?: string;
8
- code?: string;
9
8
  storageCondition?: string | null;
10
9
  capacity?: number | null;
11
- }
12
-
10
+ };
13
11
  /**
14
12
  * Function: updateStorageLocation
15
13
  *
16
- * Modifies the mutable fields of a storage location, including name, code,
17
- * storageCondition, and capacity. warehouseId, parentId, and locationType
14
+ * Modifies the mutable fields of a storage location, including name,
15
+ * storageCondition, and capacity. warehouseId, parentId, locationType, and code
18
16
  * are immutable after creation.
19
17
  */
20
18
  export async function run(
@@ -22,34 +20,32 @@ export async function run(
22
20
  input: UpdateStorageLocationInput,
23
21
  _ctx: CommandContext,
24
22
  ) {
25
- const { id, name, code, storageCondition, capacity } = input;
23
+ const { name, storageCondition, capacity } = input;
26
24
 
27
25
  // 1. Check storage location exists
28
26
  const location = await db
29
27
  .selectFrom("StorageLocation")
30
28
  .selectAll()
31
- .where("id", "=", id)
29
+ .where("id", "=", input.id)
32
30
  .forUpdate()
33
31
  .executeTakeFirst();
34
32
 
35
33
  if (!location) {
36
- return err(new StorageLocationNotFoundError(id));
34
+ return err(new StorageLocationNotFoundError(input.id));
37
35
  }
38
36
 
39
- // 2. If name or code changed, check uniqueness within warehouse
37
+ // 2. If name changed, check uniqueness within warehouse
40
38
  const nameChanged = name !== undefined && name !== location.name;
41
- const codeChanged = code !== undefined && code !== location.code;
42
39
 
43
- if (nameChanged || codeChanged) {
40
+ if (nameChanged) {
44
41
  const checkName = name ?? location.name;
45
- const checkCode = code ?? location.code;
46
42
 
47
43
  const duplicate = await db
48
44
  .selectFrom("StorageLocation")
49
45
  .selectAll()
50
46
  .where("warehouseId", "=", location.warehouseId)
51
- .where("id", "!=", id)
52
- .where((eb) => eb.or([eb("name", "=", checkName), eb("code", "=", checkCode)]))
47
+ .where("id", "!=", location.id)
48
+ .where("name", "=", checkName)
53
49
  .forUpdate()
54
50
  .executeTakeFirst();
55
51
 
@@ -61,7 +57,6 @@ export async function run(
61
57
  // 3. Build update set
62
58
  const updates: Record<string, unknown> = { updatedAt: new Date() };
63
59
  if (name !== undefined) updates.name = name;
64
- if (code !== undefined) updates.code = code;
65
60
  if (storageCondition !== undefined) updates.storageCondition = storageCondition;
66
61
  if (capacity !== undefined) updates.capacity = capacity;
67
62
 
@@ -69,7 +64,7 @@ export async function run(
69
64
  const updatedLocation = await db
70
65
  .updateTable("StorageLocation")
71
66
  .set(updates)
72
- .where("id", "=", id)
67
+ .where("id", "=", location.id)
73
68
  .returningAll()
74
69
  .executeTakeFirstOrThrow();
75
70
 
@@ -5,13 +5,12 @@ import {
5
5
  } from "../lib/errors.generated";
6
6
  import { ok, err, type CommandContext } from "@tailor-platform/erp-kit/module";
7
7
 
8
- export interface UpdateValuationPolicyInput {
8
+ export type UpdateValuationPolicyInput = {
9
9
  id: string;
10
10
  name?: string;
11
11
  costingMethod?: string;
12
12
  standardCostRate?: number | null;
13
- }
14
-
13
+ };
15
14
  /**
16
15
  * Function: updateValuationPolicy
17
16
  *
@@ -2,13 +2,12 @@ import type { Transaction } from "../generated/kysely-tailordb";
2
2
  import { WarehouseNotFoundError, DuplicateWarehouseNameError } from "../lib/errors.generated";
3
3
  import { ok, err, type CommandContext } from "@tailor-platform/erp-kit/module";
4
4
 
5
- export interface UpdateWarehouseInput {
5
+ export type UpdateWarehouseInput = {
6
6
  id: string;
7
7
  name?: string;
8
8
  storageCondition?: string | null;
9
9
  capacity?: number | null;
10
- }
11
-
10
+ };
12
11
  /**
13
12
  * Function: updateWarehouse
14
13
  *
@@ -2,13 +2,13 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- updateLot modifies the mutable fields of a lot record, including manufactureDate, expirationDate, and supplierLotReference. The lotNumber is immutable after creation and cannot be changed.
5
+ updateLot modifies the mutable fields of a lot record, including manufactureDate, expirationDate, and supplierLotReference. `lotNumber` is fixed by the existing record and is not part of the update input.
6
6
 
7
7
  ## Business Rules
8
8
 
9
9
  - Lot must exist
10
10
  - Lot must not be in FULLY_CONSUMED status
11
- - lotNumber is immutable after creation
11
+ - lotNumber is not part of the update input
12
12
  - Can update manufactureDate, expirationDate, and supplierLotReference
13
13
 
14
14
  ## Process Flow
@@ -38,4 +38,4 @@ flowchart TD
38
38
  - returns error when lot is FULLY_CONSUMED
39
39
  - updates expiration date
40
40
  - updates supplier lot reference
41
- - lot number cannot be changed
41
+ - lot number is not part of the update input
@@ -2,13 +2,13 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- updateStorageLocation modifies the mutable fields of a storage location, including name, code, storageCondition, and capacity. The warehouseId, parentId, and locationType are immutable after creation.
5
+ updateStorageLocation modifies the mutable fields of a storage location, including name, storageCondition, and capacity. `warehouseId`, `parentId`, `locationType`, and `code` are fixed by the existing record and are not part of the mutable update payload.
6
6
 
7
7
  ## Business Rules
8
8
 
9
9
  - Storage location must exist
10
- - Name and code must remain unique within the warehouse if changed
11
- - warehouseId, parentId, and locationType are immutable after creation
10
+ - Name must remain unique within the warehouse if changed
11
+ - warehouseId, parentId, locationType, and code are not part of the mutable update payload
12
12
 
13
13
  ## Process Flow
14
14
 
@@ -16,8 +16,8 @@ updateStorageLocation modifies the mutable fields of a storage location, includi
16
16
  flowchart TD
17
17
  A[Receive update request] --> B{Location exists?}
18
18
  B -->|No| C[Return error: STORAGE_LOCATION_NOT_FOUND]
19
- B -->|Yes| D{Name or code changed?}
20
- D -->|Yes| E{New name/code unique in warehouse?}
19
+ B -->|Yes| D{Name changed?}
20
+ D -->|Yes| E{New name unique in warehouse?}
21
21
  E -->|No| F[Return error: DUPLICATE_LOCATION_NAME]
22
22
  E -->|Yes| G[Update location record]
23
23
  D -->|No| G
@@ -31,7 +31,7 @@ flowchart TD
31
31
  ## Error Scenarios
32
32
 
33
33
  - **STORAGE_LOCATION_NOT_FOUND**: Referenced storage location does not exist
34
- - **DUPLICATE_LOCATION_NAME**: A location with the new name or code already exists in the warehouse
34
+ - **DUPLICATE_LOCATION_NAME**: A location with the new name already exists in the warehouse
35
35
 
36
36
  ## Test Cases
37
37
 
@@ -2,13 +2,13 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- updateWarehouse modifies the mutable fields of an existing warehouse, including name, storageCondition, and capacity. The siteId is immutable and cannot be changed after creation.
5
+ updateWarehouse modifies the mutable fields of an existing warehouse, including name, storageCondition, and capacity. `siteId` is fixed by the existing record and is not part of the update input.
6
6
 
7
7
  ## Business Rules
8
8
 
9
9
  - Warehouse must exist
10
10
  - Name must remain unique within the same site if changed
11
- - siteId is immutable after creation
11
+ - siteId is not part of the update input
12
12
 
13
13
  ## Process Flow
14
14
 
@@ -6,7 +6,6 @@ import {
6
6
  UnitNotFoundError,
7
7
  ItemNotFoundError,
8
8
  NoFieldsToUpdateError,
9
- SkuImmutableError,
10
9
  UomLockedError,
11
10
  } from "../lib/errors.generated";
12
11
  import { baseActiveItem, baseDraftItem, baseInactiveItem } from "../testing/fixtures";
@@ -31,17 +30,6 @@ describe("updateItem", () => {
31
30
  }
32
31
  });
33
32
 
34
- it("returns error when attempting to change SKU", async () => {
35
- const { db, spies } = createMockDb<Transaction>();
36
- spies.select.mockReturnValueOnce(baseDraftItem);
37
-
38
- const result = await run(db, { id: baseDraftItem.id, sku: "NEW-SKU" }, ctx, { getUnit });
39
- expect(result.ok).toBe(false);
40
- if (!result.ok) {
41
- expect(result.error).toBeInstanceOf(SkuImmutableError);
42
- }
43
- });
44
-
45
33
  it("returns error when no fields to update", async () => {
46
34
  const { db, spies } = createMockDb<Transaction>();
47
35
  spies.select.mockReturnValueOnce(baseDraftItem);
@@ -118,6 +106,22 @@ describe("updateItem", () => {
118
106
  expect(spies.update).toHaveBeenCalled();
119
107
  });
120
108
 
109
+ it("looks up item by sku and updates name", async () => {
110
+ const { db, spies } = createMockDb<Transaction>();
111
+ const updatedItem = { ...baseActiveItem, name: "Updated Name" };
112
+ spies.select.mockReturnValueOnce(baseActiveItem);
113
+ spies.update.mockReturnValue(updatedItem);
114
+
115
+ const result = await run(db, { sku: baseActiveItem.sku, name: "Updated Name" }, ctx, {
116
+ getUnit,
117
+ });
118
+
119
+ expect(result.ok).toBe(true);
120
+ if (result.ok) {
121
+ expect(result.value.item.name).toBe("Updated Name");
122
+ }
123
+ });
124
+
121
125
  it("updates barcode in any status", async () => {
122
126
  const { db, spies } = createMockDb<Transaction>();
123
127
  const updatedItem = { ...baseActiveItem, barcode: "NEW-BAR" };
@@ -4,68 +4,84 @@ import {
4
4
  UnitNotFoundError,
5
5
  ItemNotFoundError,
6
6
  NoFieldsToUpdateError,
7
- SkuImmutableError,
8
7
  UomLockedError,
9
8
  } from "../lib/errors.generated";
10
9
  import { type PrimitivesQueries } from "../module";
11
10
  import { ok, err, type CommandContext } from "@tailor-platform/erp-kit/module";
12
11
 
13
- export interface UpdateItemInput {
14
- id: string;
15
- sku?: string;
12
+ export type UpdateItemInput = (
13
+ | {
14
+ id: string;
15
+ }
16
+ | {
17
+ sku: string;
18
+ }
19
+ ) & {
16
20
  name?: string;
17
21
  barcode?: string | null;
18
22
  unitId?: string;
19
- }
23
+ };
20
24
 
21
25
  /**
22
26
  * Function: updateItem
23
27
  *
24
- * Updates mutable fields of an existing item. SKU is immutable.
25
- * UoM can only be changed in DRAFT status.
28
+ * Updates mutable fields of an existing item.
29
+ * The item can be looked up by id or sku. UoM can only be changed in DRAFT status.
26
30
  */
27
31
  export async function run<CF extends Record<string, unknown>>(
28
32
  db: Transaction,
29
- input: UpdateItemInput & Partial<CF>,
33
+ input: UpdateItemInput & Omit<Partial<CF>, "status">,
30
34
  ctx: CommandContext,
31
35
  primitivesQueries?: Pick<PrimitivesQueries, "getUnit">,
32
36
  ) {
33
- const { id, sku, name, barcode, unitId, ...customFields } = input;
34
-
35
- // 1. Check item exists
36
- const item = await db
37
- .selectFrom("Item")
38
- .selectAll()
39
- .where("id", "=", id)
40
- .forUpdate()
41
- .executeTakeFirst();
37
+ const { name, barcode, unitId } = input;
42
38
 
43
- if (!item) {
44
- return err(new ItemNotFoundError(id));
39
+ const ITEM_OWN_KEYS = new Set(["id", "sku", "name", "barcode", "unitId"]);
40
+ const customFields: Record<string, unknown> = {};
41
+ for (const [key, value] of Object.entries(input as Record<string, unknown>)) {
42
+ if (!ITEM_OWN_KEYS.has(key)) {
43
+ customFields[key] = value;
44
+ }
45
45
  }
46
46
 
47
- // 2. SKU is immutable
48
- if (sku !== undefined) {
49
- return err(new SkuImmutableError(id));
47
+ // 1. Check item exists (lookup by id or sku)
48
+ const item =
49
+ "id" in input
50
+ ? await db
51
+ .selectFrom("Item")
52
+ .selectAll()
53
+ .where("id", "=", (input as { id: string }).id)
54
+ .forUpdate()
55
+ .executeTakeFirst()
56
+ : await db
57
+ .selectFrom("Item")
58
+ .selectAll()
59
+ .where("sku", "=", (input as { sku: string }).sku)
60
+ .forUpdate()
61
+ .executeTakeFirst();
62
+
63
+ if (!item) {
64
+ const key = "id" in input ? (input as { id: string }).id : (input as { sku: string }).sku;
65
+ return err(new ItemNotFoundError(key));
50
66
  }
51
67
 
52
- // 3. Check at least one field provided
68
+ // 2. Check at least one field provided
53
69
  const hasName = name !== undefined;
54
70
  const hasBarcode = barcode !== undefined;
55
71
  const hasUnitId = unitId !== undefined;
56
72
  const hasCustomFields = Object.keys(customFields).length > 0;
57
73
 
58
74
  if (!hasName && !hasBarcode && !hasUnitId && !hasCustomFields) {
59
- return err(new NoFieldsToUpdateError(id));
75
+ return err(new NoFieldsToUpdateError(item.id));
60
76
  }
61
77
 
62
- // 4. Check barcode uniqueness when provided (non-null)
78
+ // 3. Check barcode uniqueness when provided (non-null)
63
79
  if (hasBarcode && barcode !== null) {
64
80
  const existingBarcode = await db
65
81
  .selectFrom("Item")
66
82
  .selectAll()
67
83
  .where("barcode", "=", barcode)
68
- .where("id", "!=", id)
84
+ .where("id", "!=", item.id)
69
85
  .forUpdate()
70
86
  .executeTakeFirst();
71
87
 
@@ -74,10 +90,10 @@ export async function run<CF extends Record<string, unknown>>(
74
90
  }
75
91
  }
76
92
 
77
- // 5. UoM can only be changed in DRAFT status
93
+ // 4. UoM can only be changed in DRAFT status
78
94
  if (hasUnitId) {
79
95
  if (item.status !== "DRAFT") {
80
- return err(new UomLockedError(id));
96
+ return err(new UomLockedError(item.id));
81
97
  }
82
98
 
83
99
  // Validate UoM exists and is active
@@ -88,9 +104,9 @@ export async function run<CF extends Record<string, unknown>>(
88
104
  }
89
105
  }
90
106
 
91
- // 6. Apply updates
107
+ // 5. Apply updates
92
108
  const updates: Record<string, unknown> = {
93
- ...(customFields as Record<string, unknown>),
109
+ ...customFields,
94
110
  updatedAt: new Date(),
95
111
  };
96
112
  if (hasName) updates.name = name;
@@ -100,7 +116,7 @@ export async function run<CF extends Record<string, unknown>>(
100
116
  const updatedItem = await db
101
117
  .updateTable("Item")
102
118
  .set(updates)
103
- .where("id", "=", id)
119
+ .where("id", "=", item.id)
104
120
  .returningAll()
105
121
  .executeTakeFirstOrThrow();
106
122
 
@@ -1,11 +1,7 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { createMockDb } from "../../../testing/index";
3
3
  import { Transaction } from "../generated/kysely-tailordb";
4
- import {
5
- CodeImmutableError,
6
- MissingRequiredFieldsError,
7
- NodeNotFoundError,
8
- } from "../lib/errors.generated";
4
+ import { MissingRequiredFieldsError, NodeNotFoundError } from "../lib/errors.generated";
9
5
  import { baseRootNode } from "../testing/fixtures";
10
6
  import { run } from "./updateTaxonomyNode";
11
7
 
@@ -21,17 +17,6 @@ describe("updateTaxonomyNode", () => {
21
17
  }
22
18
  });
23
19
 
24
- it("returns error when attempting to change code", async () => {
25
- const { db, spies } = createMockDb<Transaction>();
26
- spies.select.mockReturnValueOnce(baseRootNode);
27
-
28
- const result = await run(db, { id: baseRootNode.id, code: "NEW-CODE" });
29
- expect(result.ok).toBe(false);
30
- if (!result.ok) {
31
- expect(result.error).toBeInstanceOf(CodeImmutableError);
32
- }
33
- });
34
-
35
20
  it("returns error when name is empty", async () => {
36
21
  const { db, spies } = createMockDb<Transaction>();
37
22
  spies.select.mockReturnValueOnce(baseRootNode);
@@ -69,6 +54,20 @@ describe("updateTaxonomyNode", () => {
69
54
  expect(spies.update).toHaveBeenCalled();
70
55
  });
71
56
 
57
+ it("looks up node by code and updates name", async () => {
58
+ const { db, spies } = createMockDb<Transaction>();
59
+ const updatedNode = { ...baseRootNode, name: "Consumer Electronics" };
60
+ spies.select.mockReturnValueOnce(baseRootNode);
61
+ spies.update.mockReturnValue(updatedNode);
62
+
63
+ const result = await run(db, { code: baseRootNode.code, name: "Consumer Electronics" });
64
+
65
+ expect(result.ok).toBe(true);
66
+ if (result.ok) {
67
+ expect(result.value.node.name).toBe("Consumer Electronics");
68
+ }
69
+ });
70
+
72
71
  it("passes custom fields through to set", async () => {
73
72
  const { db, spies } = createMockDb<Transaction>();
74
73
  const updatedNode = { ...baseRootNode, sortOrder: 5 };
@@ -1,55 +1,68 @@
1
1
  import { Transaction } from "../generated/kysely-tailordb";
2
- import {
3
- CodeImmutableError,
4
- MissingRequiredFieldsError,
5
- NodeNotFoundError,
6
- } from "../lib/errors.generated";
2
+ import { MissingRequiredFieldsError, NodeNotFoundError } from "../lib/errors.generated";
7
3
  import { ok, err } from "@tailor-platform/erp-kit/module";
8
4
 
9
- export interface UpdateTaxonomyNodeInput {
10
- id: string;
11
- code?: string;
5
+ export type UpdateTaxonomyNodeInput = (
6
+ | {
7
+ id: string;
8
+ }
9
+ | {
10
+ code: string;
11
+ }
12
+ ) & {
12
13
  name?: string;
13
- }
14
+ };
14
15
 
15
16
  /**
16
17
  * Function: updateTaxonomyNode
17
18
  *
18
19
  * Updates the display name of an existing taxonomy node.
19
- * Node code is immutable.
20
+ * The node can be looked up by id or code.
20
21
  */
21
22
  export async function run<CF extends Record<string, unknown>>(
22
23
  db: Transaction,
23
- input: UpdateTaxonomyNodeInput & Partial<CF>,
24
+ input: UpdateTaxonomyNodeInput & Omit<Partial<CF>, "status">,
24
25
  ) {
25
- const { id, code, name, ...customFields } = input;
26
-
27
- // 1. Check node exists
28
- const node = await db
29
- .selectFrom("TaxonomyNode")
30
- .selectAll()
31
- .where("id", "=", id)
32
- .forUpdate()
33
- .executeTakeFirst();
26
+ const { name } = input;
34
27
 
35
- if (!node) {
36
- return err(new NodeNotFoundError(id));
28
+ const KNOWN_KEYS = new Set(["id", "code", "name"]);
29
+ const customFields: Record<string, unknown> = {};
30
+ for (const [key, value] of Object.entries(input as Record<string, unknown>)) {
31
+ if (!KNOWN_KEYS.has(key)) {
32
+ customFields[key] = value;
33
+ }
37
34
  }
38
35
 
39
- // 2. Code is immutable
40
- if (code !== undefined) {
41
- return err(new CodeImmutableError(id));
36
+ // 1. Check node exists (lookup by id or code)
37
+ const node =
38
+ "id" in input
39
+ ? await db
40
+ .selectFrom("TaxonomyNode")
41
+ .selectAll()
42
+ .where("id", "=", (input as { id: string }).id)
43
+ .forUpdate()
44
+ .executeTakeFirst()
45
+ : await db
46
+ .selectFrom("TaxonomyNode")
47
+ .selectAll()
48
+ .where("code", "=", (input as { code: string }).code)
49
+ .forUpdate()
50
+ .executeTakeFirst();
51
+
52
+ if (!node) {
53
+ const key = "id" in input ? (input as { id: string }).id : (input as { code: string }).code;
54
+ return err(new NodeNotFoundError(key));
42
55
  }
43
56
 
44
- // 3. Name must be provided and non-empty (unless custom fields provided)
57
+ // 2. Name must be provided and non-empty (unless custom fields provided)
45
58
  const hasCustomFields = Object.keys(customFields).length > 0;
46
59
  if (!name && !hasCustomFields) {
47
60
  return err(new MissingRequiredFieldsError("name"));
48
61
  }
49
62
 
50
- // 4. Update fields
63
+ // 3. Update fields
51
64
  const updates: Record<string, unknown> = {
52
- ...(customFields as Record<string, unknown>),
65
+ ...customFields,
53
66
  updatedAt: new Date(),
54
67
  };
55
68
  if (name) updates.name = name;
@@ -57,7 +70,7 @@ export async function run<CF extends Record<string, unknown>>(
57
70
  const updatedNode = await db
58
71
  .updateTable("TaxonomyNode")
59
72
  .set(updates)
60
- .where("id", "=", id)
73
+ .where("id", "=", node.id)
61
74
  .returningAll()
62
75
  .executeTakeFirstOrThrow();
63
76
 
@@ -2,14 +2,13 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- updateItem modifies mutable fields of an existing item — name, barcode, and unit of measure (UoM). SKU is immutable and cannot be changed after creation. The set of updatable fields depends on the item's current lifecycle status.
5
+ updateItem modifies mutable fields of an existing item — name, barcode, and unit of measure (UoM). The item can be looked up by `id` or `sku`. The set of updatable fields depends on the item's current lifecycle status.
6
6
 
7
7
  This command supports the DRAFT review workflow (correcting barcodes, setting names before activation) as well as post-activation updates to non-transactional fields.
8
8
 
9
9
  ## Business Rules
10
10
 
11
- - Target item must exist in the system
12
- - SKU is immutable — any attempt to change SKU returns an error
11
+ - Target item must exist in the system (looked up by `id` or `sku`)
13
12
  - Name can be updated in any status (DRAFT, ACTIVE, INACTIVE)
14
13
  - Barcode can be updated in any status; must remain unique across all items when provided
15
14
  - Barcode can be cleared (set to null) to remove it from the item
@@ -21,11 +20,9 @@ This command supports the DRAFT review workflow (correcting barcodes, setting na
21
20
 
22
21
  ```mermaid
23
22
  flowchart TD
24
- A[Receive update request] --> B{Item exists?}
25
- B -->|No| C[Return error: not found]
26
- B -->|Yes| D{SKU change attempted?}
27
- D -->|Yes| E[Return error: SKU immutable]
28
- D -->|No| F{Any field provided?}
23
+ A[Receive update request] --> B{Lookup by id or sku}
24
+ B -->|Not found| C[Return error: not found]
25
+ B -->|Found| F{Any field provided?}
29
26
  F -->|No| G[Return error: no fields to update]
30
27
  F -->|Yes| H{Barcode provided?}
31
28
  H -->|Yes| I{Barcode unique?}
@@ -47,8 +44,7 @@ flowchart TD
47
44
 
48
45
  ## Error Scenarios
49
46
 
50
- - **ITEM_NOT_FOUND**: Specified item ID does not exist
51
- - **SKU_IMMUTABLE**: Attempt to change the SKU field
47
+ - **ITEM_NOT_FOUND**: Specified item does not exist
52
48
  - **DUPLICATE_BARCODE**: An item with the same barcode already exists
53
49
  - **UNIT_NOT_FOUND**: Referenced unit does not exist or is inactive
54
50
  - **UOM_LOCKED**: UoM cannot be changed after item has been activated (status is ACTIVE or INACTIVE)
@@ -57,13 +53,13 @@ flowchart TD
57
53
  ## Test Cases
58
54
 
59
55
  - returns error when item does not exist
60
- - returns error when attempting to change SKU
61
56
  - returns error when no fields to update
62
57
  - returns error when barcode is duplicate
63
58
  - returns error when changing UoM on non-DRAFT item
64
59
  - returns error when changing UoM on INACTIVE item
65
60
  - returns error when new UoM does not exist
66
61
  - updates name in any status
62
+ - looks up item by sku and updates name
67
63
  - updates barcode in any status
68
64
  - clears barcode by setting to null
69
65
  - updates UoM in DRAFT status
@@ -2,12 +2,11 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- updateTaxonomyNode modifies the display name of an existing taxonomy node. The node code is immutable and cannot be changed after creation only the name (display label) can be updated. This supports scenarios such as renaming a classification branch to better reflect its contents or aligning terminology across the organization.
5
+ updateTaxonomyNode modifies the display name of an existing taxonomy node. The node can be looked up by `id` or `code`. This supports scenarios such as renaming a classification branch to better reflect its contents or aligning terminology across the organization.
6
6
 
7
7
  ## Business Rules
8
8
 
9
- - Target node must exist in the system
10
- - Node code is immutable — any attempt to change the code returns an error
9
+ - Target node must exist in the system (looked up by `id` or `code`)
11
10
  - Name is required and must not be empty
12
11
  - Name update does not affect the node's position in the tree, child nodes, or item assignments
13
12
 
@@ -15,14 +14,12 @@ updateTaxonomyNode modifies the display name of an existing taxonomy node. The n
15
14
 
16
15
  ```mermaid
17
16
  flowchart TD
18
- A[Receive update request] --> B{Node exists?}
19
- B -->|No| C[Return error: not found]
20
- B -->|Yes| D{Code change attempted?}
21
- D -->|Yes| E[Return error: code immutable]
22
- D -->|No| F{Name provided and non-empty?}
23
- F -->|No| G[Return error: name required]
24
- F -->|Yes| H[Update node name]
25
- H --> I[Return updated node]
17
+ A[Receive update request] --> B{Lookup by id or code}
18
+ B -->|Not found| C[Return error: not found]
19
+ B -->|Found| D{Name provided and non-empty?}
20
+ D -->|No| E[Return error: name required]
21
+ D -->|Yes| F[Update node name]
22
+ F --> G[Return updated node]
26
23
  ```
27
24
 
28
25
  ## External Dependencies
@@ -31,15 +28,14 @@ flowchart TD
31
28
 
32
29
  ## Error Scenarios
33
30
 
34
- - **NODE_NOT_FOUND**: Specified node ID does not exist
35
- - **CODE_IMMUTABLE**: Attempt to change the node code
31
+ - **NODE_NOT_FOUND**: Specified node does not exist
36
32
  - **MISSING_REQUIRED_FIELDS**: Name not provided or empty
37
33
 
38
34
  ## Test Cases
39
35
 
40
36
  - returns error when node does not exist
41
- - returns error when attempting to change code
42
37
  - returns error when name is empty
43
38
  - returns error when name is not provided
44
39
  - updates node name
40
+ - looks up node by code and updates name
45
41
  - passes custom fields through to set