@tailor-platform/erp-kit 0.7.0 → 0.9.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 (756) hide show
  1. package/CHANGELOG.md +40 -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-1-requirements/SKILL.md +6 -0
  6. package/skills/erp-kit-app-2-requirements-review/SKILL.md +6 -0
  7. package/skills/erp-kit-app-3-plan/SKILL.md +6 -0
  8. package/skills/erp-kit-app-4-plan-review/SKILL.md +6 -0
  9. package/skills/erp-kit-app-5-impl-backend/SKILL.md +12 -5
  10. package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -1
  11. package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +37 -12
  12. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +9 -1
  13. package/skills/erp-kit-app-6-impl-frontend/references/component.md +90 -0
  14. package/skills/erp-kit-app-6-impl-frontend/references/detail-view.md +255 -0
  15. package/skills/erp-kit-app-6-impl-frontend/references/pages.md +1 -5
  16. package/skills/erp-kit-app-7-impl-review/SKILL.md +9 -2
  17. package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +14 -8
  18. package/skills/erp-kit-app-shared/SKILL.md +2 -0
  19. package/skills/erp-kit-mock-scenario/SKILL.md +6 -0
  20. package/skills/erp-kit-module-1-requirements/SKILL.md +6 -0
  21. package/skills/erp-kit-module-2-requirements-review/SKILL.md +6 -0
  22. package/skills/erp-kit-module-3-plan/SKILL.md +6 -0
  23. package/skills/erp-kit-module-3-update-plan/SKILL.md +6 -0
  24. package/skills/erp-kit-module-4-plan-review/SKILL.md +6 -0
  25. package/skills/erp-kit-module-5-impl/SKILL.md +6 -0
  26. package/skills/erp-kit-module-6-impl-review/SKILL.md +22 -19
  27. package/skills/erp-kit-module-shared/SKILL.md +2 -0
  28. package/skills/erp-kit-module-shared/references/commands.md +71 -1
  29. package/skills/erp-kit-update/SKILL.md +6 -0
  30. package/src/commands/index.ts +8 -2
  31. package/src/commands/init.test.ts +24 -8
  32. package/src/commands/init.ts +5 -12
  33. package/src/commands/lib/distribute.test.ts +1 -20
  34. package/src/commands/lib/distribute.ts +0 -14
  35. package/src/commands/update.test.ts +1 -1
  36. package/src/generator/scaffold.ts +25 -4
  37. package/src/module.ts +4 -1
  38. package/src/modules/accounting/README.md +63 -0
  39. package/src/modules/accounting/command/activateBudget.generated.ts +6 -0
  40. package/src/modules/accounting/command/activateBudget.test.ts +119 -0
  41. package/src/modules/accounting/command/activateBudget.ts +77 -0
  42. package/src/modules/accounting/command/activateCostElement.generated.ts +6 -0
  43. package/src/modules/accounting/command/activateCostElement.test.ts +59 -0
  44. package/src/modules/accounting/command/activateCostElement.ts +41 -0
  45. package/src/modules/accounting/command/activateProfitCenter.generated.ts +6 -0
  46. package/src/modules/accounting/command/activateProfitCenter.test.ts +60 -0
  47. package/src/modules/accounting/command/activateProfitCenter.ts +38 -0
  48. package/src/modules/accounting/command/approveBudget.generated.ts +6 -0
  49. package/src/modules/accounting/command/approveBudget.test.ts +69 -0
  50. package/src/modules/accounting/command/approveBudget.ts +47 -0
  51. package/src/modules/accounting/command/assignCostCenterToHierarchyNode.generated.ts +6 -0
  52. package/src/modules/accounting/command/assignCostCenterToHierarchyNode.test.ts +112 -0
  53. package/src/modules/accounting/command/assignCostCenterToHierarchyNode.ts +67 -0
  54. package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.generated.ts +6 -0
  55. package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.test.ts +123 -0
  56. package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.ts +71 -0
  57. package/src/modules/accounting/command/closeBudget.generated.ts +6 -0
  58. package/src/modules/accounting/command/closeBudget.test.ts +93 -0
  59. package/src/modules/accounting/command/closeBudget.ts +40 -0
  60. package/src/modules/accounting/command/closeInternalOrder.generated.ts +6 -0
  61. package/src/modules/accounting/command/closeInternalOrder.test.ts +74 -0
  62. package/src/modules/accounting/command/closeInternalOrder.ts +38 -0
  63. package/src/modules/accounting/command/consumeCommitment.generated.ts +6 -0
  64. package/src/modules/accounting/command/consumeCommitment.test.ts +123 -0
  65. package/src/modules/accounting/command/consumeCommitment.ts +62 -0
  66. package/src/modules/accounting/command/createAllocationCycle.generated.ts +6 -0
  67. package/src/modules/accounting/command/createAllocationCycle.test.ts +166 -0
  68. package/src/modules/accounting/command/createAllocationCycle.ts +68 -0
  69. package/src/modules/accounting/command/createAllocationRule.generated.ts +6 -0
  70. package/src/modules/accounting/command/createAllocationRule.test.ts +195 -0
  71. package/src/modules/accounting/command/createAllocationRule.ts +103 -0
  72. package/src/modules/accounting/command/createBudget.generated.ts +6 -0
  73. package/src/modules/accounting/command/createBudget.test.ts +159 -0
  74. package/src/modules/accounting/command/createBudget.ts +100 -0
  75. package/src/modules/accounting/command/createBudgetLineItem.generated.ts +6 -0
  76. package/src/modules/accounting/command/createBudgetLineItem.test.ts +178 -0
  77. package/src/modules/accounting/command/createBudgetLineItem.ts +104 -0
  78. package/src/modules/accounting/command/createCostCenter.generated.ts +6 -0
  79. package/src/modules/accounting/command/createCostCenter.test.ts +179 -0
  80. package/src/modules/accounting/command/createCostCenter.ts +112 -0
  81. package/src/modules/accounting/command/createCostCenterHierarchy.generated.ts +6 -0
  82. package/src/modules/accounting/command/createCostCenterHierarchy.test.ts +91 -0
  83. package/src/modules/accounting/command/createCostCenterHierarchy.ts +48 -0
  84. package/src/modules/accounting/command/createCostCenterHierarchyNode.generated.ts +6 -0
  85. package/src/modules/accounting/command/createCostCenterHierarchyNode.test.ts +171 -0
  86. package/src/modules/accounting/command/createCostCenterHierarchyNode.ts +117 -0
  87. package/src/modules/accounting/command/createCostElement.generated.ts +6 -0
  88. package/src/modules/accounting/command/createCostElement.test.ts +317 -0
  89. package/src/modules/accounting/command/createCostElement.ts +149 -0
  90. package/src/modules/accounting/command/createInternalOrder.generated.ts +6 -0
  91. package/src/modules/accounting/command/createInternalOrder.test.ts +206 -0
  92. package/src/modules/accounting/command/createInternalOrder.ts +104 -0
  93. package/src/modules/accounting/command/createPlanVersion.generated.ts +6 -0
  94. package/src/modules/accounting/command/createPlanVersion.test.ts +230 -0
  95. package/src/modules/accounting/command/createPlanVersion.ts +71 -0
  96. package/src/modules/accounting/command/createProfitCenter.generated.ts +6 -0
  97. package/src/modules/accounting/command/createProfitCenter.test.ts +227 -0
  98. package/src/modules/accounting/command/createProfitCenter.ts +81 -0
  99. package/src/modules/accounting/command/createProfitCenterHierarchy.generated.ts +6 -0
  100. package/src/modules/accounting/command/createProfitCenterHierarchy.test.ts +91 -0
  101. package/src/modules/accounting/command/createProfitCenterHierarchy.ts +46 -0
  102. package/src/modules/accounting/command/createProfitCenterHierarchyNode.generated.ts +6 -0
  103. package/src/modules/accounting/command/createProfitCenterHierarchyNode.test.ts +160 -0
  104. package/src/modules/accounting/command/createProfitCenterHierarchyNode.ts +109 -0
  105. package/src/modules/accounting/command/deactivateCostElement.generated.ts +6 -0
  106. package/src/modules/accounting/command/deactivateCostElement.test.ts +59 -0
  107. package/src/modules/accounting/command/deactivateCostElement.ts +41 -0
  108. package/src/modules/accounting/command/deactivateProfitCenter.generated.ts +6 -0
  109. package/src/modules/accounting/command/deactivateProfitCenter.test.ts +60 -0
  110. package/src/modules/accounting/command/deactivateProfitCenter.ts +42 -0
  111. package/src/modules/accounting/command/deleteAllocationCycle.generated.ts +6 -0
  112. package/src/modules/accounting/command/deleteAllocationCycle.test.ts +90 -0
  113. package/src/modules/accounting/command/deleteAllocationCycle.ts +39 -0
  114. package/src/modules/accounting/command/deleteAllocationRule.generated.ts +6 -0
  115. package/src/modules/accounting/command/deleteAllocationRule.test.ts +98 -0
  116. package/src/modules/accounting/command/deleteAllocationRule.ts +40 -0
  117. package/src/modules/accounting/command/deleteBudget.generated.ts +6 -0
  118. package/src/modules/accounting/command/deleteBudget.test.ts +90 -0
  119. package/src/modules/accounting/command/deleteBudget.ts +35 -0
  120. package/src/modules/accounting/command/deleteBudgetLineItem.generated.ts +6 -0
  121. package/src/modules/accounting/command/deleteBudgetLineItem.test.ts +85 -0
  122. package/src/modules/accounting/command/deleteBudgetLineItem.ts +50 -0
  123. package/src/modules/accounting/command/deleteCostCenter.generated.ts +6 -0
  124. package/src/modules/accounting/command/deleteCostCenter.test.ts +79 -0
  125. package/src/modules/accounting/command/deleteCostCenter.ts +67 -0
  126. package/src/modules/accounting/command/deleteCostCenterHierarchyNode.generated.ts +6 -0
  127. package/src/modules/accounting/command/deleteCostCenterHierarchyNode.test.ts +59 -0
  128. package/src/modules/accounting/command/deleteCostCenterHierarchyNode.ts +58 -0
  129. package/src/modules/accounting/command/deleteCostElement.generated.ts +6 -0
  130. package/src/modules/accounting/command/deleteCostElement.test.ts +58 -0
  131. package/src/modules/accounting/command/deleteCostElement.ts +33 -0
  132. package/src/modules/accounting/command/deleteInternalOrder.generated.ts +6 -0
  133. package/src/modules/accounting/command/deleteInternalOrder.test.ts +81 -0
  134. package/src/modules/accounting/command/deleteInternalOrder.ts +37 -0
  135. package/src/modules/accounting/command/deleteProfitCenter.generated.ts +6 -0
  136. package/src/modules/accounting/command/deleteProfitCenter.test.ts +68 -0
  137. package/src/modules/accounting/command/deleteProfitCenter.ts +39 -0
  138. package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.generated.ts +6 -0
  139. package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.test.ts +72 -0
  140. package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.ts +61 -0
  141. package/src/modules/accounting/command/executeAllocationCycle.generated.ts +6 -0
  142. package/src/modules/accounting/command/executeAllocationCycle.test.ts +167 -0
  143. package/src/modules/accounting/command/executeAllocationCycle.ts +94 -0
  144. package/src/modules/accounting/command/finalizeVarianceReport.generated.ts +6 -0
  145. package/src/modules/accounting/command/finalizeVarianceReport.test.ts +60 -0
  146. package/src/modules/accounting/command/finalizeVarianceReport.ts +45 -0
  147. package/src/modules/accounting/command/generateVarianceReport.generated.ts +6 -0
  148. package/src/modules/accounting/command/generateVarianceReport.test.ts +386 -0
  149. package/src/modules/accounting/command/generateVarianceReport.ts +219 -0
  150. package/src/modules/accounting/command/invalidateAllocationCycle.generated.ts +6 -0
  151. package/src/modules/accounting/command/invalidateAllocationCycle.test.ts +84 -0
  152. package/src/modules/accounting/command/invalidateAllocationCycle.ts +45 -0
  153. package/src/modules/accounting/command/moveCostCenterHierarchyNode.generated.ts +6 -0
  154. package/src/modules/accounting/command/moveCostCenterHierarchyNode.test.ts +135 -0
  155. package/src/modules/accounting/command/moveCostCenterHierarchyNode.ts +81 -0
  156. package/src/modules/accounting/command/postAllocationCycle.generated.ts +6 -0
  157. package/src/modules/accounting/command/postAllocationCycle.test.ts +98 -0
  158. package/src/modules/accounting/command/postAllocationCycle.ts +65 -0
  159. package/src/modules/accounting/command/reactivateCostElement.generated.ts +6 -0
  160. package/src/modules/accounting/command/reactivateCostElement.test.ts +59 -0
  161. package/src/modules/accounting/command/reactivateCostElement.ts +41 -0
  162. package/src/modules/accounting/command/reactivateProfitCenter.generated.ts +6 -0
  163. package/src/modules/accounting/command/reactivateProfitCenter.test.ts +60 -0
  164. package/src/modules/accounting/command/reactivateProfitCenter.ts +42 -0
  165. package/src/modules/accounting/command/recordCommitment.generated.ts +6 -0
  166. package/src/modules/accounting/command/recordCommitment.test.ts +157 -0
  167. package/src/modules/accounting/command/recordCommitment.ts +113 -0
  168. package/src/modules/accounting/command/rejectBudget.generated.ts +6 -0
  169. package/src/modules/accounting/command/rejectBudget.test.ts +105 -0
  170. package/src/modules/accounting/command/rejectBudget.ts +51 -0
  171. package/src/modules/accounting/command/releaseCommitment.generated.ts +6 -0
  172. package/src/modules/accounting/command/releaseCommitment.test.ts +94 -0
  173. package/src/modules/accounting/command/releaseCommitment.ts +51 -0
  174. package/src/modules/accounting/command/releaseInternalOrder.generated.ts +6 -0
  175. package/src/modules/accounting/command/releaseInternalOrder.test.ts +74 -0
  176. package/src/modules/accounting/command/releaseInternalOrder.ts +38 -0
  177. package/src/modules/accounting/command/reverseAllocationCycle.generated.ts +6 -0
  178. package/src/modules/accounting/command/reverseAllocationCycle.test.ts +124 -0
  179. package/src/modules/accounting/command/reverseAllocationCycle.ts +63 -0
  180. package/src/modules/accounting/command/submitBudget.generated.ts +6 -0
  181. package/src/modules/accounting/command/submitBudget.test.ts +60 -0
  182. package/src/modules/accounting/command/submitBudget.ts +51 -0
  183. package/src/modules/accounting/command/technicallyCompleteInternalOrder.generated.ts +6 -0
  184. package/src/modules/accounting/command/technicallyCompleteInternalOrder.test.ts +74 -0
  185. package/src/modules/accounting/command/technicallyCompleteInternalOrder.ts +42 -0
  186. package/src/modules/accounting/command/updateAllocationCycle.generated.ts +6 -0
  187. package/src/modules/accounting/command/updateAllocationCycle.test.ts +112 -0
  188. package/src/modules/accounting/command/updateAllocationCycle.ts +41 -0
  189. package/src/modules/accounting/command/updateBudget.generated.ts +6 -0
  190. package/src/modules/accounting/command/updateBudget.test.ts +112 -0
  191. package/src/modules/accounting/command/updateBudget.ts +44 -0
  192. package/src/modules/accounting/command/updateCostCenter.generated.ts +6 -0
  193. package/src/modules/accounting/command/updateCostCenter.test.ts +105 -0
  194. package/src/modules/accounting/command/updateCostCenter.ts +79 -0
  195. package/src/modules/accounting/command/updateCostElement.generated.ts +6 -0
  196. package/src/modules/accounting/command/updateCostElement.test.ts +265 -0
  197. package/src/modules/accounting/command/updateCostElement.ts +158 -0
  198. package/src/modules/accounting/command/updateInternalOrder.generated.ts +6 -0
  199. package/src/modules/accounting/command/updateInternalOrder.test.ts +209 -0
  200. package/src/modules/accounting/command/updateInternalOrder.ts +88 -0
  201. package/src/modules/accounting/command/updateProfitCenter.generated.ts +6 -0
  202. package/src/modules/accounting/command/updateProfitCenter.test.ts +162 -0
  203. package/src/modules/accounting/command/updateProfitCenter.ts +73 -0
  204. package/src/modules/accounting/command/validateAllocationCycle.generated.ts +6 -0
  205. package/src/modules/accounting/command/validateAllocationCycle.test.ts +141 -0
  206. package/src/modules/accounting/command/validateAllocationCycle.ts +80 -0
  207. package/src/modules/accounting/db/allocationCycle.ts +59 -0
  208. package/src/modules/accounting/db/allocationResult.ts +58 -0
  209. package/src/modules/accounting/db/allocationRule.ts +48 -0
  210. package/src/modules/accounting/db/budget.ts +84 -0
  211. package/src/modules/accounting/db/budgetLineItem.ts +64 -0
  212. package/src/modules/accounting/db/commitment.ts +60 -0
  213. package/src/modules/accounting/db/costCenter.ts +73 -0
  214. package/src/modules/accounting/db/costCenterHierarchy.ts +37 -0
  215. package/src/modules/accounting/db/costCenterHierarchyNode.ts +48 -0
  216. package/src/modules/accounting/db/costElement.ts +56 -0
  217. package/src/modules/accounting/db/internalOrder.ts +69 -0
  218. package/src/modules/accounting/db/planVersion.ts +47 -0
  219. package/src/modules/accounting/db/profitCenter.ts +52 -0
  220. package/src/modules/accounting/db/profitCenterHierarchy.ts +36 -0
  221. package/src/modules/accounting/db/profitCenterHierarchyAssignment.ts +62 -0
  222. package/src/modules/accounting/db/profitCenterHierarchyNode.ts +48 -0
  223. package/src/modules/accounting/db/varianceReport.ts +54 -0
  224. package/src/modules/accounting/db/varianceReportLine.ts +62 -0
  225. package/src/modules/accounting/docs/commands/ActivateBudget.md +54 -0
  226. package/src/modules/accounting/docs/commands/ActivateCostElement.md +43 -0
  227. package/src/modules/accounting/docs/commands/ActivateProfitCenter.md +43 -0
  228. package/src/modules/accounting/docs/commands/ApproveBudget.md +46 -0
  229. package/src/modules/accounting/docs/commands/AssignCostCenterToHierarchyNode.md +46 -0
  230. package/src/modules/accounting/docs/commands/AssignProfitCenterToHierarchyNode.md +47 -0
  231. package/src/modules/accounting/docs/commands/CloseBudget.md +47 -0
  232. package/src/modules/accounting/docs/commands/CloseInternalOrder.md +45 -0
  233. package/src/modules/accounting/docs/commands/ConsumeCommitment.md +53 -0
  234. package/src/modules/accounting/docs/commands/CreateAllocationCycle.md +55 -0
  235. package/src/modules/accounting/docs/commands/CreateAllocationRule.md +60 -0
  236. package/src/modules/accounting/docs/commands/CreateBudget.md +65 -0
  237. package/src/modules/accounting/docs/commands/CreateBudgetLineItem.md +66 -0
  238. package/src/modules/accounting/docs/commands/CreateCostCenter.md +64 -0
  239. package/src/modules/accounting/docs/commands/CreateCostCenterHierarchy.md +45 -0
  240. package/src/modules/accounting/docs/commands/CreateCostCenterHierarchyNode.md +61 -0
  241. package/src/modules/accounting/docs/commands/CreateCostElement.md +91 -0
  242. package/src/modules/accounting/docs/commands/CreateInternalOrder.md +72 -0
  243. package/src/modules/accounting/docs/commands/CreatePlanVersion.md +59 -0
  244. package/src/modules/accounting/docs/commands/CreateProfitCenter.md +63 -0
  245. package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchy.md +45 -0
  246. package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchyNode.md +60 -0
  247. package/src/modules/accounting/docs/commands/DeactivateCostElement.md +43 -0
  248. package/src/modules/accounting/docs/commands/DeactivateProfitCenter.md +44 -0
  249. package/src/modules/accounting/docs/commands/DeleteAllocationCycle.md +46 -0
  250. package/src/modules/accounting/docs/commands/DeleteAllocationRule.md +45 -0
  251. package/src/modules/accounting/docs/commands/DeleteBudget.md +46 -0
  252. package/src/modules/accounting/docs/commands/DeleteBudgetLineItem.md +45 -0
  253. package/src/modules/accounting/docs/commands/DeleteCostCenter.md +50 -0
  254. package/src/modules/accounting/docs/commands/DeleteCostCenterHierarchyNode.md +45 -0
  255. package/src/modules/accounting/docs/commands/DeleteCostElement.md +43 -0
  256. package/src/modules/accounting/docs/commands/DeleteInternalOrder.md +45 -0
  257. package/src/modules/accounting/docs/commands/DeleteProfitCenter.md +46 -0
  258. package/src/modules/accounting/docs/commands/DeleteProfitCenterHierarchyNode.md +46 -0
  259. package/src/modules/accounting/docs/commands/ExecuteAllocationCycle.md +54 -0
  260. package/src/modules/accounting/docs/commands/FinalizeVarianceReport.md +44 -0
  261. package/src/modules/accounting/docs/commands/GenerateVarianceReport.md +83 -0
  262. package/src/modules/accounting/docs/commands/InvalidateAllocationCycle.md +45 -0
  263. package/src/modules/accounting/docs/commands/MoveCostCenterHierarchyNode.md +51 -0
  264. package/src/modules/accounting/docs/commands/PostAllocationCycle.md +58 -0
  265. package/src/modules/accounting/docs/commands/ReactivateCostElement.md +43 -0
  266. package/src/modules/accounting/docs/commands/ReactivateProfitCenter.md +43 -0
  267. package/src/modules/accounting/docs/commands/RecordCommitment.md +60 -0
  268. package/src/modules/accounting/docs/commands/RejectBudget.md +49 -0
  269. package/src/modules/accounting/docs/commands/ReleaseCommitment.md +45 -0
  270. package/src/modules/accounting/docs/commands/ReleaseInternalOrder.md +44 -0
  271. package/src/modules/accounting/docs/commands/ReverseAllocationCycle.md +55 -0
  272. package/src/modules/accounting/docs/commands/SubmitBudget.md +47 -0
  273. package/src/modules/accounting/docs/commands/TechnicallyCompleteInternalOrder.md +44 -0
  274. package/src/modules/accounting/docs/commands/UpdateAllocationCycle.md +45 -0
  275. package/src/modules/accounting/docs/commands/UpdateBudget.md +47 -0
  276. package/src/modules/accounting/docs/commands/UpdateCostCenter.md +50 -0
  277. package/src/modules/accounting/docs/commands/UpdateCostElement.md +82 -0
  278. package/src/modules/accounting/docs/commands/UpdateInternalOrder.md +62 -0
  279. package/src/modules/accounting/docs/commands/UpdateProfitCenter.md +56 -0
  280. package/src/modules/accounting/docs/commands/ValidateAllocationCycle.md +57 -0
  281. package/src/modules/accounting/docs/features/budget-management.md +147 -0
  282. package/src/modules/accounting/docs/features/cost-allocation.md +129 -0
  283. package/src/modules/accounting/docs/features/cost-center-management.md +118 -0
  284. package/src/modules/accounting/docs/features/cost-element-management.md +114 -0
  285. package/src/modules/accounting/docs/features/internal-order-management.md +111 -0
  286. package/src/modules/accounting/docs/features/profit-center-management.md +120 -0
  287. package/src/modules/accounting/docs/features/variance-analysis.md +130 -0
  288. package/src/modules/accounting/docs/models/AllocationCycle.md +81 -0
  289. package/src/modules/accounting/docs/models/AllocationResult.md +37 -0
  290. package/src/modules/accounting/docs/models/AllocationRule.md +41 -0
  291. package/src/modules/accounting/docs/models/Budget.md +77 -0
  292. package/src/modules/accounting/docs/models/BudgetLineItem.md +40 -0
  293. package/src/modules/accounting/docs/models/Commitment.md +45 -0
  294. package/src/modules/accounting/docs/models/CostCenter.md +51 -0
  295. package/src/modules/accounting/docs/models/CostCenterHierarchy.md +38 -0
  296. package/src/modules/accounting/docs/models/CostCenterHierarchyNode.md +41 -0
  297. package/src/modules/accounting/docs/models/CostElement.md +66 -0
  298. package/src/modules/accounting/docs/models/InternalOrder.md +67 -0
  299. package/src/modules/accounting/docs/models/PlanVersion.md +36 -0
  300. package/src/modules/accounting/docs/models/ProfitCenter.md +66 -0
  301. package/src/modules/accounting/docs/models/ProfitCenterHierarchy.md +36 -0
  302. package/src/modules/accounting/docs/models/ProfitCenterHierarchyAssignment.md +36 -0
  303. package/src/modules/accounting/docs/models/ProfitCenterHierarchyNode.md +39 -0
  304. package/src/modules/accounting/docs/models/VarianceReport.md +58 -0
  305. package/src/modules/accounting/docs/models/VarianceReportLine.md +43 -0
  306. package/src/modules/accounting/docs/queries/CalculateBudgetAvailability.md +64 -0
  307. package/src/modules/accounting/docs/queries/GetAllocationCycle.md +43 -0
  308. package/src/modules/accounting/docs/queries/GetBudget.md +42 -0
  309. package/src/modules/accounting/docs/queries/GetCostCenter.md +38 -0
  310. package/src/modules/accounting/docs/queries/GetCostCenterHierarchy.md +45 -0
  311. package/src/modules/accounting/docs/queries/GetCostElement.md +39 -0
  312. package/src/modules/accounting/docs/queries/GetInternalOrder.md +42 -0
  313. package/src/modules/accounting/docs/queries/GetProfitCenter.md +38 -0
  314. package/src/modules/accounting/docs/queries/GetProfitCenterHierarchy.md +46 -0
  315. package/src/modules/accounting/docs/queries/GetVarianceReport.md +45 -0
  316. package/src/modules/accounting/docs/queries/ListAllocationCycles.md +63 -0
  317. package/src/modules/accounting/docs/queries/ListBudgets.md +70 -0
  318. package/src/modules/accounting/docs/queries/ListCostCenters.md +55 -0
  319. package/src/modules/accounting/docs/queries/ListCostElements.md +63 -0
  320. package/src/modules/accounting/docs/queries/ListInternalOrders.md +62 -0
  321. package/src/modules/accounting/docs/queries/ListProfitCenters.md +49 -0
  322. package/src/modules/accounting/generated/enums.ts +110 -0
  323. package/src/modules/accounting/generated/kysely-tailordb.ts +302 -0
  324. package/src/modules/accounting/index.ts +2 -0
  325. package/src/modules/accounting/lib/_db_deps.ts +70 -0
  326. package/src/modules/accounting/lib/actualAmounts.ts +93 -0
  327. package/src/modules/accounting/lib/allocationPosting.ts +152 -0
  328. package/src/modules/accounting/lib/errors.generated.ts +432 -0
  329. package/src/modules/accounting/lib/permissions.generated.ts +61 -0
  330. package/src/modules/accounting/lib/types.ts +114 -0
  331. package/src/modules/accounting/module.ts +429 -0
  332. package/src/modules/accounting/permissions.ts +3 -0
  333. package/src/modules/accounting/query/calculateBudgetAvailability.generated.ts +5 -0
  334. package/src/modules/accounting/query/calculateBudgetAvailability.test.ts +229 -0
  335. package/src/modules/accounting/query/calculateBudgetAvailability.ts +147 -0
  336. package/src/modules/accounting/query/getAllocationCycle.generated.ts +5 -0
  337. package/src/modules/accounting/query/getAllocationCycle.test.ts +94 -0
  338. package/src/modules/accounting/query/getAllocationCycle.ts +37 -0
  339. package/src/modules/accounting/query/getBudget.generated.ts +5 -0
  340. package/src/modules/accounting/query/getBudget.test.ts +80 -0
  341. package/src/modules/accounting/query/getBudget.ts +31 -0
  342. package/src/modules/accounting/query/getCostCenter.generated.ts +5 -0
  343. package/src/modules/accounting/query/getCostCenter.test.ts +50 -0
  344. package/src/modules/accounting/query/getCostCenter.ts +33 -0
  345. package/src/modules/accounting/query/getCostCenterHierarchy.generated.ts +5 -0
  346. package/src/modules/accounting/query/getCostCenterHierarchy.test.ts +100 -0
  347. package/src/modules/accounting/query/getCostCenterHierarchy.ts +80 -0
  348. package/src/modules/accounting/query/getCostElement.generated.ts +5 -0
  349. package/src/modules/accounting/query/getCostElement.test.ts +57 -0
  350. package/src/modules/accounting/query/getCostElement.ts +21 -0
  351. package/src/modules/accounting/query/getInternalOrder.generated.ts +5 -0
  352. package/src/modules/accounting/query/getInternalOrder.test.ts +73 -0
  353. package/src/modules/accounting/query/getInternalOrder.ts +21 -0
  354. package/src/modules/accounting/query/getProfitCenter.generated.ts +5 -0
  355. package/src/modules/accounting/query/getProfitCenter.test.ts +65 -0
  356. package/src/modules/accounting/query/getProfitCenter.ts +31 -0
  357. package/src/modules/accounting/query/getProfitCenterHierarchy.generated.ts +5 -0
  358. package/src/modules/accounting/query/getProfitCenterHierarchy.test.ts +97 -0
  359. package/src/modules/accounting/query/getProfitCenterHierarchy.ts +87 -0
  360. package/src/modules/accounting/query/getVarianceReport.generated.ts +5 -0
  361. package/src/modules/accounting/query/getVarianceReport.test.ts +108 -0
  362. package/src/modules/accounting/query/getVarianceReport.ts +31 -0
  363. package/src/modules/accounting/query/listAllocationCycles.generated.ts +5 -0
  364. package/src/modules/accounting/query/listAllocationCycles.test.ts +152 -0
  365. package/src/modules/accounting/query/listAllocationCycles.ts +96 -0
  366. package/src/modules/accounting/query/listBudgets.generated.ts +5 -0
  367. package/src/modules/accounting/query/listBudgets.test.ts +150 -0
  368. package/src/modules/accounting/query/listBudgets.ts +85 -0
  369. package/src/modules/accounting/query/listCostCenters.generated.ts +5 -0
  370. package/src/modules/accounting/query/listCostCenters.test.ts +111 -0
  371. package/src/modules/accounting/query/listCostCenters.ts +71 -0
  372. package/src/modules/accounting/query/listCostElements.generated.ts +5 -0
  373. package/src/modules/accounting/query/listCostElements.test.ts +138 -0
  374. package/src/modules/accounting/query/listCostElements.ts +105 -0
  375. package/src/modules/accounting/query/listInternalOrders.generated.ts +5 -0
  376. package/src/modules/accounting/query/listInternalOrders.test.ts +129 -0
  377. package/src/modules/accounting/query/listInternalOrders.ts +94 -0
  378. package/src/modules/accounting/query/listProfitCenters.generated.ts +5 -0
  379. package/src/modules/accounting/query/listProfitCenters.test.ts +94 -0
  380. package/src/modules/accounting/query/listProfitCenters.ts +56 -0
  381. package/src/modules/accounting/seed/index.ts +19 -0
  382. package/src/modules/accounting/tailor.config.ts +13 -0
  383. package/src/modules/accounting/testing/commandTestUtils.ts +35 -0
  384. package/src/modules/accounting/testing/fixtures.ts +502 -0
  385. package/src/modules/audit/command/logAuditEvent.ts +43 -38
  386. package/src/modules/audit/command/updateAuditPolicy.ts +2 -2
  387. package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +1 -1
  388. package/src/modules/audit/module.ts +4 -0
  389. package/src/modules/business-partner/command/createPartnerBankAccount.test.ts +3 -3
  390. package/src/modules/business-partner/command/createPartnerBankAccount.ts +1 -1
  391. package/src/modules/business-partner/command/updateContactPerson.ts +3 -4
  392. package/src/modules/business-partner/command/updatePartner.ts +13 -6
  393. package/src/modules/business-partner/command/updatePartnerAddress.ts +13 -6
  394. package/src/modules/business-partner/command/updatePartnerBankAccount.ts +3 -4
  395. package/src/modules/business-partner/command/updatePartnerIdentification.ts +3 -4
  396. package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +3 -3
  397. package/src/modules/business-partner/docs/commands/UpdatePartner.md +2 -2
  398. package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +2 -2
  399. package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +2 -2
  400. package/src/modules/business-partner/module.ts +1 -0
  401. package/src/modules/coa-management/command/activateAccount.test.ts +0 -15
  402. package/src/modules/coa-management/command/activateAccount.ts +1 -42
  403. package/src/modules/coa-management/command/activateChartOfAccounts.test.ts +2 -31
  404. package/src/modules/coa-management/command/activateChartOfAccounts.ts +1 -37
  405. package/src/modules/coa-management/command/createAccount.test.ts +0 -28
  406. package/src/modules/coa-management/command/createAccount.ts +0 -43
  407. package/src/modules/coa-management/command/createAccountGroup.test.ts +2 -51
  408. package/src/modules/coa-management/command/createAccountGroup.ts +1 -56
  409. package/src/modules/coa-management/command/createChartOfAccounts.test.ts +1 -49
  410. package/src/modules/coa-management/command/createChartOfAccounts.ts +0 -51
  411. package/src/modules/coa-management/command/deactivateAccount.test.ts +0 -15
  412. package/src/modules/coa-management/command/deactivateAccount.ts +1 -53
  413. package/src/modules/coa-management/command/deactivateChartOfAccounts.test.ts +2 -29
  414. package/src/modules/coa-management/command/deactivateChartOfAccounts.ts +1 -37
  415. package/src/modules/coa-management/command/deleteAccount.test.ts +0 -13
  416. package/src/modules/coa-management/command/deleteAccount.ts +1 -42
  417. package/src/modules/coa-management/command/deleteAccountGroup.test.ts +0 -19
  418. package/src/modules/coa-management/command/deleteAccountGroup.ts +1 -42
  419. package/src/modules/coa-management/command/deleteChartOfAccounts.test.ts +2 -58
  420. package/src/modules/coa-management/command/deleteChartOfAccounts.ts +4 -88
  421. package/src/modules/coa-management/command/moveAccountGroup.test.ts +0 -27
  422. package/src/modules/coa-management/command/moveAccountGroup.ts +1 -48
  423. package/src/modules/coa-management/command/reactivateAccount.test.ts +0 -15
  424. package/src/modules/coa-management/command/reactivateAccount.ts +1 -53
  425. package/src/modules/coa-management/command/updateAccount.test.ts +0 -15
  426. package/src/modules/coa-management/command/updateAccount.ts +3 -95
  427. package/src/modules/coa-management/command/updateAccountGroup.test.ts +22 -20
  428. package/src/modules/coa-management/command/updateAccountGroup.ts +30 -78
  429. package/src/modules/coa-management/command/updateChartOfAccounts.test.ts +2 -31
  430. package/src/modules/coa-management/command/updateChartOfAccounts.ts +4 -54
  431. package/src/modules/coa-management/docs/commands/ActivateAccount.md +1 -4
  432. package/src/modules/coa-management/docs/commands/ActivateChartOfAccounts.md +1 -4
  433. package/src/modules/coa-management/docs/commands/CreateAccount.md +1 -4
  434. package/src/modules/coa-management/docs/commands/CreateAccountGroup.md +2 -5
  435. package/src/modules/coa-management/docs/commands/CreateChartOfAccounts.md +2 -6
  436. package/src/modules/coa-management/docs/commands/DeactivateAccount.md +1 -4
  437. package/src/modules/coa-management/docs/commands/DeactivateChartOfAccounts.md +1 -4
  438. package/src/modules/coa-management/docs/commands/DeleteAccount.md +1 -4
  439. package/src/modules/coa-management/docs/commands/DeleteAccountGroup.md +1 -4
  440. package/src/modules/coa-management/docs/commands/DeleteChartOfAccounts.md +1 -6
  441. package/src/modules/coa-management/docs/commands/MoveAccountGroup.md +1 -4
  442. package/src/modules/coa-management/docs/commands/ReactivateAccount.md +1 -4
  443. package/src/modules/coa-management/docs/commands/UpdateAccount.md +1 -4
  444. package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +6 -8
  445. package/src/modules/coa-management/docs/commands/UpdateChartOfAccounts.md +1 -4
  446. package/src/modules/coa-management/module.ts +16 -27
  447. package/src/modules/finance-ledger/command/updateFiscalYear.ts +2 -3
  448. package/src/modules/finance-ledger/command/updateJournalEntry.test.ts +0 -17
  449. package/src/modules/finance-ledger/command/updateJournalEntry.ts +2 -10
  450. package/src/modules/finance-ledger/command/updateJournalLine.ts +2 -3
  451. package/src/modules/finance-ledger/docs/commands/UpdateJournalEntry.md +1 -4
  452. package/src/modules/finance-ledger/module.ts +1 -0
  453. package/src/modules/inventory/command/approveInventoryAdjustment.test.ts +1 -1
  454. package/src/modules/inventory/command/approveInventoryAdjustment.ts +1 -1
  455. package/src/modules/inventory/command/cancelStockMovement.test.ts +2 -2
  456. package/src/modules/inventory/command/cancelStockMovement.ts +1 -1
  457. package/src/modules/inventory/command/confirmInventoryAdjustment.test.ts +4 -4
  458. package/src/modules/inventory/command/confirmInventoryAdjustment.ts +1 -1
  459. package/src/modules/inventory/command/confirmStockMovement.test.ts +1 -1
  460. package/src/modules/inventory/command/confirmStockMovement.ts +1 -1
  461. package/src/modules/inventory/command/createInventoryAdjustment.test.ts +6 -6
  462. package/src/modules/inventory/command/createInventoryAdjustment.ts +1 -1
  463. package/src/modules/inventory/command/createStockMovement.test.ts +3 -3
  464. package/src/modules/inventory/command/createStockMovement.ts +1 -1
  465. package/src/modules/inventory/command/executeStockMovement.test.ts +5 -5
  466. package/src/modules/inventory/command/executeStockMovement.ts +1 -1
  467. package/src/modules/inventory/command/rejectInventoryAdjustment.test.ts +1 -1
  468. package/src/modules/inventory/command/rejectInventoryAdjustment.ts +1 -1
  469. package/src/modules/inventory/command/reviseInventoryAdjustment.test.ts +2 -2
  470. package/src/modules/inventory/command/reviseInventoryAdjustment.ts +1 -1
  471. package/src/modules/inventory/command/submitInventoryAdjustment.test.ts +1 -1
  472. package/src/modules/inventory/command/submitInventoryAdjustment.ts +1 -1
  473. package/src/modules/inventory/command/updateLot.test.ts +1 -1
  474. package/src/modules/inventory/command/updateLot.ts +2 -3
  475. package/src/modules/inventory/command/updateStockMovement.test.ts +4 -4
  476. package/src/modules/inventory/command/updateStockMovement.ts +4 -5
  477. package/src/modules/inventory/command/updateStorageLocation.ts +12 -17
  478. package/src/modules/inventory/command/updateValuationPolicy.ts +2 -3
  479. package/src/modules/inventory/command/updateWarehouse.ts +2 -3
  480. package/src/modules/inventory/docs/commands/UpdateLot.md +3 -3
  481. package/src/modules/inventory/docs/commands/UpdateStorageLocation.md +6 -6
  482. package/src/modules/inventory/docs/commands/UpdateWarehouse.md +2 -2
  483. package/src/modules/inventory/module.ts +1 -0
  484. package/src/modules/item-management/command/createTaxonomyNode.test.ts +4 -4
  485. package/src/modules/item-management/command/createTaxonomyNode.ts +1 -1
  486. package/src/modules/item-management/command/moveTaxonomyNode.test.ts +2 -2
  487. package/src/modules/item-management/command/moveTaxonomyNode.ts +2 -2
  488. package/src/modules/item-management/command/updateItem.test.ts +16 -12
  489. package/src/modules/item-management/command/updateItem.ts +47 -31
  490. package/src/modules/item-management/command/updateTaxonomyNode.test.ts +16 -17
  491. package/src/modules/item-management/command/updateTaxonomyNode.ts +43 -30
  492. package/src/modules/item-management/docs/commands/UpdateItem.md +7 -11
  493. package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +10 -14
  494. package/src/modules/item-management/module.ts +1 -0
  495. package/src/modules/manufacturing/command/createRouting.ts +1 -1
  496. package/src/modules/manufacturing/command/recordInventoryIssueOutcome.test.ts +1 -1
  497. package/src/modules/manufacturing/command/recordInventoryIssueOutcome.ts +1 -1
  498. package/src/modules/manufacturing/command/recordManufacturingCostSettlementAcknowledgment.test.ts +1 -1
  499. package/src/modules/manufacturing/command/recordManufacturingCostSettlementAcknowledgment.ts +1 -1
  500. package/src/modules/manufacturing/command/reviewManufacturingCostSummary.test.ts +1 -1
  501. package/src/modules/manufacturing/command/reviewManufacturingCostSummary.ts +1 -1
  502. package/src/modules/manufacturing/command/updateBillOfMaterial.ts +3 -4
  503. package/src/modules/manufacturing/command/updateProductionOrder.ts +3 -4
  504. package/src/modules/manufacturing/command/updateRouting.ts +4 -5
  505. package/src/modules/manufacturing/command/updateWorkCenter.test.ts +16 -7
  506. package/src/modules/manufacturing/command/updateWorkCenter.ts +41 -38
  507. package/src/modules/manufacturing/docs/commands/ActivateWorkCenter.md +2 -0
  508. package/src/modules/manufacturing/docs/commands/CompleteWorkOrder.md +2 -0
  509. package/src/modules/manufacturing/docs/commands/CreateBillOfMaterial.md +1 -0
  510. package/src/modules/manufacturing/docs/commands/ReviewManufacturingCostSummary.md +1 -0
  511. package/src/modules/manufacturing/docs/commands/UpdateWorkCenter.md +6 -5
  512. package/src/modules/manufacturing/docs/models/BillOfMaterialLine.md +42 -0
  513. package/src/modules/manufacturing/docs/models/CostVarianceLine.md +36 -0
  514. package/src/modules/manufacturing/docs/models/ManufacturingCostLine.md +37 -0
  515. package/src/modules/manufacturing/docs/models/ManufacturingCostSettlementRecord.md +34 -0
  516. package/src/modules/manufacturing/docs/models/ProductionOrderBomSnapshot.md +35 -0
  517. package/src/modules/manufacturing/docs/models/ProductionOrderCostBaseline.md +36 -0
  518. package/src/modules/manufacturing/docs/models/ProductionOrderMaterialRequirement.md +35 -0
  519. package/src/modules/manufacturing/docs/models/ProductionOrderRoutingSnapshot.md +34 -0
  520. package/src/modules/manufacturing/docs/models/RoutingOperation.md +40 -0
  521. package/src/modules/manufacturing/docs/models/WorkOrderExecutionEvent.md +38 -0
  522. package/src/modules/manufacturing/docs/queries/ExplodeBillOfMaterial.md +1 -0
  523. package/src/modules/manufacturing/docs/queries/ListWorkCentersBySite.md +1 -0
  524. package/src/modules/manufacturing/module.ts +1 -0
  525. package/src/modules/organization/command/updateCompany.test.ts +6 -6
  526. package/src/modules/organization/command/updateCompany.ts +3 -4
  527. package/src/modules/organization/command/updateDepartment.test.ts +7 -7
  528. package/src/modules/organization/command/updateDepartment.ts +13 -12
  529. package/src/modules/organization/command/updateSite.test.ts +10 -10
  530. package/src/modules/organization/command/updateSite.ts +3 -4
  531. package/src/modules/organization/docs/commands/UpdateCompany.md +6 -6
  532. package/src/modules/organization/docs/commands/UpdateDepartment.md +9 -10
  533. package/src/modules/organization/docs/commands/UpdateSite.md +12 -12
  534. package/src/modules/organization/module.ts +1 -0
  535. package/src/modules/primitives/module.ts +1 -0
  536. package/src/modules/product-management/command/assignProductToCategory.test.ts +2 -2
  537. package/src/modules/product-management/command/assignProductToCategory.ts +2 -2
  538. package/src/modules/product-management/command/createProductAttribute.test.ts +1 -1
  539. package/src/modules/product-management/command/createProductAttribute.ts +1 -1
  540. package/src/modules/product-management/command/createProductAttributeValue.test.ts +1 -1
  541. package/src/modules/product-management/command/createProductAttributeValue.ts +1 -1
  542. package/src/modules/product-management/command/createProductCategory.test.ts +2 -2
  543. package/src/modules/product-management/command/createProductCategory.ts +1 -1
  544. package/src/modules/product-management/command/setProductAttributeAssignment.test.ts +3 -3
  545. package/src/modules/product-management/command/setProductAttributeAssignment.ts +2 -2
  546. package/src/modules/product-management/command/updateProduct.test.ts +17 -11
  547. package/src/modules/product-management/command/updateProduct.ts +45 -28
  548. package/src/modules/product-management/command/updateProductAttribute.test.ts +16 -21
  549. package/src/modules/product-management/command/updateProductAttribute.ts +40 -26
  550. package/src/modules/product-management/command/updateProductAttributeValue.ts +2 -3
  551. package/src/modules/product-management/command/updateProductCategory.test.ts +14 -19
  552. package/src/modules/product-management/command/updateProductCategory.ts +42 -26
  553. package/src/modules/product-management/docs/commands/UpdateProduct.md +16 -20
  554. package/src/modules/product-management/docs/commands/UpdateProductAttribute.md +10 -14
  555. package/src/modules/product-management/docs/commands/UpdateProductCategory.md +10 -14
  556. package/src/modules/product-management/module.ts +1 -0
  557. package/src/modules/purchase/command/activatePurchasePaymentTerm.test.ts +4 -4
  558. package/src/modules/purchase/command/activatePurchasePaymentTerm.ts +2 -2
  559. package/src/modules/purchase/command/deactivatePurchasePaymentTerm.test.ts +4 -4
  560. package/src/modules/purchase/command/deactivatePurchasePaymentTerm.ts +2 -2
  561. package/src/modules/purchase/command/updateGoodsReceipt.ts +2 -3
  562. package/src/modules/purchase/command/updatePurchaseBill.ts +2 -3
  563. package/src/modules/purchase/command/updatePurchaseOrder.ts +2 -3
  564. package/src/modules/purchase/command/updatePurchasePaymentTerm.test.ts +2 -2
  565. package/src/modules/purchase/command/updatePurchasePaymentTerm.ts +3 -4
  566. package/src/modules/purchase/command/updatePurchasePriceList.ts +2 -3
  567. package/src/modules/purchase/command/updatePurchasePriceRule.ts +2 -3
  568. package/src/modules/purchase/module.ts +1 -0
  569. package/src/modules/sales/command/createSalesOrder.ts +1 -1
  570. package/src/modules/sales/command/updateChannel.test.ts +4 -4
  571. package/src/modules/sales/command/updateChannel.ts +2 -3
  572. package/src/modules/sales/command/updateListing.test.ts +2 -2
  573. package/src/modules/sales/command/updateListing.ts +2 -3
  574. package/src/modules/sales/command/updateSalesCreditNote.test.ts +2 -2
  575. package/src/modules/sales/command/updateSalesCreditNote.ts +2 -3
  576. package/src/modules/sales/command/updateSalesInvoice.test.ts +2 -2
  577. package/src/modules/sales/command/updateSalesInvoice.ts +2 -3
  578. package/src/modules/sales/command/updateSalesOrder.test.ts +3 -3
  579. package/src/modules/sales/command/updateSalesOrder.ts +2 -3
  580. package/src/modules/sales/command/updateSalesPaymentTerm.test.ts +2 -2
  581. package/src/modules/sales/command/updateSalesPaymentTerm.ts +2 -3
  582. package/src/modules/sales/command/updateSalesPriceList.test.ts +3 -3
  583. package/src/modules/sales/command/updateSalesPriceList.ts +2 -3
  584. package/src/modules/sales/command/updateSalesPriceRule.test.ts +3 -3
  585. package/src/modules/sales/command/updateSalesPriceRule.ts +2 -3
  586. package/src/modules/sales/command/updateShipment.test.ts +2 -2
  587. package/src/modules/sales/command/updateShipment.ts +2 -3
  588. package/src/modules/sales/docs/commands/UpdateChannel.md +4 -4
  589. package/src/modules/sales/docs/commands/UpdateListing.md +2 -2
  590. package/src/modules/sales/docs/commands/UpdateSalesCreditNote.md +2 -2
  591. package/src/modules/sales/docs/commands/UpdateSalesInvoice.md +2 -2
  592. package/src/modules/sales/docs/commands/UpdateSalesOrder.md +3 -3
  593. package/src/modules/sales/docs/commands/UpdateSalesPaymentTerm.md +2 -2
  594. package/src/modules/sales/docs/commands/UpdateSalesPriceList.md +3 -3
  595. package/src/modules/sales/docs/commands/UpdateSalesPriceRule.md +3 -3
  596. package/src/modules/sales/docs/commands/UpdateShipment.md +2 -2
  597. package/src/modules/sales/module.ts +1 -0
  598. package/src/modules/user-management/README.md +2 -1
  599. package/src/modules/user-management/command/updateOwnProfile.generated.ts +6 -0
  600. package/src/modules/user-management/command/updateOwnProfile.test.ts +191 -0
  601. package/src/modules/user-management/command/updateOwnProfile.ts +82 -0
  602. package/src/modules/user-management/command/updateUser.generated.ts +6 -0
  603. package/src/modules/user-management/command/updateUser.test.ts +195 -0
  604. package/src/modules/user-management/command/updateUser.ts +76 -0
  605. package/src/modules/user-management/docs/commands/UpdateOwnProfile.md +68 -0
  606. package/src/modules/user-management/docs/commands/UpdateUser.md +67 -0
  607. package/src/modules/user-management/docs/features/user-account-management.md +28 -3
  608. package/src/modules/user-management/docs/models/User.md +2 -0
  609. package/src/modules/user-management/lib/errors.generated.ts +5 -0
  610. package/src/modules/user-management/lib/permissions.generated.ts +2 -0
  611. package/src/modules/user-management/module.ts +5 -0
  612. package/src/modules/user-management/seed/index.ts +19 -0
  613. package/templates/scaffold/app/backend/eslint.config.js +17 -0
  614. package/templates/scaffold/app/backend/package.json +1 -0
  615. package/templates/scaffold/app/backend/seed/data/AuditEntry.schema.ts +20 -0
  616. package/templates/scaffold/app/backend/seed/data/AuditPolicy.jsonl +7 -0
  617. package/templates/scaffold/app/backend/seed/data/AuditPolicy.schema.ts +15 -0
  618. package/templates/scaffold/app/backend/seed/data/AuditableEntity.jsonl +4 -0
  619. package/templates/scaffold/app/backend/seed/data/AuditableEntity.schema.ts +20 -0
  620. package/templates/scaffold/app/backend/seed/data/ChangeDetail.schema.ts +20 -0
  621. package/templates/scaffold/app/backend/seed/data/Company.schema.ts +15 -0
  622. package/templates/scaffold/app/backend/seed/data/Permission.jsonl +13 -0
  623. package/templates/scaffold/app/backend/seed/data/Permission.schema.ts +1 -1
  624. package/templates/scaffold/app/backend/seed/data/PolicyFieldRule.schema.ts +20 -0
  625. package/templates/scaffold/app/backend/seed/data/Role.jsonl +1 -0
  626. package/templates/scaffold/app/backend/seed/data/Role.schema.ts +1 -1
  627. package/templates/scaffold/app/backend/seed/data/RolePermission.jsonl +13 -0
  628. package/templates/scaffold/app/backend/seed/data/RolePermission.schema.ts +1 -1
  629. package/templates/scaffold/app/backend/seed/data/User.jsonl +1 -1
  630. package/templates/scaffold/app/backend/seed/data/User.schema.ts +1 -1
  631. package/templates/scaffold/app/backend/seed/data/UserRole.jsonl +1 -0
  632. package/templates/scaffold/app/backend/seed/data/UserRole.schema.ts +1 -1
  633. package/templates/scaffold/app/backend/seed/data/_User.jsonl +1 -1
  634. package/templates/scaffold/app/backend/seed/exec.mjs +12 -0
  635. package/templates/scaffold/app/backend/src/executors/permissionCreated.ts +2 -2
  636. package/templates/scaffold/app/backend/src/executors/permissionDeleted.ts +2 -2
  637. package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +62 -0
  638. package/templates/scaffold/app/backend/src/modules-db.ts +13 -0
  639. package/templates/scaffold/app/backend/src/modules.ts +3 -5
  640. package/templates/scaffold/app/backend/src/resolvers/assignPermissionToRole.ts +70 -0
  641. package/templates/scaffold/app/backend/src/resolvers/assignRoleToUser.ts +72 -0
  642. package/templates/scaffold/app/backend/src/resolvers/createRole.ts +92 -0
  643. package/templates/scaffold/app/backend/src/resolvers/createUser.ts +113 -13
  644. package/templates/scaffold/app/backend/src/resolvers/deactivateUser.ts +67 -0
  645. package/templates/scaffold/app/backend/src/resolvers/reactivateUser.ts +63 -0
  646. package/templates/scaffold/app/backend/src/resolvers/revokePermissionFromRole.ts +72 -0
  647. package/templates/scaffold/app/backend/src/resolvers/revokeRoleFromUser.ts +72 -0
  648. package/templates/scaffold/app/backend/src/resolvers/updateOwnProfile.ts +107 -0
  649. package/templates/scaffold/app/backend/src/resolvers/updateUserProfile.ts +107 -0
  650. package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log-detail.test.ts +79 -0
  651. package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log.test.ts +86 -0
  652. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--assign-role-to-user.test.ts +103 -0
  653. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--create-role.test.ts +61 -0
  654. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--remove-role-from-user.test.ts +89 -0
  655. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--update-role-permissions.test.ts +125 -0
  656. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--browse-user-list.test.ts +91 -0
  657. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--create-user-account.test.ts +97 -0
  658. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--toggle-user-status.test.ts +131 -0
  659. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-own-profile.test.ts +85 -0
  660. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-user-profile.test.ts +157 -0
  661. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-own-profile.test.ts +30 -0
  662. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-user-detail.test.ts +98 -0
  663. package/templates/scaffold/app/backend/tailor.config.ts +21 -3
  664. package/templates/scaffold/app/backend/tsconfig.json +1 -1
  665. package/templates/scaffold/app/docs/actors/user.md +11 -0
  666. package/templates/scaffold/app/docs/business-flow/audit-log/README.md +31 -0
  667. package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log-detail.md +35 -0
  668. package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log.md +44 -0
  669. package/templates/scaffold/app/docs/business-flow/role-management/README.md +33 -0
  670. package/templates/scaffold/app/docs/business-flow/role-management/story/user--assign-role-to-user.md +35 -0
  671. package/templates/scaffold/app/docs/business-flow/role-management/story/user--create-role.md +41 -0
  672. package/templates/scaffold/app/docs/business-flow/role-management/story/user--remove-role-from-user.md +33 -0
  673. package/templates/scaffold/app/docs/business-flow/role-management/story/user--update-role-permissions.md +41 -0
  674. package/templates/scaffold/app/docs/business-flow/user-lifecycle/README.md +48 -0
  675. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--browse-user-list.md +38 -0
  676. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--create-user-account.md +45 -0
  677. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--toggle-user-status.md +38 -0
  678. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-own-profile.md +36 -0
  679. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-user-profile.md +41 -0
  680. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-own-profile.md +30 -0
  681. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-user-detail.md +33 -0
  682. package/templates/scaffold/app/docs/resolver/assignPermissionToRole.md +16 -0
  683. package/templates/scaffold/app/docs/resolver/assignRoleToUser.md +17 -0
  684. package/templates/scaffold/app/docs/resolver/createRole.md +17 -0
  685. package/templates/scaffold/app/docs/resolver/createUser.md +23 -0
  686. package/templates/scaffold/app/docs/resolver/deactivateUser.md +17 -0
  687. package/templates/scaffold/app/docs/resolver/reactivateUser.md +16 -0
  688. package/templates/scaffold/app/docs/resolver/revokePermissionFromRole.md +17 -0
  689. package/templates/scaffold/app/docs/resolver/revokeRoleFromUser.md +17 -0
  690. package/templates/scaffold/app/docs/resolver/updateOwnProfile.md +20 -0
  691. package/templates/scaffold/app/docs/resolver/updateUserProfile.md +19 -0
  692. package/templates/scaffold/app/docs/screen/audit-entry-detail.md +30 -0
  693. package/templates/scaffold/app/docs/screen/audit-entry-list.md +25 -0
  694. package/templates/scaffold/app/docs/screen/my-profile-edit-form.md +22 -0
  695. package/templates/scaffold/app/docs/screen/my-profile.md +27 -0
  696. package/templates/scaffold/app/docs/screen/role-create-form.md +23 -0
  697. package/templates/scaffold/app/docs/screen/role-detail.md +27 -0
  698. package/templates/scaffold/app/docs/screen/role-edit-form.md +21 -0
  699. package/templates/scaffold/app/docs/screen/role-list.md +23 -0
  700. package/templates/scaffold/app/docs/screen/user-create-form.md +23 -0
  701. package/templates/scaffold/app/docs/screen/user-detail.md +33 -0
  702. package/templates/scaffold/app/docs/screen/user-edit-form.md +22 -0
  703. package/templates/scaffold/app/docs/screen/user-list.md +24 -0
  704. package/templates/scaffold/app/frontend/package.json +1 -1
  705. package/templates/scaffold/app/frontend/src/App.tsx +57 -12
  706. package/templates/scaffold/app/frontend/src/components/composed/error-fallback.tsx +1 -1
  707. package/templates/scaffold/app/frontend/src/graphql/generated/graphql-env.d.ts +59 -31
  708. package/templates/scaffold/app/frontend/src/graphql/generated/schema.graphql +1411 -688
  709. package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +1 -1
  710. package/templates/scaffold/app/frontend/src/lib/permission-groups.ts +59 -0
  711. package/templates/scaffold/app/frontend/src/pages/audit/[id]/components/audit-entry-detail.tsx +102 -0
  712. package/templates/scaffold/app/frontend/src/pages/audit/[id]/page.tsx +65 -0
  713. package/templates/scaffold/app/frontend/src/pages/audit/components/audit-entries-table.tsx +90 -0
  714. package/templates/scaffold/app/frontend/src/pages/audit/page.tsx +52 -0
  715. package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/components/edit-profile-form.tsx +125 -0
  716. package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/page.tsx +19 -0
  717. package/templates/scaffold/app/frontend/src/pages/user-management/profile/page.tsx +41 -21
  718. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-actions.tsx +26 -0
  719. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-detail.tsx +69 -0
  720. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/components/edit-role-form.tsx +192 -0
  721. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/page.tsx +51 -0
  722. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/page.tsx +56 -0
  723. package/templates/scaffold/app/frontend/src/pages/user-management/role/components/roles-table.tsx +85 -0
  724. package/templates/scaffold/app/frontend/src/pages/user-management/role/create/components/create-role-form.tsx +204 -0
  725. package/templates/scaffold/app/frontend/src/pages/user-management/role/create/page.tsx +19 -0
  726. package/templates/scaffold/app/frontend/src/pages/user-management/role/page.tsx +60 -0
  727. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-actions.tsx +216 -0
  728. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-detail.tsx +97 -33
  729. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/components/edit-user-form.tsx +115 -0
  730. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/page.tsx +51 -0
  731. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/page.tsx +8 -2
  732. package/templates/scaffold/app/frontend/src/pages/user-management/user/components/users-table.tsx +43 -42
  733. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +120 -45
  734. package/templates/scaffold/app/frontend/src/pages/user-management/user/page.tsx +3 -4
  735. package/templates/scaffold/app/frontend/src/providers/graphql-provider.tsx +8 -1
  736. package/templates/scaffold/module/eslint.config.js +32 -0
  737. package/templates/scaffold/module/module.ts +1 -0
  738. package/templates/scaffold/module/package.json +3 -1
  739. package/templates/scaffold/module/vitest.config.ts +11 -0
  740. package/templates/scaffold/project/__dot__gitignore +1 -0
  741. package/templates/scaffold/project/__pnpm-workspace.yaml +3 -0
  742. package/templates/scaffold/project/apps/.gitkeep +0 -0
  743. package/templates/scaffold/project/modules/.gitkeep +0 -0
  744. package/templates/scaffold/project/package.json +15 -0
  745. package/templates/workflows/erp-kit-check.yml +10 -4
  746. package/templates/scaffold/app/frontend/src/components/ui/badge.tsx +0 -39
  747. package/templates/scaffold/app/frontend/src/components/ui/button.tsx +0 -60
  748. package/templates/scaffold/app/frontend/src/components/ui/card.tsx +0 -75
  749. package/templates/scaffold/app/frontend/src/components/ui/input.tsx +0 -21
  750. package/templates/scaffold/app/frontend/src/components/ui/table.tsx +0 -90
  751. /package/src/modules/{supplier-portal → accounting/executor}/.gitkeep +0 -0
  752. /package/templates/scaffold/app/{docs/actors/.gitkeep → backend/seed/data/AuditEntry.jsonl} +0 -0
  753. /package/templates/scaffold/app/{docs/business-flow/.gitkeep → backend/seed/data/ChangeDetail.jsonl} +0 -0
  754. /package/templates/scaffold/app/{docs/resolver/.gitkeep → backend/seed/data/Company.jsonl} +0 -0
  755. /package/templates/scaffold/app/{docs/screen/.gitkeep → backend/seed/data/PolicyFieldRule.jsonl} +0 -0
  756. /package/templates/{config → scaffold/project}/license.config.json +0 -0
@@ -0,0 +1,195 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import { Transaction } from "../generated/kysely-tailordb";
4
+ import {
5
+ InvalidEmailError,
6
+ InvalidNameError,
7
+ MissingRequiredFieldError,
8
+ UserAlreadyExistsError,
9
+ UserNotFoundError,
10
+ } from "../lib/errors.generated";
11
+ import { activeUser, inactiveUser, pendingUser } from "../testing/fixtures";
12
+ import { run } from "./updateUser";
13
+
14
+ describe("updateUser", () => {
15
+ // Success cases
16
+ it("updates user name", async () => {
17
+ const { db, spies } = createMockDb<Transaction>();
18
+ const updatedUser = { ...activeUser, name: "New Name" };
19
+
20
+ spies.select.mockReturnValue(activeUser);
21
+ spies.update.mockReturnValue(updatedUser);
22
+
23
+ const result = await run(db, { id: activeUser.id, name: "New Name" });
24
+ expect(result.ok).toBe(true);
25
+ if (result.ok) {
26
+ expect(result.value.user.name).toBe("New Name");
27
+ }
28
+ expect(spies.update).toHaveBeenCalled();
29
+ });
30
+
31
+ it("updates user email", async () => {
32
+ const { db, spies } = createMockDb<Transaction>();
33
+ const updatedUser = { ...activeUser, email: "newemail@example.com" };
34
+
35
+ // First select: find the user being updated; second select: no conflicting email
36
+ spies.select.mockReturnValueOnce(activeUser);
37
+ spies.select.mockReturnValueOnce(undefined);
38
+ spies.update.mockReturnValue(updatedUser);
39
+
40
+ const result = await run(db, { id: activeUser.id, email: "newemail@example.com" });
41
+ expect(result.ok).toBe(true);
42
+ if (result.ok) {
43
+ expect(result.value.user.email).toBe("newemail@example.com");
44
+ }
45
+ expect(spies.update).toHaveBeenCalled();
46
+ });
47
+
48
+ it("updates both name and email", async () => {
49
+ const { db, spies } = createMockDb<Transaction>();
50
+ const updatedUser = { ...activeUser, name: "New Name", email: "newemail@example.com" };
51
+
52
+ // First select: find the user being updated; second select: no conflicting email
53
+ spies.select.mockReturnValueOnce(activeUser);
54
+ spies.select.mockReturnValueOnce(undefined);
55
+ spies.update.mockReturnValue(updatedUser);
56
+
57
+ const result = await run(db, {
58
+ id: activeUser.id,
59
+ name: "New Name",
60
+ email: "newemail@example.com",
61
+ });
62
+ expect(result.ok).toBe(true);
63
+ if (result.ok) {
64
+ expect(result.value.user.name).toBe("New Name");
65
+ expect(result.value.user.email).toBe("newemail@example.com");
66
+ }
67
+ expect(spies.update).toHaveBeenCalled();
68
+ });
69
+
70
+ it("updates user in PENDING status", async () => {
71
+ const { db, spies } = createMockDb<Transaction>();
72
+ const updatedUser = { ...pendingUser, name: "Updated Pending" };
73
+
74
+ spies.select.mockReturnValue(pendingUser);
75
+ spies.update.mockReturnValue(updatedUser);
76
+
77
+ const result = await run(db, { id: pendingUser.id, name: "Updated Pending" });
78
+ expect(result.ok).toBe(true);
79
+ if (result.ok) {
80
+ expect(result.value.user.name).toBe("Updated Pending");
81
+ }
82
+ });
83
+
84
+ it("updates user in ACTIVE status", async () => {
85
+ const { db, spies } = createMockDb<Transaction>();
86
+ const updatedUser = { ...activeUser, name: "Updated Active" };
87
+
88
+ spies.select.mockReturnValue(activeUser);
89
+ spies.update.mockReturnValue(updatedUser);
90
+
91
+ const result = await run(db, { id: activeUser.id, name: "Updated Active" });
92
+ expect(result.ok).toBe(true);
93
+ if (result.ok) {
94
+ expect(result.value.user.name).toBe("Updated Active");
95
+ }
96
+ });
97
+
98
+ it("updates user in INACTIVE status", async () => {
99
+ const { db, spies } = createMockDb<Transaction>();
100
+ const updatedUser = { ...inactiveUser, name: "Updated Inactive" };
101
+
102
+ spies.select.mockReturnValue(inactiveUser);
103
+ spies.update.mockReturnValue(updatedUser);
104
+
105
+ const result = await run(db, { id: inactiveUser.id, name: "Updated Inactive" });
106
+ expect(result.ok).toBe(true);
107
+ if (result.ok) {
108
+ expect(result.value.user.name).toBe("Updated Inactive");
109
+ }
110
+ });
111
+
112
+ it("succeeds when email is unchanged (same as current)", async () => {
113
+ const { db, spies } = createMockDb<Transaction>();
114
+ const updatedUser = { ...activeUser };
115
+
116
+ spies.select.mockReturnValue(activeUser);
117
+ spies.update.mockReturnValue(updatedUser);
118
+
119
+ // Email matches current — should skip uniqueness check
120
+ const result = await run(db, { id: activeUser.id, email: activeUser.email });
121
+ expect(result.ok).toBe(true);
122
+ if (result.ok) {
123
+ expect(result.value.user.email).toBe(activeUser.email);
124
+ }
125
+ expect(spies.update).toHaveBeenCalled();
126
+ });
127
+
128
+ // Error cases
129
+ it("returns error when user does not exist", async () => {
130
+ const { db, spies } = createMockDb<Transaction>();
131
+ spies.select.mockReturnValue(undefined);
132
+
133
+ const result = await run(db, { id: "nonexistent-user", name: "Test" });
134
+ expect(result.ok).toBe(false);
135
+ if (!result.ok) {
136
+ expect(result.error).toBeInstanceOf(UserNotFoundError);
137
+ }
138
+ });
139
+
140
+ it("returns error when no fields are provided", async () => {
141
+ const { db } = createMockDb<Transaction>();
142
+
143
+ const result = await run(db, { id: "user-active-1" });
144
+ expect(result.ok).toBe(false);
145
+ if (!result.ok) {
146
+ expect(result.error).toBeInstanceOf(MissingRequiredFieldError);
147
+ }
148
+ });
149
+
150
+ it("returns error when name is empty", async () => {
151
+ const { db } = createMockDb<Transaction>();
152
+
153
+ const result = await run(db, { id: "user-active-1", name: "" });
154
+ expect(result.ok).toBe(false);
155
+ if (!result.ok) {
156
+ expect(result.error).toBeInstanceOf(InvalidNameError);
157
+ }
158
+ });
159
+
160
+ it("returns error when name is whitespace only", async () => {
161
+ const { db } = createMockDb<Transaction>();
162
+
163
+ const result = await run(db, { id: "user-active-1", name: " " });
164
+ expect(result.ok).toBe(false);
165
+ if (!result.ok) {
166
+ expect(result.error).toBeInstanceOf(InvalidNameError);
167
+ }
168
+ });
169
+
170
+ it("returns error when email format is invalid", async () => {
171
+ const { db } = createMockDb<Transaction>();
172
+
173
+ const result = await run(db, { id: "user-active-1", email: "invalidemail" });
174
+ expect(result.ok).toBe(false);
175
+ if (!result.ok) {
176
+ expect(result.error).toBeInstanceOf(InvalidEmailError);
177
+ }
178
+ });
179
+
180
+ it("returns error when email is already used by another user", async () => {
181
+ const { db, spies } = createMockDb<Transaction>();
182
+ const anotherUser = { ...activeUser, id: "other-user", email: "taken@example.com" };
183
+
184
+ // First select: find the user being updated
185
+ spies.select.mockReturnValueOnce(activeUser);
186
+ // Second select: find the conflicting user with the same email
187
+ spies.select.mockReturnValueOnce(anotherUser);
188
+
189
+ const result = await run(db, { id: activeUser.id, email: "taken@example.com" });
190
+ expect(result.ok).toBe(false);
191
+ if (!result.ok) {
192
+ expect(result.error).toBeInstanceOf(UserAlreadyExistsError);
193
+ }
194
+ });
195
+ });
@@ -0,0 +1,76 @@
1
+ import { Transaction } from "../generated/kysely-tailordb";
2
+ import {
3
+ InvalidEmailError,
4
+ InvalidNameError,
5
+ MissingRequiredFieldError,
6
+ UserAlreadyExistsError,
7
+ UserNotFoundError,
8
+ } from "../lib/errors.generated";
9
+ import { ok, err } from "@tailor-platform/erp-kit/module";
10
+
11
+ export type UpdateUserInput = { id: string } & { name?: string; email?: string };
12
+
13
+ const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
14
+
15
+ /**
16
+ * Function: updateUser
17
+ *
18
+ * Updates an existing user's name or email.
19
+ * At least one field must be provided. Email must be unique.
20
+ */
21
+ export async function run<CF extends Record<string, unknown>>(
22
+ db: Transaction,
23
+ input: UpdateUserInput & Omit<Partial<CF>, "status">,
24
+ ) {
25
+ const { id, name, email, ...customFields } = input;
26
+
27
+ if (name === undefined && email === undefined && Object.keys(customFields).length === 0) {
28
+ return err(new MissingRequiredFieldError("name or email"));
29
+ }
30
+
31
+ if (name?.trim() === "") {
32
+ return err(new InvalidNameError(name));
33
+ }
34
+
35
+ if (email !== undefined && !EMAIL_PATTERN.test(email)) {
36
+ return err(new InvalidEmailError(email));
37
+ }
38
+
39
+ const user = await db
40
+ .selectFrom("User")
41
+ .selectAll()
42
+ .where("id", "=", id)
43
+ .forUpdate()
44
+ .executeTakeFirst();
45
+
46
+ if (!user) {
47
+ return err(new UserNotFoundError(id));
48
+ }
49
+
50
+ if (email !== undefined && email !== user.email) {
51
+ const existingUser = await db
52
+ .selectFrom("User")
53
+ .selectAll()
54
+ .where("email", "=", email)
55
+ .forUpdate()
56
+ .executeTakeFirst();
57
+
58
+ if (existingUser) {
59
+ return err(new UserAlreadyExistsError(email));
60
+ }
61
+ }
62
+
63
+ const updatedUser = await db
64
+ .updateTable("User")
65
+ .set({
66
+ ...(customFields as Record<string, unknown>),
67
+ ...(name !== undefined ? { name } : {}),
68
+ ...(email !== undefined ? { email } : {}),
69
+ updatedAt: new Date(),
70
+ })
71
+ .where("id", "=", id)
72
+ .returningAll()
73
+ .executeTakeFirst();
74
+
75
+ return ok({ user: updatedUser! });
76
+ }
@@ -0,0 +1,68 @@
1
+ # UpdateOwnProfile
2
+
3
+ ## Overview
4
+
5
+ UpdateOwnProfile allows an ACTIVE user to update their own profile fields (name, email). The command implicitly targets the calling user — no userId parameter is needed. This provides a self-service update path that is separate from the admin-only updateUser command.
6
+
7
+ Only ACTIVE users can update their own profile. PENDING and INACTIVE users are rejected.
8
+
9
+ ## Business Rules
10
+
11
+ - Caller must be an existing user (resolved from context)
12
+ - Caller must be in ACTIVE status
13
+ - At least one field (name or email) must be provided
14
+ - Name, if provided, must be non-empty
15
+ - Email, if provided, must follow valid email format
16
+ - Email must be unique across all users (active and inactive); case-insensitive comparison
17
+ - Generates USER_UPDATED audit event with actor ID, timestamp, and changed fields
18
+
19
+ ## Process Flow
20
+
21
+ ```mermaid
22
+ flowchart TD
23
+ A[Receive update request] --> B{Caller user exists?}
24
+ B -->|No| C[Return error: USER_NOT_FOUND]
25
+ B -->|Yes| D{Caller status is ACTIVE?}
26
+ D -->|No| E[Return error: INVALID_STATUS_TRANSITION]
27
+ D -->|Yes| F{At least one field provided?}
28
+ F -->|No| G[Return error: MISSING_REQUIRED_FIELD]
29
+ F -->|Yes| H{Name provided and empty?}
30
+ H -->|Yes| I[Return error: INVALID_NAME]
31
+ H -->|No| J{Email provided?}
32
+ J -->|Yes| K{Valid email format?}
33
+ K -->|No| L[Return error: INVALID_EMAIL]
34
+ K -->|Yes| M{Email unique?}
35
+ M -->|No| N[Return error: USER_ALREADY_EXISTS]
36
+ M -->|Yes| O[Update user record]
37
+ J -->|No| O
38
+ O --> P[Log USER_UPDATED audit event]
39
+ P --> Q[Return updated user]
40
+ ```
41
+
42
+ ## External Dependencies
43
+
44
+ - None
45
+
46
+ ## Error Scenarios
47
+
48
+ - **USER_NOT_FOUND**: Caller's user ID does not exist in the system
49
+ - **INVALID_STATUS_TRANSITION**: Caller is not in ACTIVE status (PENDING or INACTIVE)
50
+ - **MISSING_REQUIRED_FIELD**: Neither name nor email was provided in the update input
51
+ - **INVALID_NAME**: Name is empty or whitespace only
52
+ - **INVALID_EMAIL**: Email does not follow valid email format
53
+ - **USER_ALREADY_EXISTS**: Email address is already registered by another user
54
+
55
+ ## Test Cases
56
+
57
+ - updates own name
58
+ - updates own email
59
+ - updates both own name and email
60
+ - returns error when caller user does not exist
61
+ - returns error when caller is in PENDING status
62
+ - returns error when caller is in INACTIVE status
63
+ - returns error when no fields are provided
64
+ - returns error when name is empty
65
+ - returns error when name is whitespace only
66
+ - returns error when email format is invalid
67
+ - returns error when email is already used by another user
68
+ - succeeds when email is unchanged (same as current)
@@ -0,0 +1,67 @@
1
+ # UpdateUser
2
+
3
+ ## Overview
4
+
5
+ UpdateUser modifies the name or email of an existing user account. This command is intended for administrators who need to update any user's profile regardless of the user's current status (PENDING, ACTIVE, or INACTIVE). Email and name are optional in the update input, but at least one must be provided.
6
+
7
+ This command supports profile corrections such as legal name changes and email address updates.
8
+
9
+ ## Business Rules
10
+
11
+ - User must exist
12
+ - At least one field (name or email) must be provided
13
+ - Name, if provided, must be non-empty
14
+ - Email, if provided, must follow valid email format
15
+ - Email must be unique across all users (active and inactive); case-insensitive comparison
16
+ - Updating is allowed on users in any status (PENDING, ACTIVE, INACTIVE)
17
+ - Status is not part of the update input (use activateUser/deactivateUser/reactivateUser for status changes)
18
+ - Generates USER_UPDATED audit event with actor ID, timestamp, and changed fields
19
+
20
+ ## Process Flow
21
+
22
+ ```mermaid
23
+ flowchart TD
24
+ A[Receive update request] --> B{User exists?}
25
+ B -->|No| C[Return error: USER_NOT_FOUND]
26
+ B -->|Yes| D{At least one field provided?}
27
+ D -->|No| E[Return error: MISSING_REQUIRED_FIELD]
28
+ D -->|Yes| F{Name provided and empty?}
29
+ F -->|Yes| G[Return error: INVALID_NAME]
30
+ F -->|No| H{Email provided?}
31
+ H -->|Yes| I{Valid email format?}
32
+ I -->|No| J[Return error: INVALID_EMAIL]
33
+ I -->|Yes| K{Email unique?}
34
+ K -->|No| L[Return error: USER_ALREADY_EXISTS]
35
+ K -->|Yes| M[Update user record]
36
+ H -->|No| M
37
+ M --> N[Log USER_UPDATED audit event]
38
+ N --> O[Return updated user]
39
+ ```
40
+
41
+ ## External Dependencies
42
+
43
+ - None
44
+
45
+ ## Error Scenarios
46
+
47
+ - **USER_NOT_FOUND**: Specified user ID does not exist in the system
48
+ - **MISSING_REQUIRED_FIELD**: Neither name nor email was provided in the update input
49
+ - **INVALID_NAME**: Name is empty or whitespace only
50
+ - **INVALID_EMAIL**: Email does not follow valid email format
51
+ - **USER_ALREADY_EXISTS**: Email address is already registered by another user
52
+
53
+ ## Test Cases
54
+
55
+ - updates user name
56
+ - updates user email
57
+ - updates both name and email
58
+ - updates user in PENDING status
59
+ - updates user in ACTIVE status
60
+ - updates user in INACTIVE status
61
+ - returns error when user does not exist
62
+ - returns error when no fields are provided
63
+ - returns error when name is empty
64
+ - returns error when name is whitespace only
65
+ - returns error when email format is invalid
66
+ - returns error when email is already used by another user
67
+ - succeeds when email is unchanged (same as current)
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- User Account Management handles the complete user lifecycle from creation through deactivation. Each user has a status that controls their access to the system: PENDING (awaiting activation), ACTIVE (full access), or INACTIVE (access revoked). Status transitions follow defined rules to ensure security and auditability.
5
+ User Account Management handles the complete user lifecycle from creation through deactivation, including profile updates. Each user has a status that controls their access to the system: PENDING (awaiting activation), ACTIVE (full access), or INACTIVE (access revoked). Status transitions follow defined rules to ensure security and auditability. Profile fields (name, email) can be updated at any point in the lifecycle regardless of status.
6
6
 
7
7
  This feature provides the foundation for all identity-related operations in the ERP system.
8
8
 
@@ -12,8 +12,9 @@ Organizations need controlled user provisioning to ensure only authorized indivi
12
12
 
13
13
  - **Onboarding control**: New users start in PENDING status until verified
14
14
  - **Access management**: Only ACTIVE users can perform operations
15
+ - **Profile maintenance**: User name and email can be corrected or updated throughout the account lifecycle
15
16
  - **Offboarding safety**: Deactivated users retain their data for audit purposes while losing access
16
- - **Compliance tracking**: Clear status transitions support regulatory requirements
17
+ - **Compliance tracking**: Clear status transitions support regulatory requirements (GDPR right to rectification supported via profile updates)
17
18
 
18
19
  ## Process Flow
19
20
 
@@ -35,6 +36,16 @@ flowchart TD
35
36
  E -->|deactivateUser| H
36
37
  H -->|reactivateUser| E
37
38
  end
39
+
40
+ subgraph Profile Updates - Admin
41
+ B -->|updateUser| B
42
+ E -->|updateUser| E
43
+ H -->|updateUser| H
44
+ end
45
+
46
+ subgraph Profile Updates - Self
47
+ E -->|updateOwnProfile| E
48
+ end
38
49
  ```
39
50
 
40
51
  ## Scenario Patterns
@@ -42,7 +53,10 @@ flowchart TD
42
53
  - **New Employee Onboarding**: HR creates user account with name and email, user starts in PENDING status. After background check and IT setup complete, administrator activates the user.
43
54
  - **Employee Departure**: When employee resigns or is terminated, administrator deactivates user account. User data is preserved for audit and historical reporting, but all access is revoked.
44
55
  - **Contractor Return Engagement**: Previously offboarded contractor returns for new project. Administrator reactivates existing account rather than creating duplicate, preserving historical associations.
45
- - **Duplicate Prevention**: Attempt to create user with existing email address is rejected with clear error, preventing duplicate accounts.
56
+ - **Profile Correction (Admin)**: Administrator updates a user's name after a legal name change via `updateUser`. The update applies immediately regardless of user status.
57
+ - **Email Change (Admin)**: Administrator updates a user's email address via `updateUser`. The system validates format and uniqueness before applying the change.
58
+ - **Self-Service Profile Update**: An ACTIVE user updates their own name or email via `updateOwnProfile`. The command implicitly targets the calling user — no userId parameter is needed. Only ACTIVE users can update their own profile.
59
+ - **Duplicate Prevention**: Attempt to create or update a user with an email already used by another account is rejected with clear error, preventing duplicate accounts.
46
60
  - **Invalid Activation**: Attempt to activate already-active user or deactivate already-inactive user returns appropriate error with current status.
47
61
 
48
62
  ## Test Cases
@@ -55,6 +69,17 @@ flowchart TD
55
69
  - Deactivating a PENDING user should fail with INVALID_STATUS_TRANSITION error
56
70
  - Reactivating an INACTIVE user should transition status to ACTIVE
57
71
  - Reactivating a PENDING user should fail with INVALID_STATUS_TRANSITION error
72
+ - updateUser: Updating a user's name should succeed for any user status (PENDING, ACTIVE, INACTIVE)
73
+ - updateUser: Updating a user's email to a unique valid email should succeed
74
+ - updateUser: Updating a user's email to an email already used by another user should fail with USER_ALREADY_EXISTS error
75
+ - updateUser: Updating a user with an invalid email format should fail with validation error
76
+ - updateUser: Updating a user's name to empty should fail with validation error
77
+ - updateUser: Updating a non-existent user should fail with USER_NOT_FOUND error
78
+ - updateOwnProfile: ACTIVE user updating own name should succeed
79
+ - updateOwnProfile: ACTIVE user updating own email to a unique valid email should succeed
80
+ - updateOwnProfile: ACTIVE user updating own email to an email already used by another user should fail with USER_ALREADY_EXISTS error
81
+ - updateOwnProfile: PENDING user updating own profile should fail with INVALID_STATUS_TRANSITION error
82
+ - updateOwnProfile: INACTIVE user updating own profile should fail with INVALID_STATUS_TRANSITION error
58
83
  - User email should be validated for proper format
59
84
  - User name should be required and non-empty
60
85
 
@@ -25,6 +25,8 @@ stateDiagram-v2
25
25
  ### Command Definitions
26
26
 
27
27
  - [createUser](../commands/CreateUser.md)
28
+ - [updateUser](../commands/UpdateUser.md)
29
+ - [updateOwnProfile](../commands/UpdateOwnProfile.md)
28
30
  - [activateUser](../commands/ActivateUser.md)
29
31
  - [deactivateUser](../commands/DeactivateUser.md)
30
32
  - [reactivateUser](../commands/ReactivateUser.md)
@@ -60,3 +60,8 @@ export const AssignmentNotFoundError = createDomainError(
60
60
  "AssignmentNotFoundError", "USER_MANAGEMENT_ASSIGNMENT_NOT_FOUND",
61
61
  (identifier: string) => `Role does not have this permission assigned - return not found error indicating the association does not exist: ${identifier}`,
62
62
  );
63
+
64
+ export const InvalidNameError = createDomainError(
65
+ "InvalidNameError", "USER_MANAGEMENT_INVALID_NAME",
66
+ (identifier: string) => `Name is empty or whitespace only: ${identifier}`,
67
+ );
@@ -12,4 +12,6 @@ export const { permissions, own, all } = definePermissions("user-management", [
12
12
  "reactivateUser",
13
13
  "revokePermissionFromRole",
14
14
  "revokeRoleFromUser",
15
+ "updateOwnProfile",
16
+ "updateUser",
15
17
  ] as const);
@@ -9,6 +9,8 @@ import { assignPermissionToRole } from "./command/assignPermissionToRole.generat
9
9
  import { revokePermissionFromRole } from "./command/revokePermissionFromRole.generated";
10
10
  import { assignRoleToUser } from "./command/assignRoleToUser.generated";
11
11
  import { revokeRoleFromUser } from "./command/revokeRoleFromUser.generated";
12
+ import { updateUser } from "./command/updateUser.generated";
13
+ import { updateOwnProfile } from "./command/updateOwnProfile.generated";
12
14
  import { createPermissionType, CreatePermissionTypeParams } from "./db/permission";
13
15
  import { createRoleType, CreateRoleTypeParams } from "./db/role";
14
16
  import { createRolePermissionType, CreateRolePermissionTypeParams } from "./db/rolePermission";
@@ -33,6 +35,7 @@ export interface DefineModuleParams<
33
35
  rolePermission?: CreateRolePermissionTypeParams;
34
36
  }
35
37
 
38
+ /* @__NO_SIDE_EFFECTS__ */
36
39
  export const defineModule = <
37
40
  const UF extends Record<string, TailorAnyDBField> = EmptyFields,
38
41
  const RF extends Record<string, TailorAnyDBField> = EmptyFields,
@@ -67,6 +70,8 @@ export const defineModule = <
67
70
  revokePermissionFromRole: revokePermissionFromRole(),
68
71
  assignRoleToUser: assignRoleToUser(),
69
72
  revokeRoleFromUser: revokeRoleFromUser(),
73
+ updateUser: updateUser<FieldsToInsertable<UF>>(),
74
+ updateOwnProfile: updateOwnProfile<FieldsToInsertable<UF>>(),
70
75
  },
71
76
  };
72
77
  };
@@ -0,0 +1,19 @@
1
+ // Export seed data maps here.
2
+ // Use PascalCase names matching entity types — `erp-kit app generate seed`
3
+ // discovers exports automatically and writes <ExportName>.jsonl files.
4
+ //
5
+ // Example:
6
+ //
7
+ // import { uuidv5 } from "../../../shared/uuidv5";
8
+ // const NS = "erp-kit:<module-name>";
9
+ //
10
+ // export const entityIds = {
11
+ // foo: uuidv5(NS, "entity:foo"),
12
+ // } as const;
13
+ //
14
+ // const entities: Record<string, SeedRow> = {
15
+ // [entityIds.foo]: { name: "Foo", ... },
16
+ // };
17
+ //
18
+ // // Re-export with PascalCase entity name
19
+ // export { entities as Entity };
@@ -29,4 +29,21 @@ export default defineConfig([
29
29
  "import-x/no-unresolved": ["error", { ignore: ["^@tailor-platform/"] }],
30
30
  },
31
31
  },
32
+ {
33
+ files: ["src/executors/**/*.ts", "src/resolvers/**/*.ts"],
34
+ ignores: ["**/*.test.ts"],
35
+ rules: {
36
+ "no-restricted-imports": [
37
+ "error",
38
+ {
39
+ patterns: [
40
+ {
41
+ regex: "^node:",
42
+ message: "Node.js built-in modules are not allowed in executors/resolvers.",
43
+ },
44
+ ],
45
+ },
46
+ ],
47
+ },
48
+ },
32
49
  ]);
@@ -10,6 +10,7 @@
10
10
  "lint:fix": "eslint --cache --fix .",
11
11
  "seed": "node --env-file-if-exists=.env seed/exec.mjs",
12
12
  "seed:reset": "node --env-file-if-exists=.env seed/exec.mjs --truncate --yes",
13
+ "seed:validate": "node --env-file-if-exists=.env seed/exec.mjs validate",
13
14
  "test:integration": "vitest run",
14
15
  "typecheck": "tsc --noEmit",
15
16
  "gql-tada:check": "gql-tada check"
@@ -0,0 +1,20 @@
1
+ import { t } from "@tailor-platform/sdk";
2
+ import { defineSchema } from "@tailor-platform/sdk/seed";
3
+ import { createTailorDBHook, createStandardSchema } from "@tailor-platform/sdk/test";
4
+ import { auditEntry } from "../../src/modules-db";
5
+
6
+ const schemaType = t.object({
7
+ ...auditEntry.pickFields(["id","createdAt"], { optional: true }),
8
+ ...auditEntry.omitFields(["id","createdAt"]),
9
+ });
10
+
11
+ const hook = createTailorDBHook(auditEntry);
12
+
13
+ export const schema = defineSchema(
14
+ createStandardSchema(schemaType, hook),
15
+ {
16
+ indexes: [
17
+ {"name":"auditentry_eventId_unique_idx","columns":["eventId"],"unique":true},
18
+ ],
19
+ }
20
+ );
@@ -0,0 +1,7 @@
1
+ {"id":"00000000-0000-0000-0200-000000000001","entityName":"User","companyId":null,"operationType":"CREATE","status":"ACTIVE"}
2
+ {"id":"00000000-0000-0000-0200-000000000002","entityName":"User","companyId":null,"operationType":"UPDATE","status":"ACTIVE"}
3
+ {"id":"00000000-0000-0000-0200-000000000003","entityName":"Role","companyId":null,"operationType":"CREATE","status":"ACTIVE"}
4
+ {"id":"00000000-0000-0000-0200-000000000004","entityName":"UserRole","companyId":null,"operationType":"CREATE","status":"ACTIVE"}
5
+ {"id":"00000000-0000-0000-0200-000000000005","entityName":"UserRole","companyId":null,"operationType":"DELETE","status":"ACTIVE"}
6
+ {"id":"00000000-0000-0000-0200-000000000006","entityName":"RolePermission","companyId":null,"operationType":"CREATE","status":"ACTIVE"}
7
+ {"id":"00000000-0000-0000-0200-000000000007","entityName":"RolePermission","companyId":null,"operationType":"DELETE","status":"ACTIVE"}
@@ -0,0 +1,15 @@
1
+ import { t } from "@tailor-platform/sdk";
2
+ import { defineSchema } from "@tailor-platform/sdk/seed";
3
+ import { createTailorDBHook, createStandardSchema } from "@tailor-platform/sdk/test";
4
+ import { auditPolicy } from "../../src/modules-db";
5
+
6
+ const schemaType = t.object({
7
+ ...auditPolicy.pickFields(["id","createdAt"], { optional: true }),
8
+ ...auditPolicy.omitFields(["id","createdAt"]),
9
+ });
10
+
11
+ const hook = createTailorDBHook(auditPolicy);
12
+
13
+ export const schema = defineSchema(
14
+ createStandardSchema(schemaType, hook),
15
+ );
@@ -0,0 +1,4 @@
1
+ {"id":"00000000-0000-0000-0100-000000000001","entityName":"User","entityScope":"GLOBAL","auditableFields":"[{\"fieldName\":\"name\"},{\"fieldName\":\"email\"},{\"fieldName\":\"status\"}]"}
2
+ {"id":"00000000-0000-0000-0100-000000000002","entityName":"Role","entityScope":"GLOBAL","auditableFields":"[{\"fieldName\":\"name\"},{\"fieldName\":\"description\"}]"}
3
+ {"id":"00000000-0000-0000-0100-000000000003","entityName":"UserRole","entityScope":"GLOBAL","auditableFields":"[{\"fieldName\":\"userId\"},{\"fieldName\":\"roleId\"}]"}
4
+ {"id":"00000000-0000-0000-0100-000000000004","entityName":"RolePermission","entityScope":"GLOBAL","auditableFields":"[{\"fieldName\":\"roleId\"},{\"fieldName\":\"permissionId\"}]"}
@@ -0,0 +1,20 @@
1
+ import { t } from "@tailor-platform/sdk";
2
+ import { defineSchema } from "@tailor-platform/sdk/seed";
3
+ import { createTailorDBHook, createStandardSchema } from "@tailor-platform/sdk/test";
4
+ import { auditableEntity } from "../../src/modules-db";
5
+
6
+ const schemaType = t.object({
7
+ ...auditableEntity.pickFields(["id","createdAt"], { optional: true }),
8
+ ...auditableEntity.omitFields(["id","createdAt"]),
9
+ });
10
+
11
+ const hook = createTailorDBHook(auditableEntity);
12
+
13
+ export const schema = defineSchema(
14
+ createStandardSchema(schemaType, hook),
15
+ {
16
+ indexes: [
17
+ {"name":"auditableentity_entityName_unique_idx","columns":["entityName"],"unique":true},
18
+ ],
19
+ }
20
+ );