@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,129 @@
1
+ # Cost Allocation
2
+
3
+ ## Overview
4
+
5
+ Cost Allocation is the process of distributing overhead costs from sender cost centers to receiver cost objects (cost centers, profit centers, or internal orders) using configurable allocation cycles and rules. The module supports two distinct allocation methods: assessment, which posts using secondary cost elements (aggregating the original cost elements into a single overhead category on the receiver), and distribution, which preserves the original primary cost elements on the receiver side for full cost transparency.
6
+
7
+ An allocation cycle groups a set of allocation rules, each defining a sender cost center, one or more receiver cost objects, and the allocation basis (fixed percentage or amount-based factor). Cycles progress through a controlled lifecycle — DRAFT, VALIDATED, EXECUTED, POSTED, and optionally REVERSED — ensuring that allocations are reviewed and tested before they affect the general ledger. Execution first runs in test mode to preview results, then in actual mode to generate immutable allocation result records. Posting creates journal entries through the finance-ledger subledger integration pattern, and corrections are handled exclusively via reversal and re-posting, never by deletion.
8
+
9
+ ## Business Purpose
10
+
11
+ Organizations need a structured cost allocation mechanism to accurately assign indirect and overhead costs to the business areas that consume them:
12
+
13
+ - **Overhead cost distribution**: Shared service costs (IT, facilities, HR) must be allocated to the operating units that benefit from them, enabling accurate product and service costing
14
+ - **Assessment vs distribution flexibility**: Assessment simplifies receiver-side reporting by consolidating costs under secondary cost elements, while distribution preserves original cost element detail for granular cost analysis — organizations choose based on their reporting requirements
15
+ - **Allocation rule governance**: Configurable rules with percentage-based or factor-based allocation bases ensure that cost distribution reflects actual resource consumption or agreed-upon sharing ratios
16
+ - **Percentage completeness validation**: Allocation rules for a given sender must have receiver percentages summing to exactly 100%, preventing under- or over-allocation of costs
17
+ - **Test run capability**: Executing an allocation cycle in test mode allows controllers to review projected results before committing actual postings, reducing the risk of errors in the general ledger
18
+ - **Immutable audit trail**: Allocation results are recorded as immutable records linking cycle, sender, receiver, allocated amount, and cost element, satisfying internal control and external audit requirements
19
+ - **Correction via reversal**: Posted allocations cannot be modified or deleted — corrections require reversing the entire cycle and re-executing with corrected rules, preserving full traceability of all cost movements
20
+ - **Period and company scoping**: Allocation cycles are scoped to a specific company and accounting period, ensuring that cost distributions align with the correct reporting boundaries
21
+ - **Ledger integration**: Allocation postings flow through the finance-ledger journal entry system, maintaining consistency between the cost accounting subledger and the general ledger
22
+
23
+ ## Process Flow
24
+
25
+ ```mermaid
26
+ stateDiagram-v2
27
+ [*] --> Draft: createAllocationCycle
28
+ Draft --> Draft: updateAllocationCycle / addAllocationRule / removeAllocationRule
29
+ Draft --> Validated: validateAllocationCycle
30
+ Validated --> Draft: invalidateAllocationCycle
31
+ Validated --> Executed: executeAllocationCycle (ACTUAL)
32
+ Executed --> Posted: postAllocationCycle
33
+ Posted --> Reversed: reverseAllocationCycle
34
+ ```
35
+
36
+ ```mermaid
37
+ flowchart TD
38
+ A[Define allocation cycle with type and period] --> B[Add allocation rules: sender, receivers, percentages]
39
+ B --> C{All sender rules sum to 100%?}
40
+ C -- No --> D[Adjust rule percentages]
41
+ D --> B
42
+ C -- Yes --> E[Validate allocation cycle]
43
+ E --> F[Execute in TEST_RUN mode]
44
+ F --> G{Review test results acceptable?}
45
+ G -- No --> H[Return to DRAFT and adjust rules]
46
+ H --> B
47
+ G -- Yes --> I[Execute in ACTUAL mode]
48
+ I --> J[Immutable AllocationResult records created]
49
+ J --> K[Post allocation cycle]
50
+ K --> L{Assessment or Distribution?}
51
+ L -- Assessment --> M[Create journal entries with secondary cost elements]
52
+ L -- Distribution --> N[Create journal entries preserving original cost elements]
53
+ M --> O[Journal entries posted via finance-ledger]
54
+ N --> O
55
+ O --> P[Allocation complete]
56
+ ```
57
+
58
+ ```mermaid
59
+ flowchart TD
60
+ A[Select posted allocation cycle to reverse] --> B[Create reversal journal entries with inverted amounts]
61
+ B --> C{Reversal period OPEN or FUTURE_ENTERABLE?}
62
+ C -- No --> D[Select valid reversal period]
63
+ D --> C
64
+ C -- Yes --> E[Post reversal entries via finance-ledger]
65
+ E --> F[Allocation cycle status set to REVERSED]
66
+ F --> G[Original allocation amounts offset to zero]
67
+ ```
68
+
69
+ ## Scenario Patterns
70
+
71
+ - **IT Department Overhead Assessment**: The IT cost center incurs infrastructure and support costs that serve multiple business units. An assessment cycle allocates these costs to the Sales, Manufacturing, and R&D cost centers using secondary cost element "IT Overhead Assessment" with fixed percentages (40%, 35%, 25%). Receivers see a single aggregated IT overhead line rather than individual cost element details
72
+ - **Facilities Cost Distribution**: Building maintenance, utilities, and security costs from the Facilities cost center are distributed to three profit centers based on floor space ratios. Distribution method preserves the original cost elements (rent, electricity, cleaning) on the receiver side, enabling profit center managers to see the detailed breakdown of facility costs they are consuming
73
+ - **Shared Services Assessment to Internal Orders**: A central HR shared services cost center allocates recruitment and training costs to project-based internal orders using assessment. Each internal order receives an overhead charge under a secondary cost element, enabling project managers to see the total loaded cost of their initiatives
74
+ - **Multi-Receiver Percentage Allocation**: A logistics cost center distributes warehousing costs to five regional profit centers using percentages derived from order volume (30%, 25%, 20%, 15%, 10%). The controller validates that percentages total 100%, runs a test execution to verify amounts, and then executes and posts the actual allocation
75
+ - **Test Run Review and Adjustment**: A cost controller sets up an allocation cycle for administrative overhead but notices during the test run that one receiver cost center has been decommissioned. The controller returns the cycle to DRAFT, updates the rules to redirect that portion to the successor cost center, re-validates, and executes again
76
+ - **Allocation Reversal and Correction**: After posting a quarterly assessment cycle, a controller discovers that the allocation percentages were based on outdated headcount data. The controller reverses the posted cycle, creates a new cycle with corrected percentages, validates, executes, and posts the corrected allocation — both the original and corrected postings remain in the ledger for full auditability
77
+ - **Period-End Overhead Allocation**: At month-end close, the accounting team executes multiple allocation cycles to distribute all overhead cost centers before generating management reports. Each cycle targets the current accounting period and is posted sequentially to ensure dependent allocations (e.g., secondary cost centers that received allocations themselves) are captured correctly
78
+
79
+ ## Test Cases
80
+
81
+ - Allocation cycle lifecycle follows DRAFT -> VALIDATED -> EXECUTED -> POSTED state machine; posted cycles can transition to REVERSED
82
+ - Allocation cycle can only be created in DRAFT status
83
+ - Allocation cycle requires a valid type (ASSESSMENT or DISTRIBUTION)
84
+ - Allocation cycle requires a valid name
85
+ - Allocation cycle must reference a valid companyId; the company must be in ACTIVE status
86
+ - Allocation cycle must reference a valid accounting period
87
+ - Allocation rules can be added to or removed from a DRAFT allocation cycle
88
+ - Allocation rules cannot be added to or removed from a VALIDATED, EXECUTED, POSTED, or REVERSED cycle
89
+ - Each allocation rule must reference a valid sender cost center
90
+ - Each allocation rule must reference a valid receiver cost object (cost center, profit center, or internal order)
91
+ - A sender cost center cannot also appear as a receiver within the same allocation rule set
92
+ - Allocation rule percentages for a given sender must sum to exactly 100%
93
+ - Allocation rules with percentages not summing to 100% for any sender cause validation to fail
94
+ - Allocation rule percentage values must be positive (greater than zero)
95
+ - Validating a DRAFT cycle with valid rules transitions its status to VALIDATED
96
+ - Validating a cycle with no allocation rules fails
97
+ - A VALIDATED cycle can be returned to DRAFT for further editing
98
+ - Executing an allocation cycle in TEST_RUN mode generates preview results without changing cycle status to EXECUTED
99
+ - Executing an allocation cycle in ACTUAL mode transitions its status from VALIDATED to EXECUTED
100
+ - Execution in ACTUAL mode creates immutable AllocationResult records for each sender-receiver-amount combination
101
+ - AllocationResult records cannot be modified or deleted after creation
102
+ - Each AllocationResult references the allocation cycle, sender, receiver, allocated amount, and cost element used
103
+ - Executing a cycle that is not in VALIDATED status fails with an invalid status transition error
104
+ - Posting an EXECUTED cycle creates journal entries through the finance-ledger subledger integration
105
+ - Assessment-type allocation postings use secondary cost elements in the generated journal entries
106
+ - Distribution-type allocation postings preserve the original primary cost elements in the generated journal entries
107
+ - Posting transitions the cycle status from EXECUTED to POSTED
108
+ - Posting a cycle that is not in EXECUTED status fails with an invalid status transition error
109
+ - Journal entries created by posting reference the allocation cycle as the source document
110
+ - Reversing a POSTED cycle creates reversal journal entries with inverted amounts
111
+ - Reversal transitions the cycle status from POSTED to REVERSED
112
+ - Reversing a cycle that is not in POSTED status fails with an invalid status transition error
113
+ - Reversal journal entries must target a period that is in OPEN or FUTURE_ENTERABLE status
114
+ - A REVERSED cycle cannot be reversed again
115
+ - Allocation cycles are scoped to a company; cycles from different companies are fully isolated
116
+ - Allocation cycles reference a specific accounting period; the period must be in OPEN or FUTURE_ENTERABLE status for posting
117
+ - Posting an allocation cycle to a CLOSED or PERMANENTLY_CLOSED period is rejected
118
+ - Updating allocation cycle fields (name, rules) is only permitted while the cycle is in DRAFT status
119
+ - Deleting an allocation cycle is only permitted while in DRAFT status
120
+ - Creating an allocation cycle emits an audit event recording the acting user, timestamp, and initial field values
121
+ - Validating, executing, posting, and reversing an allocation cycle each emit audit events recording the status transition and acting user
122
+ - Only users with appropriate permissions can create, validate, execute, post, or reverse allocation cycles
123
+
124
+ ## Reference Links
125
+
126
+ - [SAP Cost Center Accounting: Assessment and Distribution](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee3509643e954b3da2e0ebfa846c02e1/b867e2f9b57c4dc3b7ec7356aca3bb4e.html)
127
+ - [SAP Allocation Cycles in Controlling](https://help.sap.com/docs/SAP_ERP/29e50beaa37a447f8e4c13b0c5a15f32/42a07c62b9f343e0e10000000a11466f.html)
128
+ - [Oracle Fusion Cost Allocation Manager](https://docs.oracle.com/en/cloud/saas/financials/24d/oafcf/cost-allocation.html)
129
+ - [Odoo Analytic Accounting and Cost Distribution](https://www.odoo.com/documentation/19.0/applications/finance/accounting/reporting/analytic_accounting.html)
@@ -0,0 +1,118 @@
1
+ # cost-center-management
2
+
3
+ ## Overview
4
+
5
+ Cost Center Management is the foundational feature of the accounting module, providing the ability to create, maintain, and hierarchically organize cost centers for overhead cost accumulation and management accounting reporting. A cost center represents a responsibility area within a company that accumulates costs — such as an IT department, a production floor, or a facilities group. Each cost center carries a code, name, description, category (e.g., overhead, production, administration, sales), responsible person, optional department reference, validity period (valid-from/to dates), and a position within a cost center hierarchy.
6
+
7
+ Cost centers are distinct from organizational departments: a single cost center can span multiple departments, and a single department can map to multiple cost centers. This separation allows management accounting structures to evolve independently of the organizational chart. Cost centers are scoped to a Company (from the organization module) and serve as the primary receiver for overhead costs, acting as the foundational cost object referenced by cost allocation, budget management, variance analysis, and internal order settlement. A standard cost center hierarchy must be established before cost centers can be created, following the SAP CO pattern where a hierarchy root is a prerequisite for cost center master data.
8
+
9
+ ## Business Purpose
10
+
11
+ Organizations need a structured cost center framework to track and control overhead costs for internal decision-making:
12
+
13
+ - **Overhead cost accumulation**: Cost centers collect indirect costs (rent, utilities, salaries, depreciation) that cannot be directly assigned to products or services, providing visibility into where overhead costs originate
14
+ - **Management responsibility assignment**: Each cost center has a designated responsible person, enabling accountability for cost control at the organizational unit level and supporting delegation of budgetary authority
15
+ - **Hierarchical roll-up reporting**: Cost center hierarchies allow costs to be aggregated from leaf-level cost centers up through intermediate grouping nodes to the root, enabling management reporting at any level of granularity
16
+ - **Foundation for cost allocation**: Cost centers serve as senders and receivers in cost allocation cycles (assessment and distribution), making them prerequisites for the cost-allocation feature
17
+ - **Budget anchoring**: Budgets are created against cost centers and their associated cost elements, making cost center master data a prerequisite for the budget-management feature
18
+ - **Variance analysis basis**: Plan-vs-actual comparisons are performed at the cost center level, requiring stable cost center definitions with clear validity periods
19
+ - **Separation from organizational structure**: Decoupling cost centers from departments allows the management accounting structure to reflect cost responsibility boundaries rather than HR reporting lines, supporting matrix organizations and shared service models
20
+ - **Temporal validity**: Valid-from and valid-to dates enable cost centers to be introduced for new organizational units or retired when restructuring occurs, without deleting historical cost data
21
+ - **Category-based classification**: Cost center categories (overhead, production, administration, sales, research) enable filtering, default cost element assignment, and category-specific reporting across the management accounting module
22
+
23
+ ## Process Flow
24
+
25
+ ```mermaid
26
+ stateDiagram-v2
27
+ [*] --> HierarchyCreated: createCostCenterHierarchy
28
+ HierarchyCreated --> HierarchyActive: addRootNode
29
+ HierarchyActive --> HierarchyActive: addChildNode / removeNode / reorganizeNodes
30
+ ```
31
+
32
+ ```mermaid
33
+ flowchart TD
34
+ A[Establish cost center hierarchy] --> B[Create hierarchy with name and version]
35
+ B --> C[Define root node]
36
+ C --> D[Add child nodes to build grouping structure]
37
+ D --> E{Hierarchy complete?}
38
+ E -- No --> D
39
+ E -- Yes --> F[Hierarchy ready for cost center assignment]
40
+ ```
41
+
42
+ ```mermaid
43
+ flowchart TD
44
+ A[Create cost center master data] --> B[Assign code, name, category]
45
+ B --> C[Set responsible person and optional department reference]
46
+ C --> D[Define valid-from and valid-to dates]
47
+ D --> E[Assign to hierarchy node]
48
+ E --> F{Hierarchy node exists?}
49
+ F -- No --> G[Create or select hierarchy node]
50
+ G --> E
51
+ F -- Yes --> H[Cost center created and active]
52
+ H --> I[Available for cost postings, budgets, and allocations]
53
+ ```
54
+
55
+ ```mermaid
56
+ flowchart TD
57
+ A[Update cost center] --> B{Change type?}
58
+ B -- Master data update --> C[Update name, description, category, responsible person]
59
+ C --> D[Audit trail records field changes]
60
+ B -- Hierarchy reassignment --> E[Move cost center to different hierarchy node]
61
+ E --> D
62
+ B -- Retirement --> F[Set valid-to date to end validity]
63
+ F --> G[Cost center excluded from future postings]
64
+ G --> D
65
+ ```
66
+
67
+ ## Scenario Patterns
68
+
69
+ - **Initial Setup for New Company**: A newly onboarded company establishes its cost center hierarchy by creating a root node (e.g., "Company ABC Cost Centers"), adding intermediate grouping nodes for each functional area (Administration, Production, Sales, R&D), and then creating individual cost centers under each group. This hierarchy becomes the prerequisite for all subsequent budgeting and cost allocation activities
70
+ - **Shared Service Center**: An IT department provides services to multiple business units. A single cost center "IT Services" is created under the overhead grouping node, accumulating all IT-related costs. This cost center later serves as the sender in cost allocation cycles that distribute IT costs to receiving cost centers based on headcount or usage metrics
71
+ - **Production Floor Cost Tracking**: A manufacturing company creates cost centers for each production line (Line A, Line B, Line C) under a "Production" grouping node. Each cost center has the category "production" and a designated line supervisor as the responsible person. Overhead costs like machine depreciation and maintenance are accumulated per line for variance analysis against planned production costs
72
+ - **Organizational Restructuring**: Following a merger, the company reorganizes its cost center hierarchy by moving several cost centers from one grouping node to another. Existing cost centers retain their historical cost data, while the hierarchy reflects the new organizational reality. Cost centers belonging to dissolved units have their valid-to dates set to the reorganization date
73
+ - **Seasonal Operations**: A retail company creates a cost center for a seasonal pop-up store with a valid-from date of November 1 and valid-to date of January 31. The cost center accumulates costs only during the holiday season and is excluded from allocations and postings outside its validity window
74
+ - **Cross-Department Responsibility**: A quality assurance function spans both the production and engineering departments. A single cost center "Quality Assurance" is created and assigned to a responsible person from the QA team, independent of department boundaries. This illustrates the separation between cost centers and organizational departments
75
+ - **Multi-Version Hierarchy Planning**: The company maintains two hierarchy versions — "Current" reflecting the active cost center structure, and "Planned Q3" reflecting a proposed reorganization. The planned version allows management to model allocation impacts before committing to the restructuring
76
+
77
+ ## Test Cases
78
+
79
+ - A cost center hierarchy must be created before any cost centers can be created within a company
80
+ - A cost center hierarchy requires a name and version identifier
81
+ - A cost center hierarchy is scoped to a company; hierarchies from different companies are fully isolated
82
+ - A hierarchy root node must be established before child nodes can be added
83
+ - Hierarchy nodes support parent-child relationships with a sort order and level attribute
84
+ - A hierarchy node cannot be its own parent (no self-referencing)
85
+ - A hierarchy node cannot create a circular reference (child cannot be an ancestor of its parent)
86
+ - Deleting a hierarchy node that has child nodes or assigned cost centers is rejected
87
+ - A cost center requires a unique code within the company scope
88
+ - A cost center requires a name and a valid category
89
+ - A cost center must reference a valid hierarchy node within the same company's hierarchy
90
+ - A cost center must reference a valid companyId; the company must be in ACTIVE status
91
+ - A cost center has a valid-from date that must be earlier than or equal to its valid-to date
92
+ - A cost center with no valid-to date is treated as indefinitely active from its valid-from date
93
+ - A cost center optionally references a responsible person (from user-management)
94
+ - A cost center optionally references a department (from the organization module) for informational mapping
95
+ - Creating a cost center emits an audit event recording the acting user, timestamp, and initial field values
96
+ - Updating a cost center (name, description, category, responsible person, department, hierarchy node) emits an audit event recording previous and new field values
97
+ - A cost center code cannot be changed after creation to preserve referential integrity across budgets, allocations, and postings
98
+ - A cost center whose valid-to date has passed cannot receive new cost postings
99
+ - A cost center whose valid-from date is in the future cannot receive cost postings until that date is reached
100
+ - Moving a cost center to a different hierarchy node updates the hierarchy assignment and emits an audit event
101
+ - A cost center can only be assigned to a hierarchy node within the same company's hierarchy
102
+ - Multiple cost centers can be assigned to the same hierarchy node
103
+ - Cost center categories must be from a defined set (e.g., overhead, production, administration, sales, research)
104
+ - Changing a cost center's category is permitted and emits an audit event
105
+ - A cost center cannot be deleted if it has associated cost postings, budget line items, or allocation rules referencing it
106
+ - A cost center with no dependent records can be deleted; deletion emits an audit event
107
+ - Hierarchy roll-up reporting aggregates costs from child nodes up through parent nodes to the root
108
+ - A cost center hierarchy can have multiple versions within the same company
109
+ - Only users with appropriate permissions (from user-management) can create, update, or delete cost centers and hierarchy nodes
110
+ - Unauthorized users receive a permission denied error when attempting cost center operations
111
+
112
+ ## Reference Links
113
+
114
+ - [SAP S/4HANA Cost Center Accounting](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/40ff4b3e8d2c4a2b8b3af8a4aa862a5e/65b18f9c49cc1014e10000000a174cb4.html)
115
+ - [SAP Cost Center Standard Hierarchy](https://help.sap.com/docs/SAP_S4HANA_CLOUD/21c2b8c1e03d4e6eba4d34de9eccf41d/65b18f9c49cc1014e10000000a174cb4.html)
116
+ - [Oracle Fusion Cost Center Segment](https://docs.oracle.com/en/cloud/saas/financials/24d/oafcf/cost-centers.html)
117
+ - [Odoo Analytic Accounting (Cost Center Equivalent)](https://www.odoo.com/documentation/19.0/applications/finance/accounting/reporting/analytic_accounting.html)
118
+ - [SAP CO Cost Center Planning](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/40ff4b3e8d2c4a2b8b3af8a4aa862a5e/65b18f9c49cc1014e10000000a174cb4.html)
@@ -0,0 +1,114 @@
1
+ # Cost Element Management
2
+
3
+ ## Overview
4
+
5
+ Cost Element Management provides the foundational classification layer for management accounting within the accounting module. Cost elements define the types of costs that can be recorded, allocated, and analyzed across cost centers, profit centers, and internal orders. The module distinguishes two fundamental categories: primary cost elements, which are mapped one-to-one to GL accounts from coa-management and represent costs that appear in both financial and management accounting (e.g., material costs, labor costs, depreciation), and secondary cost elements, which exist exclusively within the controlling domain and are used solely for internal cost allocation activities such as assessment, distribution, and settlement.
6
+
7
+ Every cost posting or allocation in the accounting module requires a valid cost element, making this feature a prerequisite for all downstream management accounting processes. Primary cost elements bridge financial accounting and controlling by linking each cost type to its corresponding GL account, ensuring consistency between the general ledger and cost reports. Secondary cost elements enable internal cost flows that have no counterpart in financial reporting, allowing organizations to model overhead distribution, activity-based costing, and inter-departmental service charges. Cost elements are scoped to a Company and carry validity periods to support time-dependent cost classifications.
8
+
9
+ ## Business Purpose
10
+
11
+ Organizations need a structured cost element catalog to classify and control cost flows in management accounting:
12
+
13
+ - **Cost type classification**: Cost elements categorize expenditures into meaningful types (overhead, material, labor, depreciation for primary; assessment, distribution, internal activity allocation, settlement for secondary), enabling consistent cost reporting and analysis across the organization
14
+ - **Bridge between financial and management accounting**: Primary cost elements maintain a mandatory one-to-one mapping to GL accounts from coa-management, ensuring that every cost recorded in the general ledger can be consumed by controlling processes without discrepancy
15
+ - **Internal allocation enablement**: Secondary cost elements provide cost types that exist only within controlling, allowing organizations to model internal cost flows (e.g., IT department charging other departments for services) without polluting financial statements
16
+ - **Prerequisite for cost postings**: No cost can be posted to a cost center, profit center, or internal order without a valid cost element. This gating mechanism enforces a complete and auditable cost classification before any transaction occurs
17
+ - **Time-dependent validity**: Valid-from and valid-to dates on cost elements allow organizations to phase in new cost types or retire obsolete ones without deleting historical data, supporting period-accurate cost reporting
18
+ - **Company-scoped isolation**: Cost elements are defined per company, ensuring that each legal entity maintains its own cost classification structure aligned with its chart of accounts and management reporting requirements
19
+ - **Regulatory and ERP alignment**: The primary/secondary distinction mirrors the cost element model used by SAP, Oracle, and other major ERP systems, facilitating migration, integration, and compliance with established management accounting practices
20
+
21
+ ## Process Flow
22
+
23
+ ```mermaid
24
+ stateDiagram-v2
25
+ [*] --> Draft: createCostElement
26
+ Draft --> Draft: updateCostElement
27
+ Draft --> Active: activateCostElement
28
+ Active --> Inactive: deactivateCostElement
29
+ Inactive --> Active: reactivateCostElement
30
+ Draft --> [*]: deleteCostElement
31
+ ```
32
+
33
+ ```mermaid
34
+ flowchart TD
35
+ A[Identify cost type to classify] --> B{Primary or Secondary?}
36
+ B -- Primary --> C[Select GL account from coa-management]
37
+ C --> D[Create primary cost element with GL account reference]
38
+ B -- Secondary --> E[Create secondary cost element without GL account]
39
+ D --> F[Set category, validity period, and description]
40
+ E --> F
41
+ F --> G[Activate cost element]
42
+ G --> H[Cost element available for cost postings and allocations]
43
+ ```
44
+
45
+ ```mermaid
46
+ flowchart TD
47
+ A[Cost posting or allocation initiated] --> B{Cost element specified?}
48
+ B -- No --> C[Reject: cost element required]
49
+ B -- Yes --> D{Cost element active and within validity period?}
50
+ D -- No --> E[Reject: invalid or expired cost element]
51
+ D -- Yes --> F{Primary cost element?}
52
+ F -- Yes --> G{Referenced GL account active in active CoA?}
53
+ G -- No --> H[Reject: GL account invalid]
54
+ G -- Yes --> I[Accept cost posting]
55
+ F -- No --> J{Used in allocation context only?}
56
+ J -- No --> K[Reject: secondary elements for internal allocation only]
57
+ J -- Yes --> I
58
+ ```
59
+
60
+ ## Scenario Patterns
61
+
62
+ - **Overhead Cost Element Setup**: A controller creates a primary cost element for "Office Rent" mapped to the corresponding rent expense GL account. The element is categorized as an overhead cost, given a validity period spanning the fiscal year, and activated. All rent postings to cost centers now reference this cost element for consistent overhead reporting
63
+ - **Material Cost Classification**: During initial system setup, the accounting team creates primary cost elements for each material cost category (raw materials, packaging, consumables), each mapped to its respective GL account from the chart of accounts. These elements enable material cost tracking across cost centers and internal orders
64
+ - **Labor Cost Tracking**: Primary cost elements are created for different labor cost types (salaries, wages, overtime, benefits), each referencing the appropriate payroll expense GL account. Cost center managers can then analyze labor costs by type within their responsibility areas
65
+ - **Depreciation Cost Element**: A primary cost element for asset depreciation is created and mapped to the depreciation expense GL account. This enables depreciation charges calculated by the asset module to flow into cost center reports as a distinct cost type
66
+ - **Assessment Cycle Preparation**: A controller creates a secondary cost element of category "assessment" to be used in the monthly overhead assessment cycle. This element does not reference any GL account and will only appear in cost center reports when the assessment allocation distributes shared service costs
67
+ - **Internal Activity Allocation**: A secondary cost element of category "internal activity allocation" is created for IT services. When the IT cost center allocates its costs to receiving cost centers based on service hours, this secondary element classifies the allocated amounts, keeping them separate from primary cost postings
68
+ - **Settlement to Profitability**: A secondary cost element of category "settlement" is created to settle accumulated costs from an internal order to a profit center. The settlement posting uses this element to classify the cost transfer, which remains invisible in financial accounting
69
+ - **Cost Element Retirement**: At the end of a fiscal year, a controller deactivates a cost element that is no longer relevant due to organizational restructuring. Existing historical postings referencing this element remain intact, but no new postings can use it
70
+ - **Cross-Company Cost Element Alignment**: Two subsidiaries each maintain their own cost element catalogs. Although the element codes and categories may align for consolidated reporting, each company's primary cost elements reference GL accounts from their respective charts of accounts
71
+
72
+ ## Test Cases
73
+
74
+ - Cost element can be created in DRAFT status with a unique code within the company scope
75
+ - Cost element requires a valid companyId; the company must be in ACTIVE status
76
+ - Cost element code must be unique within the same company
77
+ - Cost element requires a name and a type (PRIMARY or SECONDARY)
78
+ - Cost element requires a category appropriate to its type (overhead, material, labor, depreciation for PRIMARY; assessment, distribution, internal_activity_allocation, settlement for SECONDARY)
79
+ - Primary cost element must reference a valid GL account from an ACTIVE Chart of Accounts
80
+ - Primary cost element GL account reference must point to an active GL account
81
+ - Primary cost element creation fails if the GL account reference is missing
82
+ - Primary cost element creation fails if the referenced GL account does not exist or is inactive
83
+ - Secondary cost element must not reference a GL account; providing a GL account reference for a secondary element is rejected
84
+ - Cost element valid-from date must be before or equal to valid-to date
85
+ - Cost element valid-from and valid-to dates are optional; omitting them means the element is valid indefinitely
86
+ - Cost element description is optional and can be updated while in DRAFT or ACTIVE status
87
+ - Activating a DRAFT cost element transitions its status to ACTIVE
88
+ - Activating an already ACTIVE cost element fails with an invalid status transition error
89
+ - Deactivating an ACTIVE cost element transitions its status to INACTIVE
90
+ - Reactivating an INACTIVE cost element transitions its status back to ACTIVE
91
+ - Only DRAFT cost elements can be deleted; ACTIVE and INACTIVE elements cannot be deleted
92
+ - Deleting a DRAFT cost element removes it and emits an audit event
93
+ - Cost postings referencing a cost element that is INACTIVE or outside its validity period are rejected
94
+ - Cost postings referencing a cost element that is ACTIVE and within its validity period are accepted
95
+ - A primary cost element cannot be assigned a secondary category (assessment, distribution, internal_activity_allocation, settlement)
96
+ - A secondary cost element cannot be assigned a primary category (overhead, material, labor, depreciation)
97
+ - Changing the type of a cost element (PRIMARY to SECONDARY or vice versa) after activation is not permitted
98
+ - Changing the GL account reference of a primary cost element after activation is not permitted
99
+ - Secondary cost elements can only be used in internal allocation contexts (assessment, distribution, activity allocation, settlement)
100
+ - Attempting to use a secondary cost element for a direct cost posting (non-allocation) is rejected
101
+ - Cost elements are scoped to a company; elements from different companies are fully isolated
102
+ - A primary cost element's GL account must belong to the same company's chart of accounts
103
+ - Two primary cost elements within the same company cannot reference the same GL account
104
+ - Updating the category of an ACTIVE cost element is not permitted
105
+ - Cost element creation emits an audit event recording the acting user, timestamp, and initial field values
106
+ - Cost element activation emits an audit event recording the status transition and acting user
107
+ - Cost element deactivation emits an audit event recording the status transition and acting user
108
+
109
+ ## Reference Links
110
+
111
+ - [SAP Cost Element Accounting](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee3509643e954b3da2e0ebfa846c02e1/4cae4c5eecaa7286e10000000a42189b.html)
112
+ - [SAP Primary and Secondary Cost Elements](https://help.sap.com/docs/SAP_ERP/ba879a6e2ea04d9bb94c7ccd7cdac446/89d8463bf4f84033e10000000a174cb4.html)
113
+ - [Oracle Cost Management Overview](https://docs.oracle.com/en/cloud/saas/financials/24d/oafcf/cost-management.html)
114
+ - [Controlling with Cost Elements in SAP S/4HANA](https://community.sap.com/topics/s4hana/cost-elements)
@@ -0,0 +1,111 @@
1
+ # Internal Order Management
2
+
3
+ ## Overview
4
+
5
+ Internal Order Management provides the ability to create and manage internal orders that serve as temporary cost collectors for tracking expenses associated with specific short-to-medium-term activities such as projects, marketing campaigns, R&D initiatives, and corporate events. Unlike cost centers, which are permanent organizational units for ongoing cost accumulation, internal orders are purpose-bound objects with a defined lifecycle that begins at creation and ends at closure once costs have been fully reviewed.
6
+
7
+ Each internal order carries a unique order number, an order type (OVERHEAD, INVESTMENT, or ACCRUAL), a description, responsible person, validity dates, and a reference to the responsible cost center within the company. Internal orders follow a four-stage lifecycle: CREATED, RELEASED, TECHNICALLY_COMPLETED, and CLOSED. Cost postings are only permitted while the order is in RELEASED status. Orders may optionally have a budget assigned to control spending limits. Settlement of internal order costs to receivers (such as cost centers, fixed assets, or other orders) is out of scope for this feature and will be addressed in a dedicated settlement feature.
8
+
9
+ ## Business Purpose
10
+
11
+ Organizations need internal orders to isolate and monitor costs for discrete activities that cut across the permanent cost center structure:
12
+
13
+ - **Activity-based cost tracking**: Internal orders allow organizations to accumulate costs for specific initiatives (e.g., a trade show, an IT migration project, or a product launch campaign) independently of the department-level cost center hierarchy, providing precise visibility into activity-level spending
14
+ - **Order type classification**: Categorizing orders as OVERHEAD, INVESTMENT, or ACCRUAL mirrors SAP's internal order type model and enables differentiated handling — overhead orders track general expenses, investment orders capitalize costs into fixed assets, and accrual orders manage periodic cost deferrals
15
+ - **Lifecycle gating**: The four-stage lifecycle (CREATED -> RELEASED -> TECHNICALLY_COMPLETED -> CLOSED) ensures that cost postings are only accepted during the appropriate window, preventing premature charges to orders still in setup and accidental postings to orders under final review or already archived
16
+ - **Budget control**: Optional budget assignment to internal orders enables organizations to set spending limits for activities and monitor actual costs against planned budgets, supporting proactive cost governance
17
+ - **Responsible cost center linkage**: Each internal order references a responsible cost center, establishing organizational accountability and ensuring that activity costs can be traced back to the department or unit that owns the initiative
18
+ - **Temporal scoping**: Validity dates (valid-from and valid-to) define the time window during which the order is relevant, supporting planning and ensuring that postings outside the validity period are flagged or rejected
19
+ - **Company-scoped isolation**: Internal orders are scoped to a company, ensuring that cost data for different legal entities remains fully separated
20
+
21
+ ## Process Flow
22
+
23
+ ```mermaid
24
+ stateDiagram-v2
25
+ [*] --> Created: createInternalOrder
26
+ Created --> Released: releaseInternalOrder
27
+ Released --> TechnicallyCompleted: technicallyCompleteInternalOrder
28
+ TechnicallyCompleted --> Closed: closeInternalOrder
29
+ Created --> [*]: deleteInternalOrder
30
+ ```
31
+
32
+ ```mermaid
33
+ flowchart TD
34
+ A[Identify activity requiring cost tracking] --> B[Create internal order with type, description, responsible person, and cost center]
35
+ B --> C{Assign budget?}
36
+ C -- Yes --> D[Link budget to internal order]
37
+ C -- No --> E[Internal order in CREATED status]
38
+ D --> E
39
+ E --> F[Release internal order]
40
+ F --> G[Costs posted against the order during activity execution]
41
+ G --> H{Activity complete?}
42
+ H -- No --> G
43
+ H -- Yes --> I[Technically complete the order]
44
+ I --> J[Final review of accumulated costs]
45
+ J --> K[Close the order]
46
+ K --> L[Order archived — no further changes]
47
+ ```
48
+
49
+ ```mermaid
50
+ flowchart TD
51
+ A[Cost posting request targets internal order] --> B{Order status is RELEASED?}
52
+ B -- No --> C[Reject posting — order not in RELEASED status]
53
+ B -- Yes --> D{Posting date within validity period?}
54
+ D -- No --> E[Reject posting — outside validity window]
55
+ D -- Yes --> F{Budget assigned?}
56
+ F -- Yes --> G{Posting within budget limit?}
57
+ G -- No --> H[Reject or warn — budget exceeded]
58
+ G -- Yes --> I[Accept cost posting]
59
+ F -- No --> I
60
+ ```
61
+
62
+ ## Scenario Patterns
63
+
64
+ - **Marketing Campaign Tracking**: The marketing department creates an OVERHEAD internal order to track all costs for a product launch campaign — agency fees, print materials, event venue, and travel. The order is released when planning is finalized, costs are posted throughout the campaign period, and the order is technically completed and closed once all invoices are settled and reviewed
65
+ - **Capital Investment Project**: An INVESTMENT internal order is created for a facility renovation project. Costs for construction, equipment, and consulting are accumulated on the order. Upon project completion, the order is technically completed and the accumulated costs are reviewed before closure (settlement to a fixed asset would occur in a future settlement feature)
66
+ - **R&D Initiative**: An R&D team creates an OVERHEAD internal order with a budget to track development costs for a prototype. The budget cap ensures the team stays within the approved spending limit. When the prototype phase ends, the order is technically completed and costs are reviewed against the budget before closure
67
+ - **Corporate Event**: An internal order is created for an annual company conference. Costs for venue rental, catering, speakers, and logistics are posted during the event planning and execution phases. After the event, the order is technically completed, final costs are reconciled, and the order is closed
68
+ - **Accrual Order for Periodic Costs**: An ACCRUAL internal order is created to manage deferred cost recognition for an annual software license paid upfront. The order tracks the periodic accrual postings over the license term
69
+ - **Order Deletion Before Release**: A planned initiative is cancelled before any costs are incurred. The internal order, still in CREATED status, is deleted rather than progressed through the full lifecycle
70
+ - **Budget Overrun Prevention**: A project manager attempts to post costs to an internal order that would exceed the assigned budget. The system rejects the posting, prompting the manager to request a budget increase or reallocate costs to a different order
71
+
72
+ ## Test Cases
73
+
74
+ - Internal order lifecycle follows CREATED -> RELEASED -> TECHNICALLY_COMPLETED -> CLOSED state machine
75
+ - Internal order can only be created in CREATED status
76
+ - Internal order requires a valid order type (OVERHEAD, INVESTMENT, ACCRUAL)
77
+ - Internal order requires a unique order number within the company scope
78
+ - Internal order requires a description
79
+ - Internal order requires a responsible person
80
+ - Internal order must reference a valid companyId; the company must be in ACTIVE status
81
+ - Internal order must reference a valid responsible cost center within the same company
82
+ - Internal order validity dates (valid-from, valid-to) are optional; when both are provided, valid-from must precede valid-to
83
+ - Budget assignment to an internal order is optional
84
+ - When a budget is assigned, the budget entity must exist and belong to the same company
85
+ - Releasing an internal order transitions its status from CREATED to RELEASED
86
+ - Only CREATED orders can be released; releasing a RELEASED, TECHNICALLY_COMPLETED, or CLOSED order fails with an invalid status transition error
87
+ - Cost postings are only accepted when the internal order is in RELEASED status
88
+ - Cost postings to an order in CREATED, TECHNICALLY_COMPLETED, or CLOSED status are rejected
89
+ - Technically completing an internal order transitions its status from RELEASED to TECHNICALLY_COMPLETED
90
+ - Only RELEASED orders can be technically completed; technically completing a CREATED or CLOSED order fails with an invalid status transition error
91
+ - Closing an internal order transitions its status from TECHNICALLY_COMPLETED to CLOSED
92
+ - Only TECHNICALLY_COMPLETED orders can be closed; closing a CREATED or RELEASED order fails with an invalid status transition error
93
+ - CLOSED orders cannot transition to any other status
94
+ - Internal orders in CREATED status can be deleted
95
+ - Internal orders in RELEASED, TECHNICALLY_COMPLETED, or CLOSED status cannot be deleted
96
+ - Internal order fields (description, responsible person, cost center, validity dates) can be updated while the order is in CREATED or RELEASED status
97
+ - Internal order fields cannot be updated when the order is in TECHNICALLY_COMPLETED or CLOSED status
98
+ - Order type cannot be changed after the order is released
99
+ - Cost postings to an internal order with a budget must not exceed the assigned budget amount
100
+ - Cost postings that would exceed the budget are rejected with a budget exceeded error
101
+ - Internal orders are scoped to a company; orders from different companies are fully isolated
102
+ - Cost postings with a date outside the order's validity period (before valid-from or after valid-to) are rejected when validity dates are set
103
+ - Deleting an internal order in CREATED status removes the order and any associated budget assignment
104
+ - Creating an internal order without a responsible cost center reference fails validation
105
+
106
+ ## Reference Links
107
+
108
+ - [SAP S/4HANA Internal Orders](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee3509643e954b3da2e0ebfa846c02e1/7ce4944ab36c11d3b44c006094b9ea64.html)
109
+ - [SAP Internal Order Types and Usage](https://help.sap.com/docs/SAP_ERP/3bbd1036dae74238a8e3aab669e0ea3f/2ad1e0af437411d189740000e8323492.html)
110
+ - [Oracle Fusion Project Costing — Cost Collection](https://docs.oracle.com/en/cloud/saas/project-management/24d/oapjm/cost-collection.html)
111
+ - [Odoo Analytic Accounts for Cost Tracking](https://www.odoo.com/documentation/19.0/applications/finance/accounting/reporting/analytic_accounting.html)
@@ -0,0 +1,120 @@
1
+ # Profit Center Management
2
+
3
+ ## Overview
4
+
5
+ Profit Center Management provides the ability to create, maintain, and organize profit centers for internal profit and loss reporting within the accounting module. A profit center represents a discrete business segment — such as a product line, regional division, or service line — for which management can independently evaluate profitability. Each profit center carries a code, name, description, responsible person, validity period (valid-from/to), and an assignment to a profit center hierarchy node. Profit centers are scoped to a Company and follow a lifecycle from DRAFT through ACTIVE to INACTIVE.
6
+
7
+ Revenue and cost transactions posted in the finance-ledger are tagged with profit center assignments, enabling aggregation of income and expenses at the profit center level. Profit centers are organized into hierarchical groupings (ProfitCenterHierarchy) that form a tree structure, allowing roll-up reporting by business dimension such as region, product line, or service line. This hierarchical structure supports management analyses including return on investment (ROI), economic value added (EVA), and operating profit per segment. Profit centers are distinct from organizational units (sites, departments) managed by the organization module, but may optionally reference them for cross-dimensional reporting.
8
+
9
+ ## Business Purpose
10
+
11
+ Organizations need profit centers to measure and manage the profitability of individual business segments independently:
12
+
13
+ - **Segment profitability analysis**: Profit centers enable management to evaluate revenue, costs, and profit/loss for each business segment, supporting informed strategic decisions about resource allocation and investment priorities
14
+ - **Hierarchical roll-up reporting**: The tree-structured profit center hierarchy allows aggregation of results from leaf-level profit centers up through intermediate grouping nodes to the enterprise level, supporting multi-dimensional analysis by region, product line, or service line
15
+ - **Internal P&L and balance sheet**: Profit centers serve as the primary dimension for generating internal profit and loss statements and, where applicable, segment balance sheets — going beyond cost center reporting which tracks only the expense side
16
+ - **ROI and EVA analysis**: By capturing both revenue and cost flows, profit centers provide the data foundation for return on investment, economic value added, and operating margin calculations at the segment level
17
+ - **Responsibility accounting**: Each profit center is assigned a responsible person, establishing clear accountability for the financial performance of that business segment
18
+ - **Validity period control**: Valid-from and valid-to dates ensure that profit centers are only available for transaction assignment during their intended operational period, preventing postings to retired or not-yet-active segments
19
+ - **Separation from organizational structure**: Profit centers are deliberately decoupled from the organizational hierarchy (sites, departments) to allow flexible, cross-cutting profitability views that do not depend on the legal or administrative structure
20
+ - **Transaction tagging for aggregation**: Revenue and cost transactions are tagged with profit center assignments at posting time, enabling automated aggregation without requiring separate ledger entries per segment
21
+ - **Cross-module ownership**: The organization and coa-management modules explicitly defer profit center ownership to the accounting module, establishing a single authoritative source for profit center master data
22
+
23
+ ## Process Flow
24
+
25
+ ```mermaid
26
+ stateDiagram-v2
27
+ [*] --> Draft: createProfitCenter
28
+ Draft --> Draft: updateProfitCenter
29
+ Draft --> Active: activateProfitCenter
30
+ Active --> Active: updateProfitCenter (limited fields)
31
+ Active --> Inactive: deactivateProfitCenter
32
+ Inactive --> Active: reactivateProfitCenter
33
+ Draft --> [*]: deleteProfitCenter
34
+ ```
35
+
36
+ ```mermaid
37
+ flowchart TD
38
+ A[Identify business segment requiring profitability tracking] --> B[Create ProfitCenter in DRAFT status]
39
+ B --> C[Set code, name, description, responsible person, validity period]
40
+ C --> D{Profit center hierarchy exists?}
41
+ D -- No --> E[Create ProfitCenterHierarchy with root node]
42
+ E --> F[Add grouping nodes for business dimensions]
43
+ D -- Yes --> F
44
+ F --> G[Assign profit center to hierarchy node]
45
+ G --> H[Activate profit center]
46
+ H --> I[Profit center available for transaction tagging]
47
+ I --> J[Revenue and cost postings tagged with profit center]
48
+ J --> K[Aggregate P&L by profit center and hierarchy roll-up]
49
+ ```
50
+
51
+ ```mermaid
52
+ flowchart TD
53
+ A[Define profit center hierarchy structure] --> B[Create hierarchy with root node]
54
+ B --> C[Add intermediate grouping nodes by dimension]
55
+ C --> D[Assign profit centers as leaf nodes]
56
+ D --> E{All segments covered?}
57
+ E -- No --> C
58
+ E -- Yes --> F[Hierarchy ready for roll-up reporting]
59
+ F --> G[Generate segment P&L at any hierarchy level]
60
+ G --> H[Drill down from group totals to individual profit centers]
61
+ ```
62
+
63
+ ## Scenario Patterns
64
+
65
+ - **Regional Profit Center Setup**: A multinational company creates profit centers for each geographic region (North America, EMEA, APAC) and organizes them under a region-based hierarchy. Revenue and cost transactions are tagged with the appropriate regional profit center, enabling management to compare profitability across regions and identify underperforming markets
66
+ - **Product Line Profitability**: A manufacturing company creates profit centers for each product line (Consumer Electronics, Industrial Equipment, Spare Parts) under a product-based hierarchy. Sales revenue and production costs are assigned to the corresponding profit center, allowing product managers to track gross margins and operating profit per product line
67
+ - **Service Line Segmentation**: A professional services firm creates profit centers for each service offering (Consulting, Implementation, Managed Services) to separately measure revenue realization, utilization rates, and profitability. The hierarchy groups these under a single services division for consolidated reporting
68
+ - **Dual-Hierarchy Analysis**: A company maintains two profit center hierarchies — one by region and one by product line — to enable matrix reporting. The same set of profit centers can be analyzed along either dimension, supporting both geographic and product-oriented management views
69
+ - **Profit Center Retirement**: A business segment is discontinued. The responsible controller deactivates the profit center after the final posting period, ensuring no new transactions can be assigned to it while historical data remains available for comparative reporting
70
+ - **Cross-Departmental Profit Center**: A profit center spans multiple organizational departments (e.g., a product line served by both engineering and sales teams). Because profit centers are independent of the organizational hierarchy, revenue from sales and costs from engineering are both captured under the same profit center for unified profitability measurement
71
+ - **New Venture Tracking**: A company launches a new business initiative and creates a profit center in DRAFT status with a future valid-from date. Once the launch date arrives, the profit center is activated and begins receiving transaction assignments, allowing management to track the venture's financial performance from day one
72
+ - **Responsible Person Change**: The manager responsible for a profit center changes due to organizational restructuring. The responsible person field is updated on the active profit center, and the change is recorded in the audit trail for accountability tracking
73
+
74
+ ## Test Cases
75
+
76
+ - Profit center lifecycle follows DRAFT -> ACTIVE -> INACTIVE state machine; inactive profit centers can be reactivated to ACTIVE
77
+ - Profit center can only be created in DRAFT status
78
+ - Profit center requires a unique code within the company scope
79
+ - Profit center requires a name
80
+ - Profit center must reference a valid companyId; the company must be in ACTIVE status
81
+ - Profit center description is optional and can be updated in DRAFT or ACTIVE status
82
+ - Profit center responsible person is optional and can be updated in DRAFT or ACTIVE status
83
+ - Valid-from date is required; valid-to date is optional
84
+ - Valid-to date, when specified, must be on or after the valid-from date
85
+ - Activating a DRAFT profit center transitions its status to ACTIVE
86
+ - Activating an already ACTIVE profit center fails with an invalid status transition error
87
+ - Deactivating an ACTIVE profit center transitions its status to INACTIVE
88
+ - Deactivating a DRAFT profit center fails with an invalid status transition error
89
+ - Reactivating an INACTIVE profit center transitions its status to ACTIVE
90
+ - DRAFT profit centers can be deleted; deletion removes the profit center and its hierarchy assignment
91
+ - ACTIVE profit centers cannot be deleted; they must be deactivated first
92
+ - INACTIVE profit centers cannot be deleted
93
+ - Profit center code cannot be changed after activation
94
+ - Only ACTIVE profit centers within their validity period can receive transaction assignments
95
+ - Transactions cannot be assigned to a DRAFT profit center
96
+ - Transactions cannot be assigned to an INACTIVE profit center
97
+ - Transactions cannot be assigned to a profit center outside its validity period (before valid-from or after valid-to)
98
+ - A profit center hierarchy can be created with a root node and a descriptive name
99
+ - Hierarchy nodes can be added as children of existing nodes, forming a tree structure
100
+ - A profit center can be assigned to exactly one node within a given hierarchy
101
+ - A profit center can be assigned to nodes in multiple hierarchies simultaneously
102
+ - Removing a hierarchy node that has child nodes is rejected; children must be reassigned or removed first
103
+ - Removing a hierarchy node that has profit centers assigned is rejected; profit centers must be reassigned first
104
+ - Hierarchy roll-up aggregates financial results from child nodes up to parent nodes
105
+ - Profit centers are scoped to a company; profit centers from different companies are fully isolated
106
+ - Profit center hierarchies are scoped to a company
107
+ - Creating a profit center emits an audit event recording the acting user, timestamp, and initial field values
108
+ - Updating a profit center emits an audit event recording previous and new field values
109
+ - Activating or deactivating a profit center emits an audit event recording the status transition and acting user
110
+ - Assigning or reassigning a profit center to a hierarchy node emits an audit event
111
+ - Profit centers are independent of organizational units (sites, departments) but may optionally reference an organizational unit
112
+ - Only users with appropriate permissions can create, activate, deactivate, or update profit centers
113
+
114
+ ## Reference Links
115
+
116
+ - [SAP Profit Center Accounting](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee3509643e954b3da2e0ebfa846c02e1/4cae5a88ecaa7286e10000000a42189b.html)
117
+ - [SAP Profit Center Master Data](https://help.sap.com/docs/SAP_S4HANA_CLOUD/59463d9fe28a4e5f8b38557e1e2bafbb/577ab0e06d6d1014b3fc9283b0e91070.html)
118
+ - [Oracle Fusion Profit Center Reporting](https://docs.oracle.com/en/cloud/saas/financials/24d/oafcf/segment-reporting.html)
119
+ - [Odoo Analytic Accounting for Profit Centers](https://www.odoo.com/documentation/19.0/applications/finance/accounting/reporting/analytic_accounting.html)
120
+ - [NetSuite Department and Class Segmentation](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_N3444641.html)