@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
@@ -74,7 +74,7 @@ describe("runUpdate", () => {
74
74
  fs.writeFileSync(path.join(wfDir, "erp-kit-check.yml"), "# Old");
75
75
  runUpdate(tmpDir, ["workflows"]);
76
76
  const content = fs.readFileSync(path.join(wfDir, "erp-kit-check.yml"), "utf-8");
77
- expect(content).toContain("@tailor-platform/erp-kit");
77
+ expect(content).toContain("erp-kit Check");
78
78
  });
79
79
 
80
80
  it("refreshes .claude/skills when it is a copied directory (not a symlink)", () => {
@@ -2,24 +2,33 @@ import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { PACKAGE_ROOT, readErpKitVersion } from "../util";
4
4
 
5
+ // Files that need renaming because they cause issues in the repo/pack.
5
6
  // npm renames .gitignore during pack (npm/cli#5756).
6
- // prepack copies .gitignore to __dot__gitignore to preserve it.
7
+ // pnpm-workspace.yaml causes the template dir to be treated as a workspace member.
8
+ // prepack copies these to their safe names; scaffold time restores the originals.
9
+ const RENAME_MAP: Record<string, string> = {
10
+ __dot__gitignore: ".gitignore",
11
+ "__pnpm-workspace.yaml": "pnpm-workspace.yaml",
12
+ };
13
+
7
14
  export function copyTemplateDir(
8
15
  srcDir: string,
9
16
  destDir: string,
10
17
  replacements: Record<string, string>,
11
18
  placeholderFiles: Set<string>,
19
+ excludeDirs = new Set<string>(),
12
20
  ): void {
13
21
  for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
14
22
  const srcPath = path.join(srcDir, entry.name);
15
- const destName = entry.name === "__dot__gitignore" ? ".gitignore" : entry.name;
23
+ const destName = RENAME_MAP[entry.name] ?? entry.name;
16
24
  const destPath = path.join(destDir, destName);
17
25
 
18
26
  if (entry.name === "node_modules") continue;
27
+ if (excludeDirs.has(entry.name)) continue;
19
28
 
20
29
  if (entry.isDirectory()) {
21
30
  fs.mkdirSync(destPath, { recursive: true });
22
- copyTemplateDir(srcPath, destPath, replacements, placeholderFiles);
31
+ copyTemplateDir(srcPath, destPath, replacements, placeholderFiles, excludeDirs);
23
32
  } else {
24
33
  if (fs.existsSync(destPath)) continue;
25
34
  fs.mkdirSync(path.dirname(destPath), { recursive: true });
@@ -57,5 +66,17 @@ export function scaffoldAppBoilerplate(appDir: string, appName: string): void {
57
66
  '"workspace:*"': `"${erpKitVersion}"`,
58
67
  };
59
68
  const placeholderFiles = new Set(["package.json", "tailor.config.ts", "index.html"]);
60
- copyTemplateDir(templateDir, appDir, replacements, placeholderFiles);
69
+ // docs are authored by skills (app-1 through app-4), not scaffolded.
70
+ copyTemplateDir(templateDir, appDir, replacements, placeholderFiles, new Set(["docs"]));
71
+ }
72
+
73
+ export function scaffoldProjectBoilerplate(projectDir: string, projectName: string): void {
74
+ const templateDir = path.join(PACKAGE_ROOT, "templates", "scaffold", "project");
75
+ const erpKitVersion = readErpKitVersion();
76
+ const replacements = {
77
+ "template-project": projectName,
78
+ '"workspace:*"': `"${erpKitVersion}"`,
79
+ };
80
+ const placeholderFiles = new Set(["package.json"]);
81
+ copyTemplateDir(templateDir, projectDir, replacements, placeholderFiles);
61
82
  }
package/src/module.ts CHANGED
@@ -44,7 +44,10 @@ export {
44
44
  all as itemManagementAll,
45
45
  } from "./modules/item-management/lib/permissions.generated";
46
46
  // audit
47
- export { defineModule as defineAuditModule } from "./modules/audit/module";
47
+ export {
48
+ defineModule as defineAuditModule,
49
+ companyStub as auditCompanyStub,
50
+ } from "./modules/audit/module";
48
51
  export {
49
52
  permissions as auditPermissions,
50
53
  own as auditOwn,
@@ -0,0 +1,63 @@
1
+ # README
2
+
3
+ ## Overview
4
+
5
+ The accounting module provides management (internal) accounting capabilities for budgeting, cost allocation, profit center reporting, and variance analysis. It enables organizations to track, allocate, and analyze costs for internal decision-making, complementing the financial accounting capabilities provided by `finance-ledger` and `coa-management`.
6
+
7
+ This module owns cost centers, profit centers, cost elements, budgets, internal orders, and allocation cycles — entities that exist solely for management accounting purposes and are distinct from the general ledger structure.
8
+
9
+ ## Key Features
10
+
11
+ - **Cost Center Management** — Create and maintain cost centers with hierarchical grouping for overhead cost accumulation and reporting
12
+ - **Cost Element Management** — Define primary cost elements (mapped to GL accounts) and secondary cost elements (internal allocation only)
13
+ - **Profit Center Management** — Create and maintain profit centers with hierarchical grouping for internal P&L reporting
14
+ - **Budget Management** — Create budgets with line items per cost element, manage approval workflows, track budget versions, and enforce budgetary control with commitment-aware availability checks
15
+ - **Cost Allocation** — Execute allocation cycles (assessment/distribution) to distribute overhead costs from sender to receiver cost objects
16
+ - **Internal Order Management** — Track costs for specific short-to-medium-term activities (projects, campaigns, events) with lifecycle management
17
+ - **Variance Analysis** — Compare planned vs. actual costs by cost object and period, categorize variances, and generate management reports
18
+
19
+ ## Module Scope
20
+
21
+ ### In Scope
22
+
23
+ - Cost center CRUD and hierarchy management
24
+ - Profit center CRUD and hierarchy management
25
+ - Primary and secondary cost element definition
26
+ - Budget creation, approval workflow, and line item entry per cost element
27
+ - Budgetary control with commitment-aware availability checks (Budget - Actual - Commitments - Encumbrances)
28
+ - Commitment tracking via purchase module event consumption (PO confirmed, received, invoiced, cancelled)
29
+ - Budget vs. actual comparison
30
+ - Cost allocation cycles (assessment and distribution methods)
31
+ - Allocation rule definition and execution
32
+ - Internal order lifecycle (created → released → technically completed → closed)
33
+ - Variance calculation and categorization (plan vs. actual) with cost-element-level detail lines
34
+ - Multi-version planning (budget, forecast)
35
+ - Audit trail for budget changes, allocation runs, and variance postings
36
+
37
+ ### Out of Scope
38
+
39
+ - Financial (external) accounting — owned by `finance-ledger`
40
+ - Chart of accounts and GL account management — owned by `coa-management`
41
+ - Fiscal year and accounting period management — owned by `finance-ledger`
42
+ - Activity-based costing (activity types, rate calculation) — future extension
43
+ - Statistical key figures as allocation drivers — future extension
44
+ - Multi-dimensional profitability analysis (CO-PA style) — future extension
45
+ - What-if scenario modeling and simulation — future extension
46
+ - Internal order settlement to receivers — future extension
47
+ - Rolling forecasts beyond fiscal year boundaries — future extension
48
+ - Manufacturing variance calculation — owned by `manufacturing`; this module consumes results
49
+ - Transfer pricing between legal entities — future extension
50
+
51
+ ### Scope Decision Rationale
52
+
53
+ The initial scope focuses on the six core entities identified in the roadmap (Budget, BudgetLine, ProfitCenter, CostAllocation, InternalOrder, Variance) plus foundational entities (CostCenter, CostElement) required by all management accounting features. Comprehensive features like activity-based costing and multi-dimensional profitability analysis are deferred as they add significant complexity without being prerequisites for the core budgeting-allocation-variance workflow. The module explicitly does not recreate entities already owned by other modules (fiscal calendar from finance-ledger, GL accounts from coa-management, manufacturing variances from manufacturing).
54
+
55
+ ## Module Dependencies
56
+
57
+ - `primitives` — Currency definitions for multi-currency budget amounts and variance values
58
+ - `organization` — Company scoping for all management accounting entities; Department/Site as optional mapping targets for cost centers and profit centers
59
+ - `coa-management` — GL account references for primary cost elements, budget line items, and allocation target accounts
60
+ - `finance-ledger` — Fiscal year/period alignment for budget periods; journal entry data as source of actuals; subledger integration pattern for posting allocation journal entries
61
+ - `purchase` — Commitment event consumption for budgetary control: PO confirmation creates commitments, goods receipt and invoice match consume commitments, PO cancellation releases commitments
62
+ - `user-management` — Permission definitions for budget creation, allocation execution, and report access
63
+ - `audit` — Audit trail for budget lifecycle transitions, allocation runs, and variance postings
@@ -0,0 +1,6 @@
1
+ // @generated — do not edit
2
+ import { permissions } from "../lib/permissions.generated";
3
+ import { run } from "./activateBudget";
4
+ import { defineCommand } from "@tailor-platform/erp-kit/module";
5
+
6
+ export const activateBudget = defineCommand(permissions.activateBudget, run);
@@ -0,0 +1,119 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import type { Transaction } from "../generated/kysely-tailordb";
4
+ import {
5
+ BudgetNotFoundError,
6
+ InvalidStateError,
7
+ DuplicateActiveBudgetError,
8
+ } from "../lib/errors.generated";
9
+ import { approvedBudget, baseBudget, activeBudget, basePlanVersion } from "../testing/fixtures";
10
+ import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
11
+ import { run } from "./activateBudget";
12
+
13
+ const forecastPlanVersion = { ...basePlanVersion, id: "plan-version-forecast", type: "FORECAST" };
14
+ const simulationPlanVersion = { ...basePlanVersion, id: "plan-version-sim", type: "SIMULATION" };
15
+
16
+ describe("activateBudget", () => {
17
+ it("activates an APPROVED budget transitioning it to ACTIVE status", async () => {
18
+ const activatedBudget = { ...approvedBudget, status: "ACTIVE" };
19
+ const { db, spies } = createMockDb<Transaction>();
20
+ spies.select
21
+ .mockReturnValueOnce(approvedBudget)
22
+ .mockReturnValueOnce(basePlanVersion) // plan version type BUDGET
23
+ .mockReturnValueOnce(undefined); // no existing active
24
+ spies.update.mockReturnValueOnce(activatedBudget);
25
+
26
+ const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
27
+
28
+ const value = expectOk(result);
29
+ expect(value.budget.status).toBe("ACTIVE");
30
+ });
31
+
32
+ it("enables funds checking upon activation", async () => {
33
+ const activatedBudget = { ...approvedBudget, status: "ACTIVE" };
34
+ const { db, spies } = createMockDb<Transaction>();
35
+ spies.select
36
+ .mockReturnValueOnce(approvedBudget)
37
+ .mockReturnValueOnce(basePlanVersion)
38
+ .mockReturnValueOnce(undefined);
39
+ spies.update.mockReturnValueOnce(activatedBudget);
40
+
41
+ const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
42
+
43
+ const value = expectOk(result);
44
+ expect(value.budget.status).toBe("ACTIVE");
45
+ });
46
+
47
+ it("returns error when budget does not exist", async () => {
48
+ const { db, spies } = createMockDb<Transaction>();
49
+ spies.select.mockReturnValueOnce(undefined);
50
+
51
+ const result = await run(db, { budgetId: "missing" }, commandCtx);
52
+
53
+ expectErr(result, BudgetNotFoundError);
54
+ });
55
+
56
+ it("returns error when budget is not in APPROVED status", async () => {
57
+ const { db, spies } = createMockDb<Transaction>();
58
+ spies.select.mockReturnValueOnce(baseBudget); // DRAFT
59
+
60
+ const result = await run(db, { budgetId: baseBudget.id }, commandCtx);
61
+
62
+ expectErr(result, InvalidStateError);
63
+ });
64
+
65
+ it("returns error when another ACTIVE BUDGET exists for the same cost object and fiscal year", async () => {
66
+ const { db, spies } = createMockDb<Transaction>();
67
+ spies.select
68
+ .mockReturnValueOnce(approvedBudget)
69
+ .mockReturnValueOnce(basePlanVersion) // type BUDGET
70
+ .mockReturnValueOnce(activeBudget) // existing active
71
+ .mockReturnValueOnce(basePlanVersion); // existing active's plan version is also BUDGET
72
+ // no update mock needed — should return error
73
+
74
+ const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
75
+
76
+ expectErr(result, DuplicateActiveBudgetError);
77
+ });
78
+
79
+ it("allows multiple ACTIVE FORECAST versions for the same cost object and fiscal year", async () => {
80
+ const forecastApproved = { ...approvedBudget, planVersionId: forecastPlanVersion.id };
81
+ const activatedBudget = { ...forecastApproved, status: "ACTIVE" };
82
+ const { db, spies } = createMockDb<Transaction>();
83
+ spies.select.mockReturnValueOnce(forecastApproved).mockReturnValueOnce(forecastPlanVersion); // type FORECAST — skip uniqueness check
84
+ spies.update.mockReturnValueOnce(activatedBudget);
85
+
86
+ const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
87
+
88
+ const value = expectOk(result);
89
+ expect(value.budget.status).toBe("ACTIVE");
90
+ });
91
+
92
+ it("allows multiple ACTIVE SIMULATION versions for the same cost object and fiscal year", async () => {
93
+ const simApproved = { ...approvedBudget, planVersionId: simulationPlanVersion.id };
94
+ const activatedBudget = { ...simApproved, status: "ACTIVE" };
95
+ const { db, spies } = createMockDb<Transaction>();
96
+ spies.select.mockReturnValueOnce(simApproved).mockReturnValueOnce(simulationPlanVersion); // type SIMULATION — skip uniqueness check
97
+ spies.update.mockReturnValueOnce(activatedBudget);
98
+
99
+ const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
100
+
101
+ const value = expectOk(result);
102
+ expect(value.budget.status).toBe("ACTIVE");
103
+ });
104
+
105
+ it("emits audit event recording the status transition and acting user", async () => {
106
+ const activatedBudget = { ...approvedBudget, status: "ACTIVE" };
107
+ const { db, spies } = createMockDb<Transaction>();
108
+ spies.select
109
+ .mockReturnValueOnce(approvedBudget)
110
+ .mockReturnValueOnce(basePlanVersion)
111
+ .mockReturnValueOnce(undefined);
112
+ spies.update.mockReturnValueOnce(activatedBudget);
113
+
114
+ const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
115
+
116
+ expectOk(result);
117
+ expect(spies.update).toHaveBeenCalled();
118
+ });
119
+ });
@@ -0,0 +1,77 @@
1
+ import type { Transaction } from "../generated/kysely-tailordb";
2
+ import {
3
+ BudgetNotFoundError,
4
+ InvalidStateError,
5
+ DuplicateActiveBudgetError,
6
+ } from "../lib/errors.generated";
7
+ import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/module";
8
+
9
+ export interface ActivateBudgetInput {
10
+ budgetId: string;
11
+ }
12
+
13
+ export async function run(db: Transaction, input: ActivateBudgetInput, ctx: CommandContext) {
14
+ void ctx;
15
+
16
+ // Fetch budget with lock
17
+ const budget = await db
18
+ .selectFrom("Budget")
19
+ .where("id", "=", input.budgetId)
20
+ .selectAll()
21
+ .forUpdate()
22
+ .executeTakeFirst();
23
+
24
+ if (!budget) {
25
+ return err(new BudgetNotFoundError(input.budgetId));
26
+ }
27
+
28
+ if (budget.status !== "APPROVED") {
29
+ return err(new InvalidStateError(input.budgetId));
30
+ }
31
+
32
+ // Check plan version type — only BUDGET type needs uniqueness check
33
+ const planVersion = await db
34
+ .selectFrom("PlanVersion")
35
+ .where("id", "=", budget.planVersionId)
36
+ .selectAll()
37
+ .executeTakeFirst();
38
+
39
+ if (planVersion?.type === "BUDGET") {
40
+ // Check no other ACTIVE budget of type BUDGET exists for same cost object and fiscal year
41
+ const existingActive = await db
42
+ .selectFrom("Budget")
43
+ .where("costObjectType", "=", budget.costObjectType)
44
+ .where("costObjectId", "=", budget.costObjectId)
45
+ .where("fiscalYearId", "=", budget.fiscalYearId)
46
+ .where("status", "=", "ACTIVE")
47
+ .where("id", "!=", input.budgetId)
48
+ .selectAll()
49
+ .executeTakeFirst();
50
+
51
+ if (existingActive) {
52
+ // Verify the existing active budget is also of type BUDGET
53
+ const existingPlanVersion = await db
54
+ .selectFrom("PlanVersion")
55
+ .where("id", "=", existingActive.planVersionId)
56
+ .selectAll()
57
+ .executeTakeFirst();
58
+
59
+ if (existingPlanVersion?.type === "BUDGET") {
60
+ return err(new DuplicateActiveBudgetError(input.budgetId));
61
+ }
62
+ }
63
+ }
64
+
65
+ // Transition to ACTIVE (which enables funds checking)
66
+ const updated = await db
67
+ .updateTable("Budget")
68
+ .set({
69
+ status: "ACTIVE",
70
+ updatedAt: new Date(),
71
+ })
72
+ .where("id", "=", input.budgetId)
73
+ .returningAll()
74
+ .executeTakeFirst();
75
+
76
+ return ok({ budget: updated! });
77
+ }
@@ -0,0 +1,6 @@
1
+ // @generated — do not edit
2
+ import { permissions } from "../lib/permissions.generated";
3
+ import { run } from "./activateCostElement";
4
+ import { defineCommand } from "@tailor-platform/erp-kit/module";
5
+
6
+ export const activateCostElement = defineCommand(permissions.activateCostElement, run);
@@ -0,0 +1,59 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import type { Transaction } from "../generated/kysely-tailordb";
4
+ import { CostElementNotFoundError, InvalidStateError } from "../lib/errors.generated";
5
+ import { baseCostElement, activeCostElement, inactiveCostElement } from "../testing/fixtures";
6
+ import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
7
+ import { run } from "./activateCostElement";
8
+
9
+ describe("activateCostElement", () => {
10
+ it("activates a DRAFT cost element transitioning it to ACTIVE status", async () => {
11
+ const { db, spies } = createMockDb<Transaction>();
12
+ spies.select.mockReturnValueOnce(baseCostElement);
13
+ const updated = { ...baseCostElement, status: "ACTIVE" };
14
+ spies.update.mockReturnValueOnce(updated);
15
+
16
+ const result = await run(db, { costElementId: baseCostElement.id }, commandCtx);
17
+
18
+ const value = expectOk(result);
19
+ expect(value.costElement.status).toBe("ACTIVE");
20
+ });
21
+
22
+ it("returns error when cost element does not exist", async () => {
23
+ const { db, spies } = createMockDb<Transaction>();
24
+ spies.select.mockReturnValueOnce(undefined);
25
+
26
+ const result = await run(db, { costElementId: "missing" }, commandCtx);
27
+
28
+ expectErr(result, CostElementNotFoundError);
29
+ });
30
+
31
+ it("returns error when cost element is already ACTIVE", async () => {
32
+ const { db, spies } = createMockDb<Transaction>();
33
+ spies.select.mockReturnValueOnce(activeCostElement);
34
+
35
+ const result = await run(db, { costElementId: activeCostElement.id }, commandCtx);
36
+
37
+ expectErr(result, InvalidStateError);
38
+ });
39
+
40
+ it("returns error when cost element is INACTIVE", async () => {
41
+ const { db, spies } = createMockDb<Transaction>();
42
+ spies.select.mockReturnValueOnce(inactiveCostElement);
43
+
44
+ const result = await run(db, { costElementId: inactiveCostElement.id }, commandCtx);
45
+
46
+ expectErr(result, InvalidStateError);
47
+ });
48
+
49
+ it("emits audit event recording the status transition and acting user", async () => {
50
+ const { db, spies } = createMockDb<Transaction>();
51
+ spies.select.mockReturnValueOnce(baseCostElement);
52
+ spies.update.mockReturnValueOnce({ ...baseCostElement, status: "ACTIVE" });
53
+
54
+ const result = await run(db, { costElementId: baseCostElement.id }, commandCtx);
55
+
56
+ expectOk(result);
57
+ expect(spies.update).toHaveBeenCalled();
58
+ });
59
+ });
@@ -0,0 +1,41 @@
1
+ import type { Transaction } from "../generated/kysely-tailordb";
2
+ import { CostElementNotFoundError, InvalidStateError } from "../lib/errors.generated";
3
+ import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/module";
4
+
5
+ export interface ActivateCostElementInput {
6
+ costElementId: string;
7
+ from?: string[];
8
+ }
9
+
10
+ /** Command: activateCostElement
11
+ * Transitions a cost element from DRAFT status to ACTIVE status.
12
+ */
13
+ export async function run(db: Transaction, input: ActivateCostElementInput, ctx: CommandContext) {
14
+ void ctx;
15
+
16
+ const validFromStatuses = input.from ?? ["DRAFT"];
17
+
18
+ const costElement = await db
19
+ .selectFrom("CostElement")
20
+ .selectAll()
21
+ .where("id", "=", input.costElementId)
22
+ .forUpdate()
23
+ .executeTakeFirst();
24
+
25
+ if (!costElement) {
26
+ return err(new CostElementNotFoundError(input.costElementId));
27
+ }
28
+
29
+ if (!validFromStatuses.includes(costElement.status)) {
30
+ return err(new InvalidStateError(input.costElementId));
31
+ }
32
+
33
+ const updated = await db
34
+ .updateTable("CostElement")
35
+ .set({ status: "ACTIVE", updatedAt: new Date() })
36
+ .where("id", "=", input.costElementId)
37
+ .returningAll()
38
+ .executeTakeFirst();
39
+
40
+ return ok({ costElement: updated! });
41
+ }
@@ -0,0 +1,6 @@
1
+ // @generated — do not edit
2
+ import { permissions } from "../lib/permissions.generated";
3
+ import { run } from "./activateProfitCenter";
4
+ import { defineCommand } from "@tailor-platform/erp-kit/module";
5
+
6
+ export const activateProfitCenter = defineCommand(permissions.activateProfitCenter, run);
@@ -0,0 +1,60 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import type { Transaction } from "../generated/kysely-tailordb";
4
+ import { ProfitCenterNotFoundError, InvalidStateError } from "../lib/errors.generated";
5
+ import { baseProfitCenter, activeProfitCenter, inactiveProfitCenter } from "../testing/fixtures";
6
+ import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
7
+ import { run } from "./activateProfitCenter";
8
+
9
+ describe("activateProfitCenter", () => {
10
+ it("activates a DRAFT profit center transitioning it to ACTIVE status", async () => {
11
+ const activated = { ...baseProfitCenter, status: "ACTIVE" };
12
+ const { db, spies } = createMockDb<Transaction>();
13
+ spies.select.mockReturnValueOnce(baseProfitCenter);
14
+ spies.update.mockReturnValueOnce(activated);
15
+
16
+ const result = await run(db, { profitCenterId: baseProfitCenter.id }, commandCtx);
17
+
18
+ const value = expectOk(result);
19
+ expect(value.profitCenter.status).toBe("ACTIVE");
20
+ });
21
+
22
+ it("returns error when profit center does not exist", async () => {
23
+ const { db, spies } = createMockDb<Transaction>();
24
+ spies.select.mockReturnValueOnce(undefined);
25
+
26
+ const result = await run(db, { profitCenterId: "missing-id" }, commandCtx);
27
+
28
+ expectErr(result, ProfitCenterNotFoundError);
29
+ });
30
+
31
+ it("returns error when profit center is already ACTIVE", async () => {
32
+ const { db, spies } = createMockDb<Transaction>();
33
+ spies.select.mockReturnValueOnce(activeProfitCenter);
34
+
35
+ const result = await run(db, { profitCenterId: activeProfitCenter.id }, commandCtx);
36
+
37
+ expectErr(result, InvalidStateError);
38
+ });
39
+
40
+ it("returns error when profit center is INACTIVE", async () => {
41
+ const { db, spies } = createMockDb<Transaction>();
42
+ spies.select.mockReturnValueOnce(inactiveProfitCenter);
43
+
44
+ const result = await run(db, { profitCenterId: inactiveProfitCenter.id }, commandCtx);
45
+
46
+ expectErr(result, InvalidStateError);
47
+ });
48
+
49
+ it("emits audit event recording the status transition and acting user", async () => {
50
+ const activated = { ...baseProfitCenter, status: "ACTIVE" };
51
+ const { db, spies } = createMockDb<Transaction>();
52
+ spies.select.mockReturnValueOnce(baseProfitCenter);
53
+ spies.update.mockReturnValueOnce(activated);
54
+
55
+ const result = await run(db, { profitCenterId: baseProfitCenter.id }, commandCtx);
56
+
57
+ expectOk(result);
58
+ expect(spies.update).toHaveBeenCalled();
59
+ });
60
+ });
@@ -0,0 +1,38 @@
1
+ import type { Transaction } from "../generated/kysely-tailordb";
2
+ import { ProfitCenterNotFoundError, InvalidStateError } from "../lib/errors.generated";
3
+ import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/module";
4
+
5
+ export interface ActivateProfitCenterInput {
6
+ profitCenterId: string;
7
+ from?: string[];
8
+ }
9
+
10
+ export async function run(db: Transaction, input: ActivateProfitCenterInput, ctx: CommandContext) {
11
+ void ctx;
12
+
13
+ const validFromStatuses = input.from ?? ["DRAFT"];
14
+
15
+ const profitCenter = await db
16
+ .selectFrom("ProfitCenter")
17
+ .selectAll()
18
+ .where("id", "=", input.profitCenterId)
19
+ .forUpdate()
20
+ .executeTakeFirst();
21
+
22
+ if (!profitCenter) {
23
+ return err(new ProfitCenterNotFoundError(input.profitCenterId));
24
+ }
25
+
26
+ if (!validFromStatuses.includes(profitCenter.status)) {
27
+ return err(new InvalidStateError(input.profitCenterId));
28
+ }
29
+
30
+ const updated = await db
31
+ .updateTable("ProfitCenter")
32
+ .set({ status: "ACTIVE", updatedAt: new Date() })
33
+ .where("id", "=", input.profitCenterId)
34
+ .returningAll()
35
+ .executeTakeFirst();
36
+
37
+ return ok({ profitCenter: updated! });
38
+ }
@@ -0,0 +1,6 @@
1
+ // @generated — do not edit
2
+ import { permissions } from "../lib/permissions.generated";
3
+ import { run } from "./approveBudget";
4
+ import { defineCommand } from "@tailor-platform/erp-kit/module";
5
+
6
+ export const approveBudget = defineCommand(permissions.approveBudget, run);
@@ -0,0 +1,69 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import type { Transaction } from "../generated/kysely-tailordb";
4
+ import {
5
+ BudgetNotFoundError,
6
+ InvalidStateError,
7
+ SelfApprovalNotAllowedError,
8
+ } from "../lib/errors.generated";
9
+ import { submittedBudget, baseBudget, baseUser } from "../testing/fixtures";
10
+ import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
11
+ import { run } from "./approveBudget";
12
+
13
+ // submittedBudget.createdByUserId === baseUser.id === "user-1"
14
+ // commandCtx.actorId === "test-actor" (different from creator)
15
+
16
+ describe("approveBudget", () => {
17
+ it("approves a SUBMITTED budget transitioning it to APPROVED status", async () => {
18
+ const approvedResult = { ...submittedBudget, status: "APPROVED" };
19
+ const { db, spies } = createMockDb<Transaction>();
20
+ spies.select.mockReturnValueOnce(submittedBudget);
21
+ spies.update.mockReturnValueOnce(approvedResult);
22
+
23
+ const result = await run(db, { budgetId: submittedBudget.id }, commandCtx);
24
+
25
+ const value = expectOk(result);
26
+ expect(value.budget.status).toBe("APPROVED");
27
+ });
28
+
29
+ it("returns error when budget does not exist", async () => {
30
+ const { db, spies } = createMockDb<Transaction>();
31
+ spies.select.mockReturnValueOnce(undefined);
32
+
33
+ const result = await run(db, { budgetId: "missing" }, commandCtx);
34
+
35
+ expectErr(result, BudgetNotFoundError);
36
+ });
37
+
38
+ it("returns error when budget is not in SUBMITTED status", async () => {
39
+ const { db, spies } = createMockDb<Transaction>();
40
+ spies.select.mockReturnValueOnce(baseBudget); // DRAFT
41
+
42
+ const result = await run(db, { budgetId: baseBudget.id }, commandCtx);
43
+
44
+ expectErr(result, InvalidStateError);
45
+ });
46
+
47
+ it("returns error when approver is the same as the budget creator", async () => {
48
+ // createdByUserId = "user-1", set actorId to match
49
+ const selfCtx = { ...commandCtx, actorId: baseUser.id };
50
+ const { db, spies } = createMockDb<Transaction>();
51
+ spies.select.mockReturnValueOnce(submittedBudget);
52
+
53
+ const result = await run(db, { budgetId: submittedBudget.id }, selfCtx);
54
+
55
+ expectErr(result, SelfApprovalNotAllowedError);
56
+ });
57
+
58
+ it("emits audit event recording the status transition and approver", async () => {
59
+ const approvedResult = { ...submittedBudget, status: "APPROVED" };
60
+ const { db, spies } = createMockDb<Transaction>();
61
+ spies.select.mockReturnValueOnce(submittedBudget);
62
+ spies.update.mockReturnValueOnce(approvedResult);
63
+
64
+ const result = await run(db, { budgetId: submittedBudget.id }, commandCtx);
65
+
66
+ expectOk(result);
67
+ expect(spies.update).toHaveBeenCalled();
68
+ });
69
+ });