@tailor-platform/erp-kit 0.3.0 → 0.4.1

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 (817) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +35 -7
  3. package/dist/cli.mjs +783 -272
  4. package/package.json +5 -4
  5. package/skills/erp-kit-app-1-requirements/SKILL.md +39 -12
  6. package/skills/{erp-kit-app-3-plan → erp-kit-app-1-requirements}/references/story-extraction.md +1 -1
  7. package/skills/erp-kit-app-2-requirements-review/SKILL.md +29 -5
  8. package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +4 -0
  9. package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +4 -0
  10. package/skills/erp-kit-app-2-requirements-review/references/story-quality-check.md +67 -0
  11. package/skills/erp-kit-app-3-plan/SKILL.md +51 -50
  12. package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +24 -18
  13. package/skills/erp-kit-app-3-plan/references/screen-extraction.md +18 -2
  14. package/skills/erp-kit-app-4-plan-review/SKILL.md +16 -13
  15. package/skills/erp-kit-app-5-impl-backend/SKILL.md +19 -11
  16. package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -22
  17. package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +0 -1
  18. package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +13 -4
  19. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +16 -0
  20. package/skills/erp-kit-app-6-impl-frontend/references/pages.md +16 -46
  21. package/skills/erp-kit-app-7-impl-review/SKILL.md +29 -23
  22. package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +16 -17
  23. package/skills/erp-kit-module-1-requirements/SKILL.md +6 -12
  24. package/skills/erp-kit-module-2-requirements-review/SKILL.md +29 -5
  25. package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +19 -0
  26. package/skills/erp-kit-module-3-plan/SKILL.md +2 -4
  27. package/skills/erp-kit-module-4-plan-review/SKILL.md +30 -7
  28. package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +15 -0
  29. package/skills/erp-kit-module-6-impl-review/SKILL.md +21 -7
  30. package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +15 -0
  31. package/skills/erp-kit-module-shared/SKILL.md +4 -0
  32. package/skills/erp-kit-module-shared/references/commands.md +1 -1
  33. package/skills/erp-kit-module-shared/references/queries.md +5 -6
  34. package/src/commands/app/index.ts +28 -17
  35. package/src/commands/check.test.ts +1 -1
  36. package/src/commands/check.ts +2 -35
  37. package/src/commands/doc/index.ts +83 -0
  38. package/src/commands/doc/module.test.ts +119 -0
  39. package/src/commands/doc/module.ts +114 -0
  40. package/src/commands/doc/modules.test.ts +103 -0
  41. package/src/commands/doc/modules.ts +98 -0
  42. package/src/commands/doc/search.test.ts +94 -0
  43. package/src/commands/doc/search.ts +111 -0
  44. package/src/commands/generate-doc.ts +17 -10
  45. package/src/commands/index.ts +20 -8
  46. package/src/commands/lib/command-result.ts +30 -0
  47. package/src/commands/lib/discovery.test.ts +74 -0
  48. package/src/commands/lib/discovery.ts +106 -0
  49. package/src/commands/lib/paths.ts +22 -0
  50. package/src/commands/lib/sync-check-source.test.ts +197 -0
  51. package/src/commands/lib/sync-check-source.ts +100 -0
  52. package/src/commands/lib/sync-check-tests.test.ts +178 -0
  53. package/src/commands/lib/sync-check-tests.ts +69 -0
  54. package/src/commands/mock/index.ts +11 -6
  55. package/src/commands/module/generate.ts +13 -8
  56. package/src/commands/module/index.ts +17 -21
  57. package/src/commands/parse-doc-test-cases.ts +13 -2
  58. package/src/commands/sync-check.test.ts +6 -364
  59. package/src/commands/sync-check.ts +7 -251
  60. package/src/generator/generate-app-code.test.ts +121 -0
  61. package/src/generator/generate-app-code.ts +51 -0
  62. package/src/generator/generate-code-boilerplate.test.ts +1 -2
  63. package/src/generator/generate-code.test.ts +43 -12
  64. package/src/generator/generate-code.ts +12 -226
  65. package/src/generator/generate-errors.ts +34 -0
  66. package/src/generator/generate-permissions.ts +12 -0
  67. package/src/generator/generate-shells.ts +28 -0
  68. package/src/generator/generate-stubs.ts +31 -0
  69. package/src/generator/parse-resolver-doc.test.ts +89 -0
  70. package/src/generator/parse-resolver-doc.ts +125 -0
  71. package/src/generator/scaffold.ts +57 -0
  72. package/src/generator/stub-templates.test.ts +55 -0
  73. package/src/generator/stub-templates.ts +145 -0
  74. package/src/module.ts +3 -0
  75. package/src/modules/audit/README.md +46 -0
  76. package/src/modules/audit/command/activateAuditPolicy.generated.ts +6 -0
  77. package/src/modules/audit/command/activateAuditPolicy.test.ts +186 -0
  78. package/src/modules/audit/command/activateAuditPolicy.ts +97 -0
  79. package/src/modules/audit/command/createAuditPolicy.generated.ts +6 -0
  80. package/src/modules/audit/command/createAuditPolicy.test.ts +395 -0
  81. package/src/modules/audit/command/createAuditPolicy.ts +131 -0
  82. package/src/modules/audit/command/deactivateAuditPolicy.generated.ts +6 -0
  83. package/src/modules/audit/command/deactivateAuditPolicy.test.ts +138 -0
  84. package/src/modules/audit/command/deactivateAuditPolicy.ts +58 -0
  85. package/src/modules/audit/command/deleteAuditPolicy.generated.ts +6 -0
  86. package/src/modules/audit/command/deleteAuditPolicy.test.ts +121 -0
  87. package/src/modules/audit/command/deleteAuditPolicy.ts +52 -0
  88. package/src/modules/audit/command/logAuditEvent.generated.ts +6 -0
  89. package/src/modules/audit/command/logAuditEvent.test.ts +991 -0
  90. package/src/modules/audit/command/logAuditEvent.ts +357 -0
  91. package/src/modules/audit/command/reactivateAuditPolicy.generated.ts +6 -0
  92. package/src/modules/audit/command/reactivateAuditPolicy.test.ts +143 -0
  93. package/src/modules/audit/command/reactivateAuditPolicy.ts +79 -0
  94. package/src/modules/audit/command/registerAuditableEntity.generated.ts +6 -0
  95. package/src/modules/audit/command/registerAuditableEntity.test.ts +268 -0
  96. package/src/modules/audit/command/registerAuditableEntity.ts +94 -0
  97. package/src/modules/audit/command/replaceAuditPolicy.generated.ts +6 -0
  98. package/src/modules/audit/command/replaceAuditPolicy.test.ts +242 -0
  99. package/src/modules/audit/command/replaceAuditPolicy.ts +91 -0
  100. package/src/modules/audit/command/updateAuditPolicy.generated.ts +6 -0
  101. package/src/modules/audit/command/updateAuditPolicy.test.ts +284 -0
  102. package/src/modules/audit/command/updateAuditPolicy.ts +151 -0
  103. package/src/modules/audit/db/auditEntry.ts +47 -0
  104. package/src/modules/audit/db/auditPolicy.ts +33 -0
  105. package/src/modules/audit/db/auditableEntity.ts +22 -0
  106. package/src/modules/audit/db/changeDetail.ts +28 -0
  107. package/src/modules/audit/db/policyFieldRule.ts +23 -0
  108. package/src/modules/audit/docs/commands/ActivateAuditPolicy.md +69 -0
  109. package/src/modules/audit/docs/commands/CreateAuditPolicy.md +79 -0
  110. package/src/modules/audit/docs/commands/DeactivateAuditPolicy.md +55 -0
  111. package/src/modules/audit/docs/commands/DeleteAuditPolicy.md +55 -0
  112. package/src/modules/audit/docs/commands/LogAuditEvent.md +137 -0
  113. package/src/modules/audit/docs/commands/ReactivateAuditPolicy.md +58 -0
  114. package/src/modules/audit/docs/commands/RegisterAuditableEntity.md +62 -0
  115. package/src/modules/audit/docs/commands/ReplaceAuditPolicy.md +72 -0
  116. package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +77 -0
  117. package/src/modules/audit/docs/features/audit-event-logging.md +126 -0
  118. package/src/modules/audit/docs/features/audit-policy-configuration.md +135 -0
  119. package/src/modules/audit/docs/features/field-level-change-tracking.md +95 -0
  120. package/src/modules/audit/docs/models/AuditEntry.md +55 -0
  121. package/src/modules/audit/docs/models/AuditPolicy.md +79 -0
  122. package/src/modules/audit/docs/models/AuditableEntity.md +38 -0
  123. package/src/modules/audit/docs/models/ChangeDetail.md +55 -0
  124. package/src/modules/audit/docs/models/PolicyFieldRule.md +45 -0
  125. package/src/modules/audit/docs/queries/GetAuditEntry.md +49 -0
  126. package/src/modules/audit/docs/queries/GetAuditPolicy.md +54 -0
  127. package/src/modules/audit/docs/queries/GetAuditSummary.md +84 -0
  128. package/src/modules/audit/docs/queries/GetChangeDetails.md +56 -0
  129. package/src/modules/audit/docs/queries/ListAuditPolicies.md +58 -0
  130. package/src/modules/audit/docs/queries/SearchAuditEntries.md +91 -0
  131. package/src/modules/audit/generated/kysely-tailordb.ts +92 -0
  132. package/src/modules/audit/index.ts +2 -0
  133. package/src/modules/audit/lib/_db_deps.ts +13 -0
  134. package/src/modules/audit/lib/errors.generated.ts +120 -0
  135. package/src/modules/audit/lib/permissions.generated.ts +14 -0
  136. package/src/modules/audit/lib/types.ts +33 -0
  137. package/src/modules/audit/module.ts +57 -0
  138. package/src/modules/audit/permissions.ts +39 -0
  139. package/src/modules/audit/query/getAuditEntry.generated.ts +5 -0
  140. package/src/modules/audit/query/getAuditEntry.test.ts +123 -0
  141. package/src/modules/audit/query/getAuditEntry.ts +42 -0
  142. package/src/modules/audit/query/getAuditPolicy.generated.ts +5 -0
  143. package/src/modules/audit/query/getAuditPolicy.test.ts +169 -0
  144. package/src/modules/audit/query/getAuditPolicy.ts +48 -0
  145. package/src/modules/audit/query/getAuditSummary.generated.ts +5 -0
  146. package/src/modules/audit/query/getAuditSummary.test.ts +632 -0
  147. package/src/modules/audit/query/getAuditSummary.ts +170 -0
  148. package/src/modules/audit/query/getChangeDetails.generated.ts +5 -0
  149. package/src/modules/audit/query/getChangeDetails.test.ts +195 -0
  150. package/src/modules/audit/query/getChangeDetails.ts +48 -0
  151. package/src/modules/audit/query/listAuditPolicies.generated.ts +5 -0
  152. package/src/modules/audit/query/listAuditPolicies.test.ts +239 -0
  153. package/src/modules/audit/query/listAuditPolicies.ts +100 -0
  154. package/src/modules/audit/query/searchAuditEntries.generated.ts +5 -0
  155. package/src/modules/audit/query/searchAuditEntries.test.ts +424 -0
  156. package/src/modules/audit/query/searchAuditEntries.ts +121 -0
  157. package/src/modules/audit/tailor.config.ts +13 -0
  158. package/src/modules/audit/tailor.d.ts +13 -0
  159. package/src/modules/audit/testing/fixtures.ts +215 -0
  160. package/src/modules/business-partner/README.md +60 -0
  161. package/src/modules/business-partner/command/activatePartner.generated.ts +6 -0
  162. package/src/modules/business-partner/command/activatePartner.test.ts +59 -0
  163. package/src/modules/business-partner/command/activatePartner.ts +45 -0
  164. package/src/modules/business-partner/command/assignRoleToPartner.generated.ts +6 -0
  165. package/src/modules/business-partner/command/assignRoleToPartner.test.ts +113 -0
  166. package/src/modules/business-partner/command/assignRoleToPartner.ts +72 -0
  167. package/src/modules/business-partner/command/createContactPerson.generated.ts +6 -0
  168. package/src/modules/business-partner/command/createContactPerson.test.ts +193 -0
  169. package/src/modules/business-partner/command/createContactPerson.ts +98 -0
  170. package/src/modules/business-partner/command/createPartner.generated.ts +6 -0
  171. package/src/modules/business-partner/command/createPartner.test.ts +179 -0
  172. package/src/modules/business-partner/command/createPartner.ts +82 -0
  173. package/src/modules/business-partner/command/createPartnerAddress.generated.ts +6 -0
  174. package/src/modules/business-partner/command/createPartnerAddress.test.ts +195 -0
  175. package/src/modules/business-partner/command/createPartnerAddress.ts +119 -0
  176. package/src/modules/business-partner/command/createPartnerBankAccount.generated.ts +6 -0
  177. package/src/modules/business-partner/command/createPartnerBankAccount.test.ts +297 -0
  178. package/src/modules/business-partner/command/createPartnerBankAccount.ts +114 -0
  179. package/src/modules/business-partner/command/createPartnerIdentification.generated.ts +6 -0
  180. package/src/modules/business-partner/command/createPartnerIdentification.test.ts +255 -0
  181. package/src/modules/business-partner/command/createPartnerIdentification.ts +97 -0
  182. package/src/modules/business-partner/command/deactivateContactPerson.generated.ts +6 -0
  183. package/src/modules/business-partner/command/deactivateContactPerson.test.ts +70 -0
  184. package/src/modules/business-partner/command/deactivateContactPerson.ts +54 -0
  185. package/src/modules/business-partner/command/deactivatePartner.generated.ts +6 -0
  186. package/src/modules/business-partner/command/deactivatePartner.test.ts +59 -0
  187. package/src/modules/business-partner/command/deactivatePartner.ts +46 -0
  188. package/src/modules/business-partner/command/deleteContactPerson.generated.ts +6 -0
  189. package/src/modules/business-partner/command/deleteContactPerson.test.ts +61 -0
  190. package/src/modules/business-partner/command/deleteContactPerson.ts +48 -0
  191. package/src/modules/business-partner/command/deletePartner.generated.ts +6 -0
  192. package/src/modules/business-partner/command/deletePartner.test.ts +58 -0
  193. package/src/modules/business-partner/command/deletePartner.ts +46 -0
  194. package/src/modules/business-partner/command/deletePartnerAddress.generated.ts +6 -0
  195. package/src/modules/business-partner/command/deletePartnerAddress.test.ts +74 -0
  196. package/src/modules/business-partner/command/deletePartnerAddress.ts +52 -0
  197. package/src/modules/business-partner/command/deletePartnerBankAccount.generated.ts +6 -0
  198. package/src/modules/business-partner/command/deletePartnerBankAccount.test.ts +55 -0
  199. package/src/modules/business-partner/command/deletePartnerBankAccount.ts +36 -0
  200. package/src/modules/business-partner/command/deletePartnerIdentification.generated.ts +6 -0
  201. package/src/modules/business-partner/command/deletePartnerIdentification.test.ts +47 -0
  202. package/src/modules/business-partner/command/deletePartnerIdentification.ts +37 -0
  203. package/src/modules/business-partner/command/reactivateContactPerson.generated.ts +6 -0
  204. package/src/modules/business-partner/command/reactivateContactPerson.test.ts +48 -0
  205. package/src/modules/business-partner/command/reactivateContactPerson.ts +48 -0
  206. package/src/modules/business-partner/command/reactivatePartner.generated.ts +6 -0
  207. package/src/modules/business-partner/command/reactivatePartner.test.ts +59 -0
  208. package/src/modules/business-partner/command/reactivatePartner.ts +46 -0
  209. package/src/modules/business-partner/command/removeRoleFromPartner.generated.ts +6 -0
  210. package/src/modules/business-partner/command/removeRoleFromPartner.test.ts +82 -0
  211. package/src/modules/business-partner/command/removeRoleFromPartner.ts +73 -0
  212. package/src/modules/business-partner/command/setDefaultPartnerAddress.generated.ts +6 -0
  213. package/src/modules/business-partner/command/setDefaultPartnerAddress.test.ts +60 -0
  214. package/src/modules/business-partner/command/setDefaultPartnerAddress.ts +48 -0
  215. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.generated.ts +6 -0
  216. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.test.ts +56 -0
  217. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.ts +51 -0
  218. package/src/modules/business-partner/command/setPrimaryContactPerson.generated.ts +6 -0
  219. package/src/modules/business-partner/command/setPrimaryContactPerson.test.ts +63 -0
  220. package/src/modules/business-partner/command/setPrimaryContactPerson.ts +55 -0
  221. package/src/modules/business-partner/command/updateContactPerson.generated.ts +6 -0
  222. package/src/modules/business-partner/command/updateContactPerson.test.ts +193 -0
  223. package/src/modules/business-partner/command/updateContactPerson.ts +92 -0
  224. package/src/modules/business-partner/command/updatePartner.generated.ts +6 -0
  225. package/src/modules/business-partner/command/updatePartner.test.ts +101 -0
  226. package/src/modules/business-partner/command/updatePartner.ts +76 -0
  227. package/src/modules/business-partner/command/updatePartnerAddress.generated.ts +6 -0
  228. package/src/modules/business-partner/command/updatePartnerAddress.test.ts +148 -0
  229. package/src/modules/business-partner/command/updatePartnerAddress.ts +64 -0
  230. package/src/modules/business-partner/command/updatePartnerBankAccount.generated.ts +6 -0
  231. package/src/modules/business-partner/command/updatePartnerBankAccount.test.ts +249 -0
  232. package/src/modules/business-partner/command/updatePartnerBankAccount.ts +109 -0
  233. package/src/modules/business-partner/command/updatePartnerIdentification.generated.ts +6 -0
  234. package/src/modules/business-partner/command/updatePartnerIdentification.test.ts +162 -0
  235. package/src/modules/business-partner/command/updatePartnerIdentification.ts +105 -0
  236. package/src/modules/business-partner/db/.gitkeep +0 -0
  237. package/src/modules/business-partner/db/businessPartner.ts +59 -0
  238. package/src/modules/business-partner/db/contactPerson.ts +49 -0
  239. package/src/modules/business-partner/db/partnerAddress.ts +45 -0
  240. package/src/modules/business-partner/db/partnerBankAccount.ts +53 -0
  241. package/src/modules/business-partner/db/partnerIdentification.ts +53 -0
  242. package/src/modules/business-partner/db/partnerRole.ts +43 -0
  243. package/src/modules/business-partner/docs/commands/ActivatePartner.md +39 -0
  244. package/src/modules/business-partner/docs/commands/AssignRoleToPartner.md +49 -0
  245. package/src/modules/business-partner/docs/commands/CreateContactPerson.md +59 -0
  246. package/src/modules/business-partner/docs/commands/CreatePartner.md +54 -0
  247. package/src/modules/business-partner/docs/commands/CreatePartnerAddress.md +60 -0
  248. package/src/modules/business-partner/docs/commands/CreatePartnerBankAccount.md +68 -0
  249. package/src/modules/business-partner/docs/commands/CreatePartnerIdentification.md +59 -0
  250. package/src/modules/business-partner/docs/commands/DeactivateContactPerson.md +42 -0
  251. package/src/modules/business-partner/docs/commands/DeactivatePartner.md +39 -0
  252. package/src/modules/business-partner/docs/commands/DeleteContactPerson.md +43 -0
  253. package/src/modules/business-partner/docs/commands/DeletePartner.md +40 -0
  254. package/src/modules/business-partner/docs/commands/DeletePartnerAddress.md +40 -0
  255. package/src/modules/business-partner/docs/commands/DeletePartnerBankAccount.md +35 -0
  256. package/src/modules/business-partner/docs/commands/DeletePartnerIdentification.md +33 -0
  257. package/src/modules/business-partner/docs/commands/ReactivateContactPerson.md +38 -0
  258. package/src/modules/business-partner/docs/commands/ReactivatePartner.md +39 -0
  259. package/src/modules/business-partner/docs/commands/RemoveRoleFromPartner.md +46 -0
  260. package/src/modules/business-partner/docs/commands/SetDefaultPartnerAddress.md +38 -0
  261. package/src/modules/business-partner/docs/commands/SetDefaultPartnerBankAccount.md +38 -0
  262. package/src/modules/business-partner/docs/commands/SetPrimaryContactPerson.md +43 -0
  263. package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +66 -0
  264. package/src/modules/business-partner/docs/commands/UpdatePartner.md +48 -0
  265. package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +46 -0
  266. package/src/modules/business-partner/docs/commands/UpdatePartnerBankAccount.md +64 -0
  267. package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +52 -0
  268. package/src/modules/business-partner/docs/features/contact-person-management.md +70 -0
  269. package/src/modules/business-partner/docs/features/partner-address-management.md +96 -0
  270. package/src/modules/business-partner/docs/features/partner-bank-account.md +70 -0
  271. package/src/modules/business-partner/docs/features/partner-identification.md +76 -0
  272. package/src/modules/business-partner/docs/features/partner-lifecycle.md +59 -0
  273. package/src/modules/business-partner/docs/features/partner-role-classification.md +73 -0
  274. package/src/modules/business-partner/docs/models/BusinessPartner.md +64 -0
  275. package/src/modules/business-partner/docs/models/ContactPerson.md +62 -0
  276. package/src/modules/business-partner/docs/models/PartnerAddress.md +52 -0
  277. package/src/modules/business-partner/docs/models/PartnerBankAccount.md +50 -0
  278. package/src/modules/business-partner/docs/models/PartnerIdentification.md +46 -0
  279. package/src/modules/business-partner/docs/models/PartnerRole.md +42 -0
  280. package/src/modules/business-partner/docs/queries/GetContactPerson.md +34 -0
  281. package/src/modules/business-partner/docs/queries/GetDefaultPartnerAddress.md +40 -0
  282. package/src/modules/business-partner/docs/queries/GetDefaultPartnerBankAccount.md +36 -0
  283. package/src/modules/business-partner/docs/queries/GetPartner.md +35 -0
  284. package/src/modules/business-partner/docs/queries/GetPartnerAddress.md +34 -0
  285. package/src/modules/business-partner/docs/queries/GetPartnerBankAccount.md +34 -0
  286. package/src/modules/business-partner/docs/queries/GetPartnerIdentification.md +34 -0
  287. package/src/modules/business-partner/docs/queries/GetPartnerRole.md +34 -0
  288. package/src/modules/business-partner/docs/queries/GetPrimaryContactPerson.md +36 -0
  289. package/src/modules/business-partner/docs/queries/ListContactPersonsByPartner.md +39 -0
  290. package/src/modules/business-partner/docs/queries/ListPartnerAddressesByPartner.md +41 -0
  291. package/src/modules/business-partner/docs/queries/ListPartnerBankAccountsByPartner.md +39 -0
  292. package/src/modules/business-partner/docs/queries/ListPartnerIdentificationsByPartner.md +41 -0
  293. package/src/modules/business-partner/docs/queries/ListPartnersByRole.md +47 -0
  294. package/src/modules/business-partner/executor/.gitkeep +0 -0
  295. package/src/modules/business-partner/generated/.gitkeep +0 -0
  296. package/src/modules/business-partner/generated/enums.ts +60 -0
  297. package/src/modules/business-partner/generated/kysely-tailordb.ts +114 -0
  298. package/src/modules/business-partner/index.ts +2 -0
  299. package/src/modules/business-partner/lib/_db_deps.ts +17 -0
  300. package/src/modules/business-partner/lib/errors.generated.ts +172 -0
  301. package/src/modules/business-partner/lib/permissions.generated.ts +30 -0
  302. package/src/modules/business-partner/lib/types.ts +58 -0
  303. package/src/modules/business-partner/module.ts +181 -0
  304. package/src/modules/business-partner/permissions.ts +3 -0
  305. package/src/modules/business-partner/query/.gitkeep +0 -0
  306. package/src/modules/business-partner/query/getContactPerson.generated.ts +5 -0
  307. package/src/modules/business-partner/query/getContactPerson.test.ts +31 -0
  308. package/src/modules/business-partner/query/getContactPerson.ts +16 -0
  309. package/src/modules/business-partner/query/getDefaultPartnerAddress.generated.ts +5 -0
  310. package/src/modules/business-partner/query/getDefaultPartnerAddress.test.ts +45 -0
  311. package/src/modules/business-partner/query/getDefaultPartnerAddress.ts +30 -0
  312. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.generated.ts +5 -0
  313. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.test.ts +43 -0
  314. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.ts +17 -0
  315. package/src/modules/business-partner/query/getPartner.generated.ts +5 -0
  316. package/src/modules/business-partner/query/getPartner.test.ts +31 -0
  317. package/src/modules/business-partner/query/getPartner.ts +16 -0
  318. package/src/modules/business-partner/query/getPartnerAddress.generated.ts +5 -0
  319. package/src/modules/business-partner/query/getPartnerAddress.test.ts +31 -0
  320. package/src/modules/business-partner/query/getPartnerAddress.ts +16 -0
  321. package/src/modules/business-partner/query/getPartnerBankAccount.generated.ts +5 -0
  322. package/src/modules/business-partner/query/getPartnerBankAccount.test.ts +31 -0
  323. package/src/modules/business-partner/query/getPartnerBankAccount.ts +16 -0
  324. package/src/modules/business-partner/query/getPartnerIdentification.generated.ts +5 -0
  325. package/src/modules/business-partner/query/getPartnerIdentification.test.ts +31 -0
  326. package/src/modules/business-partner/query/getPartnerIdentification.ts +16 -0
  327. package/src/modules/business-partner/query/getPartnerRole.generated.ts +5 -0
  328. package/src/modules/business-partner/query/getPartnerRole.test.ts +31 -0
  329. package/src/modules/business-partner/query/getPartnerRole.ts +19 -0
  330. package/src/modules/business-partner/query/getPrimaryContactPerson.generated.ts +5 -0
  331. package/src/modules/business-partner/query/getPrimaryContactPerson.test.ts +43 -0
  332. package/src/modules/business-partner/query/getPrimaryContactPerson.ts +17 -0
  333. package/src/modules/business-partner/query/listContactPersonsByPartner.generated.ts +5 -0
  334. package/src/modules/business-partner/query/listContactPersonsByPartner.test.ts +77 -0
  335. package/src/modules/business-partner/query/listContactPersonsByPartner.ts +32 -0
  336. package/src/modules/business-partner/query/listPartnerAddressesByPartner.generated.ts +5 -0
  337. package/src/modules/business-partner/query/listPartnerAddressesByPartner.test.ts +71 -0
  338. package/src/modules/business-partner/query/listPartnerAddressesByPartner.ts +37 -0
  339. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.generated.ts +5 -0
  340. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.test.ts +59 -0
  341. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.ts +32 -0
  342. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.generated.ts +5 -0
  343. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.test.ts +72 -0
  344. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.ts +40 -0
  345. package/src/modules/business-partner/query/listPartnersByRole.generated.ts +5 -0
  346. package/src/modules/business-partner/query/listPartnersByRole.test.ts +103 -0
  347. package/src/modules/business-partner/query/listPartnersByRole.ts +47 -0
  348. package/src/modules/business-partner/tailor.config.ts +13 -0
  349. package/src/modules/business-partner/tailor.d.ts +13 -0
  350. package/src/modules/business-partner/testing/fixtures.ts +204 -0
  351. package/src/modules/coa-management/README.md +61 -0
  352. package/src/modules/coa-management/command/.gitkeep +0 -0
  353. package/src/modules/coa-management/command/activateAccount.generated.ts +6 -0
  354. package/src/modules/coa-management/command/activateAccount.test.ts +125 -0
  355. package/src/modules/coa-management/command/activateAccount.ts +105 -0
  356. package/src/modules/coa-management/command/activateChartOfAccounts.generated.ts +6 -0
  357. package/src/modules/coa-management/command/activateChartOfAccounts.test.ts +113 -0
  358. package/src/modules/coa-management/command/activateChartOfAccounts.ts +104 -0
  359. package/src/modules/coa-management/command/createAccount.generated.ts +6 -0
  360. package/src/modules/coa-management/command/createAccount.test.ts +767 -0
  361. package/src/modules/coa-management/command/createAccount.ts +247 -0
  362. package/src/modules/coa-management/command/createAccountGroup.generated.ts +6 -0
  363. package/src/modules/coa-management/command/createAccountGroup.test.ts +494 -0
  364. package/src/modules/coa-management/command/createAccountGroup.ts +207 -0
  365. package/src/modules/coa-management/command/createChartOfAccounts.generated.ts +6 -0
  366. package/src/modules/coa-management/command/createChartOfAccounts.test.ts +502 -0
  367. package/src/modules/coa-management/command/createChartOfAccounts.ts +267 -0
  368. package/src/modules/coa-management/command/deactivateAccount.generated.ts +6 -0
  369. package/src/modules/coa-management/command/deactivateAccount.test.ts +199 -0
  370. package/src/modules/coa-management/command/deactivateAccount.ts +142 -0
  371. package/src/modules/coa-management/command/deactivateChartOfAccounts.generated.ts +6 -0
  372. package/src/modules/coa-management/command/deactivateChartOfAccounts.test.ts +91 -0
  373. package/src/modules/coa-management/command/deactivateChartOfAccounts.ts +88 -0
  374. package/src/modules/coa-management/command/deleteAccount.generated.ts +6 -0
  375. package/src/modules/coa-management/command/deleteAccount.test.ts +122 -0
  376. package/src/modules/coa-management/command/deleteAccount.ts +103 -0
  377. package/src/modules/coa-management/command/deleteAccountGroup.generated.ts +6 -0
  378. package/src/modules/coa-management/command/deleteAccountGroup.test.ts +120 -0
  379. package/src/modules/coa-management/command/deleteAccountGroup.ts +113 -0
  380. package/src/modules/coa-management/command/deleteChartOfAccounts.generated.ts +6 -0
  381. package/src/modules/coa-management/command/deleteChartOfAccounts.test.ts +154 -0
  382. package/src/modules/coa-management/command/deleteChartOfAccounts.ts +133 -0
  383. package/src/modules/coa-management/command/moveAccountGroup.generated.ts +6 -0
  384. package/src/modules/coa-management/command/moveAccountGroup.test.ts +199 -0
  385. package/src/modules/coa-management/command/moveAccountGroup.ts +145 -0
  386. package/src/modules/coa-management/command/reactivateAccount.generated.ts +6 -0
  387. package/src/modules/coa-management/command/reactivateAccount.test.ts +126 -0
  388. package/src/modules/coa-management/command/reactivateAccount.ts +123 -0
  389. package/src/modules/coa-management/command/updateAccount.generated.ts +6 -0
  390. package/src/modules/coa-management/command/updateAccount.test.ts +669 -0
  391. package/src/modules/coa-management/command/updateAccount.ts +370 -0
  392. package/src/modules/coa-management/command/updateAccountGroup.generated.ts +6 -0
  393. package/src/modules/coa-management/command/updateAccountGroup.test.ts +253 -0
  394. package/src/modules/coa-management/command/updateAccountGroup.ts +191 -0
  395. package/src/modules/coa-management/command/updateChartOfAccounts.generated.ts +6 -0
  396. package/src/modules/coa-management/command/updateChartOfAccounts.test.ts +153 -0
  397. package/src/modules/coa-management/command/updateChartOfAccounts.ts +133 -0
  398. package/src/modules/coa-management/db/.gitkeep +0 -0
  399. package/src/modules/coa-management/db/account.ts +119 -0
  400. package/src/modules/coa-management/db/accountGroup.ts +57 -0
  401. package/src/modules/coa-management/db/chartOfAccounts.ts +55 -0
  402. package/src/modules/coa-management/docs/commands/ActivateAccount.md +49 -0
  403. package/src/modules/coa-management/docs/commands/ActivateChartOfAccounts.md +47 -0
  404. package/src/modules/coa-management/docs/commands/CreateAccount.md +94 -0
  405. package/src/modules/coa-management/docs/commands/CreateAccountGroup.md +70 -0
  406. package/src/modules/coa-management/docs/commands/CreateChartOfAccounts.md +72 -0
  407. package/src/modules/coa-management/docs/commands/DeactivateAccount.md +65 -0
  408. package/src/modules/coa-management/docs/commands/DeactivateChartOfAccounts.md +44 -0
  409. package/src/modules/coa-management/docs/commands/DeleteAccount.md +52 -0
  410. package/src/modules/coa-management/docs/commands/DeleteAccountGroup.md +50 -0
  411. package/src/modules/coa-management/docs/commands/DeleteChartOfAccounts.md +48 -0
  412. package/src/modules/coa-management/docs/commands/MoveAccountGroup.md +57 -0
  413. package/src/modules/coa-management/docs/commands/ReactivateAccount.md +50 -0
  414. package/src/modules/coa-management/docs/commands/UpdateAccount.md +102 -0
  415. package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +62 -0
  416. package/src/modules/coa-management/docs/commands/UpdateChartOfAccounts.md +49 -0
  417. package/src/modules/coa-management/docs/features/account-group-hierarchy.md +81 -0
  418. package/src/modules/coa-management/docs/features/account-lifecycle.md +80 -0
  419. package/src/modules/coa-management/docs/features/account-management.md +114 -0
  420. package/src/modules/coa-management/docs/features/chart-of-accounts-setup.md +86 -0
  421. package/src/modules/coa-management/docs/models/Account.md +84 -0
  422. package/src/modules/coa-management/docs/models/AccountGroup.md +55 -0
  423. package/src/modules/coa-management/docs/models/ChartOfAccounts.md +65 -0
  424. package/src/modules/coa-management/docs/queries/DetectCircularReference.md +52 -0
  425. package/src/modules/coa-management/docs/queries/GetAccount.md +42 -0
  426. package/src/modules/coa-management/docs/queries/GetAccountGroup.md +42 -0
  427. package/src/modules/coa-management/docs/queries/GetChartOfAccounts.md +48 -0
  428. package/src/modules/coa-management/docs/queries/ListAccountGroups.md +42 -0
  429. package/src/modules/coa-management/docs/queries/ListAccounts.md +54 -0
  430. package/src/modules/coa-management/docs/queries/ListUnassignedAccounts.md +40 -0
  431. package/src/modules/coa-management/executor/.gitkeep +0 -0
  432. package/src/modules/coa-management/generated/.gitkeep +0 -0
  433. package/src/modules/coa-management/generated/enums.ts +45 -0
  434. package/src/modules/coa-management/generated/kysely-tailordb.ts +81 -0
  435. package/src/modules/coa-management/index.ts +2 -0
  436. package/src/modules/coa-management/lib/_db_deps.ts +17 -0
  437. package/src/modules/coa-management/lib/errors.generated.ts +162 -0
  438. package/src/modules/coa-management/lib/permissions.generated.ts +20 -0
  439. package/src/modules/coa-management/lib/types.ts +27 -0
  440. package/src/modules/coa-management/module.ts +136 -0
  441. package/src/modules/coa-management/permissions.ts +3 -0
  442. package/src/modules/coa-management/query/.gitkeep +0 -0
  443. package/src/modules/coa-management/query/detectCircularReference.generated.ts +5 -0
  444. package/src/modules/coa-management/query/detectCircularReference.test.ts +88 -0
  445. package/src/modules/coa-management/query/detectCircularReference.ts +46 -0
  446. package/src/modules/coa-management/query/getAccount.generated.ts +5 -0
  447. package/src/modules/coa-management/query/getAccount.test.ts +55 -0
  448. package/src/modules/coa-management/query/getAccount.ts +25 -0
  449. package/src/modules/coa-management/query/getAccountGroup.generated.ts +5 -0
  450. package/src/modules/coa-management/query/getAccountGroup.test.ts +55 -0
  451. package/src/modules/coa-management/query/getAccountGroup.ts +25 -0
  452. package/src/modules/coa-management/query/getChartOfAccounts.generated.ts +5 -0
  453. package/src/modules/coa-management/query/getChartOfAccounts.test.ts +79 -0
  454. package/src/modules/coa-management/query/getChartOfAccounts.ts +28 -0
  455. package/src/modules/coa-management/query/listAccountGroups.generated.ts +5 -0
  456. package/src/modules/coa-management/query/listAccountGroups.test.ts +72 -0
  457. package/src/modules/coa-management/query/listAccountGroups.ts +49 -0
  458. package/src/modules/coa-management/query/listAccounts.generated.ts +5 -0
  459. package/src/modules/coa-management/query/listAccounts.test.ts +136 -0
  460. package/src/modules/coa-management/query/listAccounts.ts +82 -0
  461. package/src/modules/coa-management/query/listUnassignedAccounts.generated.ts +5 -0
  462. package/src/modules/coa-management/query/listUnassignedAccounts.test.ts +96 -0
  463. package/src/modules/coa-management/query/listUnassignedAccounts.ts +39 -0
  464. package/src/modules/coa-management/tailor.config.ts +13 -0
  465. package/src/modules/coa-management/tailor.d.ts +13 -0
  466. package/src/modules/coa-management/testing/fixtures.ts +201 -0
  467. package/src/modules/item-management/README.md +1 -1
  468. package/src/modules/item-management/command/activateItem.generated.ts +1 -1
  469. package/src/modules/item-management/command/activateItem.ts +1 -1
  470. package/src/modules/item-management/command/assignItemToTaxonomy.generated.ts +1 -1
  471. package/src/modules/item-management/command/assignItemToTaxonomy.ts +1 -1
  472. package/src/modules/item-management/command/createItem.generated.ts +1 -1
  473. package/src/modules/item-management/command/createItem.test.ts +1 -1
  474. package/src/modules/item-management/command/createItem.ts +1 -1
  475. package/src/modules/item-management/command/createTaxonomyNode.generated.ts +1 -1
  476. package/src/modules/item-management/command/createTaxonomyNode.test.ts +1 -1
  477. package/src/modules/item-management/command/createTaxonomyNode.ts +1 -1
  478. package/src/modules/item-management/command/deactivateItem.generated.ts +1 -1
  479. package/src/modules/item-management/command/deactivateItem.ts +1 -1
  480. package/src/modules/item-management/command/deleteItem.generated.ts +1 -1
  481. package/src/modules/item-management/command/deleteItem.ts +1 -1
  482. package/src/modules/item-management/command/deleteTaxonomyNode.generated.ts +1 -1
  483. package/src/modules/item-management/command/deleteTaxonomyNode.ts +1 -1
  484. package/src/modules/item-management/command/moveTaxonomyNode.generated.ts +1 -1
  485. package/src/modules/item-management/command/moveTaxonomyNode.test.ts +1 -1
  486. package/src/modules/item-management/command/moveTaxonomyNode.ts +1 -1
  487. package/src/modules/item-management/command/reactivateItem.generated.ts +1 -1
  488. package/src/modules/item-management/command/reactivateItem.ts +1 -1
  489. package/src/modules/item-management/command/removeItemFromTaxonomy.generated.ts +1 -1
  490. package/src/modules/item-management/command/removeItemFromTaxonomy.ts +1 -1
  491. package/src/modules/item-management/command/updateItem.generated.ts +1 -1
  492. package/src/modules/item-management/command/updateItem.test.ts +1 -1
  493. package/src/modules/item-management/command/updateItem.ts +1 -1
  494. package/src/modules/item-management/command/updateTaxonomyNode.generated.ts +1 -1
  495. package/src/modules/item-management/command/updateTaxonomyNode.ts +1 -1
  496. package/src/modules/item-management/lib/errors.generated.ts +1 -1
  497. package/src/modules/item-management/lib/permissions.generated.ts +1 -1
  498. package/src/modules/item-management/lib/types.ts +6 -1
  499. package/src/modules/item-management/module.ts +1 -1
  500. package/src/modules/item-management/query/calculateNodeDepth.generated.ts +1 -1
  501. package/src/modules/item-management/query/calculateNodeDepth.ts +1 -1
  502. package/src/modules/item-management/query/calculateSubtreeDepth.generated.ts +1 -1
  503. package/src/modules/item-management/query/calculateSubtreeDepth.ts +1 -1
  504. package/src/modules/item-management/query/detectCircularReference.generated.ts +1 -1
  505. package/src/modules/item-management/query/detectCircularReference.ts +1 -1
  506. package/src/modules/item-management/query/getItem.generated.ts +1 -1
  507. package/src/modules/item-management/query/getItem.ts +1 -1
  508. package/src/modules/item-management/query/getItemTaxonomyAssignment.generated.ts +1 -1
  509. package/src/modules/item-management/query/getItemTaxonomyAssignment.ts +1 -1
  510. package/src/modules/item-management/query/getTaxonomyNode.generated.ts +1 -1
  511. package/src/modules/item-management/query/getTaxonomyNode.ts +1 -1
  512. package/src/modules/item-management/query/getTaxonomyNodeAssignments.generated.ts +1 -1
  513. package/src/modules/item-management/query/getTaxonomyNodeAssignments.ts +1 -1
  514. package/src/modules/item-management/query/getTaxonomyNodeChildren.generated.ts +1 -1
  515. package/src/modules/item-management/query/getTaxonomyNodeChildren.ts +1 -1
  516. package/src/modules/organization/README.md +57 -0
  517. package/src/modules/organization/command/.gitkeep +0 -0
  518. package/src/modules/organization/command/activateCompany.generated.ts +6 -0
  519. package/src/modules/organization/command/activateCompany.test.ts +184 -0
  520. package/src/modules/organization/command/activateCompany.ts +92 -0
  521. package/src/modules/organization/command/createCompany.generated.ts +6 -0
  522. package/src/modules/organization/command/createCompany.test.ts +156 -0
  523. package/src/modules/organization/command/createCompany.ts +80 -0
  524. package/src/modules/organization/command/createDepartment.generated.ts +6 -0
  525. package/src/modules/organization/command/createDepartment.test.ts +239 -0
  526. package/src/modules/organization/command/createDepartment.ts +98 -0
  527. package/src/modules/organization/command/createSite.generated.ts +6 -0
  528. package/src/modules/organization/command/createSite.test.ts +262 -0
  529. package/src/modules/organization/command/createSite.ts +155 -0
  530. package/src/modules/organization/command/deactivateCompany.generated.ts +6 -0
  531. package/src/modules/organization/command/deactivateCompany.test.ts +58 -0
  532. package/src/modules/organization/command/deactivateCompany.ts +47 -0
  533. package/src/modules/organization/command/deactivateDepartment.generated.ts +6 -0
  534. package/src/modules/organization/command/deactivateDepartment.test.ts +115 -0
  535. package/src/modules/organization/command/deactivateDepartment.ts +63 -0
  536. package/src/modules/organization/command/deactivateSite.generated.ts +6 -0
  537. package/src/modules/organization/command/deactivateSite.test.ts +53 -0
  538. package/src/modules/organization/command/deactivateSite.ts +47 -0
  539. package/src/modules/organization/command/deleteCompany.generated.ts +6 -0
  540. package/src/modules/organization/command/deleteCompany.test.ts +99 -0
  541. package/src/modules/organization/command/deleteCompany.ts +66 -0
  542. package/src/modules/organization/command/reactivateCompany.generated.ts +6 -0
  543. package/src/modules/organization/command/reactivateCompany.test.ts +58 -0
  544. package/src/modules/organization/command/reactivateCompany.ts +47 -0
  545. package/src/modules/organization/command/reactivateDepartment.generated.ts +6 -0
  546. package/src/modules/organization/command/reactivateDepartment.test.ts +59 -0
  547. package/src/modules/organization/command/reactivateDepartment.ts +47 -0
  548. package/src/modules/organization/command/reactivateSite.generated.ts +6 -0
  549. package/src/modules/organization/command/reactivateSite.test.ts +53 -0
  550. package/src/modules/organization/command/reactivateSite.ts +47 -0
  551. package/src/modules/organization/command/updateCompany.generated.ts +6 -0
  552. package/src/modules/organization/command/updateCompany.test.ts +239 -0
  553. package/src/modules/organization/command/updateCompany.ts +127 -0
  554. package/src/modules/organization/command/updateDepartment.generated.ts +6 -0
  555. package/src/modules/organization/command/updateDepartment.test.ts +232 -0
  556. package/src/modules/organization/command/updateDepartment.ts +120 -0
  557. package/src/modules/organization/command/updateSite.generated.ts +6 -0
  558. package/src/modules/organization/command/updateSite.test.ts +274 -0
  559. package/src/modules/organization/command/updateSite.ts +176 -0
  560. package/src/modules/organization/db/.gitkeep +0 -0
  561. package/src/modules/organization/db/company.ts +44 -0
  562. package/src/modules/organization/db/department.ts +46 -0
  563. package/src/modules/organization/db/site.ts +44 -0
  564. package/src/modules/organization/docs/commands/ActivateCompany.md +62 -0
  565. package/src/modules/organization/docs/commands/CreateCompany.md +49 -0
  566. package/src/modules/organization/docs/commands/CreateDepartment.md +62 -0
  567. package/src/modules/organization/docs/commands/CreateSite.md +74 -0
  568. package/src/modules/organization/docs/commands/DeactivateCompany.md +40 -0
  569. package/src/modules/organization/docs/commands/DeactivateDepartment.md +44 -0
  570. package/src/modules/organization/docs/commands/DeactivateSite.md +38 -0
  571. package/src/modules/organization/docs/commands/DeleteCompany.md +50 -0
  572. package/src/modules/organization/docs/commands/ReactivateCompany.md +39 -0
  573. package/src/modules/organization/docs/commands/ReactivateDepartment.md +37 -0
  574. package/src/modules/organization/docs/commands/ReactivateSite.md +37 -0
  575. package/src/modules/organization/docs/commands/UpdateCompany.md +58 -0
  576. package/src/modules/organization/docs/commands/UpdateDepartment.md +64 -0
  577. package/src/modules/organization/docs/commands/UpdateSite.md +80 -0
  578. package/src/modules/organization/docs/features/company-lifecycle.md +76 -0
  579. package/src/modules/organization/docs/features/department-management.md +66 -0
  580. package/src/modules/organization/docs/features/site-management.md +86 -0
  581. package/src/modules/organization/docs/models/Company.md +60 -0
  582. package/src/modules/organization/docs/models/Department.md +57 -0
  583. package/src/modules/organization/docs/models/Site.md +57 -0
  584. package/src/modules/organization/docs/queries/DetectDepartmentCircularReference.md +50 -0
  585. package/src/modules/organization/docs/queries/GetCompany.md +40 -0
  586. package/src/modules/organization/docs/queries/GetDepartment.md +44 -0
  587. package/src/modules/organization/docs/queries/GetDepartmentChildren.md +40 -0
  588. package/src/modules/organization/docs/queries/GetSite.md +37 -0
  589. package/src/modules/organization/docs/queries/ListDepartmentsByCompany.md +54 -0
  590. package/src/modules/organization/docs/queries/ListSitesByCompany.md +54 -0
  591. package/src/modules/organization/executor/.gitkeep +0 -0
  592. package/src/modules/organization/generated/.gitkeep +0 -0
  593. package/src/modules/organization/generated/kysely-tailordb.ts +77 -0
  594. package/src/modules/organization/index.ts +2 -0
  595. package/src/modules/organization/lib/_db_deps.ts +10 -0
  596. package/src/modules/organization/lib/errors.generated.ts +117 -0
  597. package/src/modules/organization/lib/permissions.generated.ts +19 -0
  598. package/src/modules/organization/lib/types.ts +21 -0
  599. package/src/modules/organization/module.ts +89 -0
  600. package/src/modules/organization/permissions.ts +3 -0
  601. package/src/modules/organization/query/.gitkeep +0 -0
  602. package/src/modules/organization/query/detectDepartmentCircularReference.generated.ts +5 -0
  603. package/src/modules/organization/query/detectDepartmentCircularReference.test.ts +102 -0
  604. package/src/modules/organization/query/detectDepartmentCircularReference.ts +27 -0
  605. package/src/modules/organization/query/getCompany.generated.ts +5 -0
  606. package/src/modules/organization/query/getCompany.test.ts +70 -0
  607. package/src/modules/organization/query/getCompany.ts +16 -0
  608. package/src/modules/organization/query/getDepartment.generated.ts +5 -0
  609. package/src/modules/organization/query/getDepartment.test.ts +85 -0
  610. package/src/modules/organization/query/getDepartment.ts +17 -0
  611. package/src/modules/organization/query/getDepartmentChildren.generated.ts +5 -0
  612. package/src/modules/organization/query/getDepartmentChildren.test.ts +75 -0
  613. package/src/modules/organization/query/getDepartmentChildren.ts +21 -0
  614. package/src/modules/organization/query/getSite.generated.ts +5 -0
  615. package/src/modules/organization/query/getSite.test.ts +55 -0
  616. package/src/modules/organization/query/getSite.ts +16 -0
  617. package/src/modules/organization/query/listDepartmentsByCompany.generated.ts +5 -0
  618. package/src/modules/organization/query/listDepartmentsByCompany.test.ts +124 -0
  619. package/src/modules/organization/query/listDepartmentsByCompany.ts +43 -0
  620. package/src/modules/organization/query/listSitesByCompany.generated.ts +5 -0
  621. package/src/modules/organization/query/listSitesByCompany.test.ts +126 -0
  622. package/src/modules/organization/query/listSitesByCompany.ts +41 -0
  623. package/src/modules/organization/tailor.config.ts +13 -0
  624. package/src/modules/organization/tailor.d.ts +13 -0
  625. package/src/modules/organization/testing/fixtures.ts +155 -0
  626. package/src/modules/primitives/README.md +1 -1
  627. package/src/modules/primitives/command/activateCategory.generated.ts +1 -1
  628. package/src/modules/primitives/command/activateCategory.ts +1 -1
  629. package/src/modules/primitives/command/activateCurrency.generated.ts +1 -1
  630. package/src/modules/primitives/command/activateCurrency.ts +1 -1
  631. package/src/modules/primitives/command/activateUnit.generated.ts +1 -1
  632. package/src/modules/primitives/command/activateUnit.ts +1 -1
  633. package/src/modules/primitives/command/createCategory.generated.ts +1 -1
  634. package/src/modules/primitives/command/createCategory.ts +1 -1
  635. package/src/modules/primitives/command/createCurrency.generated.ts +1 -1
  636. package/src/modules/primitives/command/createCurrency.ts +1 -1
  637. package/src/modules/primitives/command/createExchangeRate.generated.ts +1 -1
  638. package/src/modules/primitives/command/createExchangeRate.ts +1 -1
  639. package/src/modules/primitives/command/createUnit.generated.ts +1 -1
  640. package/src/modules/primitives/command/createUnit.ts +1 -1
  641. package/src/modules/primitives/command/deactivateCategory.generated.ts +1 -1
  642. package/src/modules/primitives/command/deactivateCategory.ts +1 -1
  643. package/src/modules/primitives/command/deactivateCurrency.generated.ts +1 -1
  644. package/src/modules/primitives/command/deactivateCurrency.ts +1 -1
  645. package/src/modules/primitives/command/deactivateUnit.generated.ts +1 -1
  646. package/src/modules/primitives/command/deactivateUnit.ts +1 -1
  647. package/src/modules/primitives/command/setBaseCurrency.generated.ts +1 -1
  648. package/src/modules/primitives/command/setBaseCurrency.test.ts +8 -64
  649. package/src/modules/primitives/command/setBaseCurrency.ts +6 -64
  650. package/src/modules/primitives/command/setReferenceUnit.generated.ts +1 -1
  651. package/src/modules/primitives/command/setReferenceUnit.ts +1 -1
  652. package/src/modules/primitives/docs/commands/ActivateCategory.md +1 -1
  653. package/src/modules/primitives/docs/commands/ActivateCurrency.md +1 -1
  654. package/src/modules/primitives/docs/commands/ActivateUnit.md +1 -1
  655. package/src/modules/primitives/docs/commands/CreateExchangeRate.md +2 -2
  656. package/src/modules/primitives/docs/commands/CreateUnit.md +1 -1
  657. package/src/modules/primitives/docs/commands/DeactivateCategory.md +1 -1
  658. package/src/modules/primitives/docs/commands/DeactivateCurrency.md +1 -1
  659. package/src/modules/primitives/docs/commands/DeactivateUnit.md +1 -1
  660. package/src/modules/primitives/docs/commands/SetBaseCurrency.md +13 -23
  661. package/src/modules/primitives/docs/commands/SetReferenceUnit.md +1 -1
  662. package/src/modules/primitives/docs/features/currency-definitions.md +13 -14
  663. package/src/modules/primitives/docs/models/Currency.md +3 -4
  664. package/src/modules/primitives/docs/queries/ConvertAmount.md +2 -2
  665. package/src/modules/primitives/docs/queries/ConvertQuantity.md +2 -2
  666. package/src/modules/primitives/lib/errors.generated.ts +6 -1
  667. package/src/modules/primitives/lib/permissions.generated.ts +1 -1
  668. package/src/modules/primitives/lib/types.ts +6 -1
  669. package/src/modules/primitives/module.ts +1 -1
  670. package/src/modules/primitives/query/convertAmount.generated.ts +1 -1
  671. package/src/modules/primitives/query/convertAmount.test.ts +1 -1
  672. package/src/modules/primitives/query/convertAmount.ts +1 -1
  673. package/src/modules/primitives/query/convertQuantity.generated.ts +1 -1
  674. package/src/modules/primitives/query/convertQuantity.test.ts +1 -1
  675. package/src/modules/primitives/query/convertQuantity.ts +1 -1
  676. package/src/modules/primitives/query/getBaseCurrency.generated.ts +1 -1
  677. package/src/modules/primitives/query/getBaseCurrency.test.ts +1 -1
  678. package/src/modules/primitives/query/getBaseCurrency.ts +1 -1
  679. package/src/modules/primitives/query/getCurrency.generated.ts +1 -1
  680. package/src/modules/primitives/query/getCurrency.ts +1 -1
  681. package/src/modules/primitives/query/getUnit.generated.ts +1 -1
  682. package/src/modules/primitives/query/getUnit.ts +1 -1
  683. package/src/modules/primitives/query/getUoMCategory.generated.ts +1 -1
  684. package/src/modules/primitives/query/getUoMCategory.ts +1 -1
  685. package/src/modules/primitives/query/listUnitsByCategory.generated.ts +1 -1
  686. package/src/modules/primitives/query/listUnitsByCategory.ts +2 -2
  687. package/src/modules/product-management/README.md +1 -1
  688. package/src/modules/product-management/command/activateProduct.generated.ts +1 -1
  689. package/src/modules/product-management/command/activateProduct.ts +1 -1
  690. package/src/modules/product-management/command/assignProductToCategory.generated.ts +1 -1
  691. package/src/modules/product-management/command/assignProductToCategory.ts +1 -1
  692. package/src/modules/product-management/command/createProduct.generated.ts +1 -1
  693. package/src/modules/product-management/command/createProduct.test.ts +1 -1
  694. package/src/modules/product-management/command/createProduct.ts +1 -1
  695. package/src/modules/product-management/command/createProductAttribute.generated.ts +1 -1
  696. package/src/modules/product-management/command/createProductAttribute.ts +1 -1
  697. package/src/modules/product-management/command/createProductAttributeValue.generated.ts +1 -1
  698. package/src/modules/product-management/command/createProductAttributeValue.ts +1 -1
  699. package/src/modules/product-management/command/createProductCategory.generated.ts +1 -1
  700. package/src/modules/product-management/command/createProductCategory.test.ts +1 -1
  701. package/src/modules/product-management/command/createProductCategory.ts +1 -1
  702. package/src/modules/product-management/command/deactivateProduct.generated.ts +1 -1
  703. package/src/modules/product-management/command/deactivateProduct.ts +1 -1
  704. package/src/modules/product-management/command/deleteProduct.generated.ts +1 -1
  705. package/src/modules/product-management/command/deleteProduct.ts +1 -1
  706. package/src/modules/product-management/command/deleteProductAttribute.generated.ts +1 -1
  707. package/src/modules/product-management/command/deleteProductAttribute.ts +1 -1
  708. package/src/modules/product-management/command/deleteProductAttributeValue.generated.ts +1 -1
  709. package/src/modules/product-management/command/deleteProductAttributeValue.ts +1 -1
  710. package/src/modules/product-management/command/deleteProductCategory.generated.ts +1 -1
  711. package/src/modules/product-management/command/deleteProductCategory.ts +1 -1
  712. package/src/modules/product-management/command/generateVariants.generated.ts +1 -1
  713. package/src/modules/product-management/command/generateVariants.test.ts +1 -1
  714. package/src/modules/product-management/command/generateVariants.ts +1 -1
  715. package/src/modules/product-management/command/moveProductCategory.generated.ts +1 -1
  716. package/src/modules/product-management/command/moveProductCategory.test.ts +1 -1
  717. package/src/modules/product-management/command/moveProductCategory.ts +1 -1
  718. package/src/modules/product-management/command/reactivateProduct.generated.ts +1 -1
  719. package/src/modules/product-management/command/reactivateProduct.ts +1 -1
  720. package/src/modules/product-management/command/removeProductFromCategory.generated.ts +1 -1
  721. package/src/modules/product-management/command/removeProductFromCategory.ts +1 -1
  722. package/src/modules/product-management/command/setProductAttributeAssignment.generated.ts +1 -1
  723. package/src/modules/product-management/command/setProductAttributeAssignment.ts +1 -1
  724. package/src/modules/product-management/command/updateProduct.generated.ts +1 -1
  725. package/src/modules/product-management/command/updateProduct.test.ts +1 -1
  726. package/src/modules/product-management/command/updateProduct.ts +1 -1
  727. package/src/modules/product-management/command/updateProductAttribute.generated.ts +1 -1
  728. package/src/modules/product-management/command/updateProductAttribute.ts +1 -1
  729. package/src/modules/product-management/command/updateProductAttributeValue.generated.ts +1 -1
  730. package/src/modules/product-management/command/updateProductAttributeValue.ts +1 -1
  731. package/src/modules/product-management/command/updateProductCategory.generated.ts +1 -1
  732. package/src/modules/product-management/command/updateProductCategory.ts +1 -1
  733. package/src/modules/product-management/lib/errors.generated.ts +1 -1
  734. package/src/modules/product-management/lib/permissions.generated.ts +1 -1
  735. package/src/modules/product-management/lib/types.ts +6 -1
  736. package/src/modules/product-management/module.ts +1 -1
  737. package/src/modules/product-management/query/calculateCategoryDepth.generated.ts +1 -1
  738. package/src/modules/product-management/query/calculateCategoryDepth.ts +1 -1
  739. package/src/modules/product-management/query/detectCategoryCircularReference.generated.ts +1 -1
  740. package/src/modules/product-management/query/detectCategoryCircularReference.ts +1 -1
  741. package/src/modules/product-management/query/getProduct.generated.ts +1 -1
  742. package/src/modules/product-management/query/getProduct.ts +1 -1
  743. package/src/modules/product-management/query/getProductAttribute.generated.ts +1 -1
  744. package/src/modules/product-management/query/getProductAttribute.ts +1 -1
  745. package/src/modules/product-management/query/getProductAttributeAssignment.generated.ts +1 -1
  746. package/src/modules/product-management/query/getProductAttributeAssignment.ts +1 -1
  747. package/src/modules/product-management/query/getProductAttributeValue.generated.ts +1 -1
  748. package/src/modules/product-management/query/getProductAttributeValue.ts +1 -1
  749. package/src/modules/product-management/query/getProductCategory.generated.ts +1 -1
  750. package/src/modules/product-management/query/getProductCategory.ts +1 -1
  751. package/src/modules/product-management/query/getProductCategoryAssignment.generated.ts +1 -1
  752. package/src/modules/product-management/query/getProductCategoryAssignment.ts +1 -1
  753. package/src/modules/product-management/query/getProductVariant.generated.ts +1 -1
  754. package/src/modules/product-management/query/getProductVariant.ts +1 -1
  755. package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.generated.ts +1 -1
  756. package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.ts +1 -1
  757. package/src/modules/product-management/query/listCategoryAssignmentsByProduct.generated.ts +1 -1
  758. package/src/modules/product-management/query/listCategoryAssignmentsByProduct.ts +1 -1
  759. package/src/modules/product-management/query/listProductAttributeAssignments.generated.ts +1 -1
  760. package/src/modules/product-management/query/listProductAttributeAssignments.ts +1 -1
  761. package/src/modules/product-management/query/listProductAttributeValues.generated.ts +1 -1
  762. package/src/modules/product-management/query/listProductAttributeValues.ts +1 -1
  763. package/src/modules/product-management/query/listProductCategoryAssignments.generated.ts +1 -1
  764. package/src/modules/product-management/query/listProductCategoryAssignments.ts +1 -1
  765. package/src/modules/product-management/query/listProductCategoryChildren.generated.ts +1 -1
  766. package/src/modules/product-management/query/listProductCategoryChildren.ts +1 -1
  767. package/src/modules/product-management/query/listProductVariants.generated.ts +1 -1
  768. package/src/modules/product-management/query/listProductVariants.ts +1 -1
  769. package/src/modules/user-management/command/activateUser.generated.ts +1 -1
  770. package/src/modules/user-management/command/activateUser.ts +1 -1
  771. package/src/modules/user-management/command/assignPermissionToRole.generated.ts +1 -1
  772. package/src/modules/user-management/command/assignPermissionToRole.ts +1 -1
  773. package/src/modules/user-management/command/assignRoleToUser.generated.ts +1 -1
  774. package/src/modules/user-management/command/assignRoleToUser.ts +1 -1
  775. package/src/modules/user-management/command/createPermission.generated.ts +1 -1
  776. package/src/modules/user-management/command/createPermission.ts +1 -1
  777. package/src/modules/user-management/command/createRole.generated.ts +1 -1
  778. package/src/modules/user-management/command/createRole.ts +1 -1
  779. package/src/modules/user-management/command/createUser.generated.ts +1 -1
  780. package/src/modules/user-management/command/createUser.ts +1 -1
  781. package/src/modules/user-management/command/deactivateUser.generated.ts +1 -1
  782. package/src/modules/user-management/command/deactivateUser.ts +1 -1
  783. package/src/modules/user-management/command/reactivateUser.generated.ts +1 -1
  784. package/src/modules/user-management/command/reactivateUser.ts +1 -1
  785. package/src/modules/user-management/command/revokePermissionFromRole.generated.ts +1 -1
  786. package/src/modules/user-management/command/revokePermissionFromRole.ts +1 -1
  787. package/src/modules/user-management/command/revokeRoleFromUser.generated.ts +1 -1
  788. package/src/modules/user-management/command/revokeRoleFromUser.ts +1 -1
  789. package/src/modules/user-management/docs/commands/CreatePermission.md +3 -3
  790. package/src/modules/user-management/docs/commands/CreateRole.md +1 -1
  791. package/src/modules/user-management/docs/queries/ListRolePermissionsByRole.md +39 -0
  792. package/src/modules/user-management/docs/queries/ListUserRolesByUser.md +39 -0
  793. package/src/modules/user-management/generated/enums.ts +0 -15
  794. package/src/modules/user-management/generated/kysely-tailordb.ts +0 -11
  795. package/src/modules/user-management/lib/errors.generated.ts +1 -1
  796. package/src/modules/user-management/lib/permissions.generated.ts +1 -1
  797. package/src/modules/user-management/lib/types.ts +6 -1
  798. package/src/modules/user-management/module.ts +1 -1
  799. package/src/shared/createContext.ts +2 -1
  800. package/src/shared/defineQuery.ts +36 -1
  801. package/src/shared/requirePermission.ts +3 -3
  802. package/src/shared/types.ts +3 -0
  803. package/templates/scaffold/app/backend/package.json +4 -3
  804. package/templates/scaffold/app/frontend/eslint.config.js +12 -0
  805. package/templates/scaffold/app/frontend/package.json +10 -7
  806. package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +30 -0
  807. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +3 -2
  808. package/templates/scaffold/app/frontend/vite.config.ts +5 -5
  809. package/templates/scaffold/module/lib/types.ts +6 -1
  810. package/templates/scaffold/module/permissions.ts +1 -1
  811. package/src/commands/module/list.test.ts +0 -57
  812. package/src/commands/module/list.ts +0 -64
  813. package/templates/scaffold/module/lib/errors.ts +0 -1
  814. /package/src/modules/{accounting → audit/db}/.gitkeep +0 -0
  815. /package/src/modules/audit/{.gitkeep → executor/.gitkeep} +0 -0
  816. /package/src/modules/{coa-management → business-partner}/.gitkeep +0 -0
  817. /package/src/modules/{supplier-management → business-partner/command}/.gitkeep +0 -0
@@ -0,0 +1,57 @@
1
+ # MoveAccountGroup
2
+
3
+ ## Overview
4
+
5
+ moveAccountGroup reparents an account group by changing its parent reference within the same CoA. The group and all its descendants move together, preserving the subtree structure and all account assignments. Moving to a null parent promotes the group to a root group.
6
+
7
+ ## Business Rules
8
+
9
+ - Target group must exist
10
+ - Parent CoA must be in DRAFT or ACTIVE status; moving a group under an ARCHIVED CoA is rejected
11
+ - New parent group must exist within the same CoA when specified (null for root promotion)
12
+ - A group cannot be moved under itself or any of its descendants (circular reference prevention)
13
+ - All child groups and their account assignments are preserved during the move
14
+ - Group code and account assignments are unchanged by the move
15
+ - Emits an audit event via the audit module recording the acting user, timestamp, previous parent reference, and new parent reference
16
+
17
+ ## Process Flow
18
+
19
+ ```mermaid
20
+ flowchart TD
21
+ A[Receive move request] --> B{Group exists?}
22
+ B -->|No| C[Return error: not found]
23
+ B -->|Yes| B2{Parent CoA is DRAFT or ACTIVE?}
24
+ B2 -->|No| B3[Return error: CoA is ARCHIVED]
25
+ B2 -->|Yes| D{New parent specified?}
26
+ D -->|Yes| E{New parent exists in same CoA?}
27
+ E -->|No| F[Return error: parent not found]
28
+ E -->|Yes| G{New parent is descendant of group?}
29
+ G -->|Yes| H[Return error: circular reference]
30
+ G -->|No| I[Update parent reference]
31
+ D -->|No/null| I[Promote to root]
32
+ I --> J[Emit audit event]
33
+ J --> K[Return moved group]
34
+ ```
35
+
36
+ ## External Dependencies
37
+
38
+ - None
39
+
40
+ ## Error Scenarios
41
+
42
+ - **ACCOUNT_GROUP_NOT_FOUND**: Specified group ID does not exist
43
+ - **CHART_OF_ACCOUNTS_ARCHIVED**: Parent CoA is in ARCHIVED status; no modifications are permitted
44
+ - **PARENT_GROUP_NOT_FOUND**: Specified new parent group ID does not exist or belongs to a different CoA
45
+ - **CIRCULAR_REFERENCE**: New parent is the group itself or one of its descendants
46
+
47
+ ## Test Cases
48
+
49
+ - returns error when group does not exist
50
+ - returns error when parent CoA is ARCHIVED
51
+ - returns error when new parent does not exist
52
+ - returns error when new parent belongs to different CoA
53
+ - returns error when moving group under itself
54
+ - returns error when moving group under its descendant
55
+ - moves group to different parent
56
+ - promotes group to root by setting parent to null
57
+ - emits audit event recording previous and new parent references
@@ -0,0 +1,50 @@
1
+ # ReactivateAccount
2
+
3
+ ## Overview
4
+
5
+ reactivateAccount transitions a GL account from INACTIVE back to ACTIVE status, making it eligible to receive journal postings again. Reactivation clears any previously mapped successor account, as the account is now directly available for use.
6
+
7
+ ## Business Rules
8
+
9
+ - Target account must exist
10
+ - Parent CoA must be in ACTIVE status; reactivating an account under an ARCHIVED CoA is rejected. Note: the DRAFT CoA case is unreachable because account activation requires an ACTIVE CoA, so an INACTIVE account cannot exist under a DRAFT CoA
11
+ - Target account must be in INACTIVE status
12
+ - Reactivating a DRAFT or ACTIVE account fails with an invalid state transition error
13
+ - Reactivation clears any previously mapped successor account
14
+ - Emits an audit event via the audit module recording the acting user, timestamp, CoA reference, account code, and status transition from INACTIVE to ACTIVE
15
+
16
+ ## Process Flow
17
+
18
+ ```mermaid
19
+ flowchart TD
20
+ A[Receive reactivate request] --> B{Account exists?}
21
+ B -->|No| C[Return error: not found]
22
+ B -->|Yes| B2{Parent CoA is ACTIVE?}
23
+ B2 -->|No| B3[Return error: CoA is not ACTIVE]
24
+ B2 -->|Yes| D{Status is INACTIVE?}
25
+ D -->|No| E[Return error: invalid state transition]
26
+ D -->|Yes| F[Clear successor mapping]
27
+ F --> G[Update status to ACTIVE]
28
+ G --> H[Emit audit event]
29
+ H --> I[Return reactivated account]
30
+ ```
31
+
32
+ ## External Dependencies
33
+
34
+ - None
35
+
36
+ ## Error Scenarios
37
+
38
+ - **ACCOUNT_NOT_FOUND**: Specified account ID does not exist
39
+ - **CHART_OF_ACCOUNTS_ARCHIVED**: Parent CoA is in ARCHIVED status; no modifications are permitted
40
+ - **INVALID_STATE_TRANSITION**: Entity is not in the required status for the requested state transition
41
+
42
+ ## Test Cases
43
+
44
+ - returns error when account does not exist
45
+ - returns error when parent CoA is ARCHIVED
46
+ - returns error when account is DRAFT
47
+ - returns error when account is already ACTIVE
48
+ - reactivates an INACTIVE account
49
+ - clears successor mapping on reactivation
50
+ - emits audit event recording status transition from INACTIVE to ACTIVE
@@ -0,0 +1,102 @@
1
+ # UpdateAccount
2
+
3
+ ## Overview
4
+
5
+ updateAccount modifies attributes of an existing GL account. Structural fields (code, type, classification, currency restriction) become immutable once the account has posted transactions. Non-structural fields (name, tags, default tax code, account group assignment) remain updatable regardless of posting history.
6
+
7
+ ## Business Rules
8
+
9
+ - Target account must exist
10
+ - Parent CoA must be in DRAFT or ACTIVE status; updating an account under an ARCHIVED CoA is rejected
11
+ - Name, when provided, must be non-empty
12
+ - Account code, when changed, must be a valid structured numeric identifier
13
+ - Account code, when changed, must remain unique within the CoA
14
+ - If the account has posted transactions, structural fields (code, type, classification, currency restriction) cannot be changed
15
+ - Classification changes must maintain compatibility with account type
16
+ - Changing classification to RETAINED_EARNINGS is rejected if another account in the CoA already has that classification
17
+ - The reconciliation invariant is enforced on every update: accounts with RECEIVABLE, PAYABLE, or BANK_CASH classification must have reconciliation enabled. Explicitly setting isReconciliation to false on an account that currently has (or is being changed to) one of these classifications is rejected. This applies to three update paths: (1) changing classification to RECEIVABLE/PAYABLE/BANK_CASH while isReconciliation is false, (2) setting isReconciliation to false on an account already classified as RECEIVABLE/PAYABLE/BANK_CASH, and (3) simultaneously changing classification to one of these types and setting isReconciliation to false
18
+ - Classification changes that affect posting constraints must update the stored constraint accordingly: changing to NON_POSTING marks the account as excluded from posting target selection; changing to RECEIVABLE or PAYABLE marks the account as a control account blocking manual postings; changing away from these classifications removes the corresponding constraint (all enforced by downstream posting modules)
19
+ - Currency restriction changes must reference a valid currency from the primitives module. An account with currency restriction only accepts postings in that currency (enforced by downstream posting modules)
20
+ - Account group changes must reference a group in the same CoA, and the account code must fall within the group's number range (if defined)
21
+ - When the account code is changed and the account belongs to an account group (whether the group assignment is also changing or staying the same), the new code must fall within the target group's number range (if defined). This applies to both cases: changing only the code while keeping the current group, and changing both the code and the group simultaneously
22
+ - Emits an audit event via the audit module recording the acting user, timestamp, CoA reference, account code, and previous and new field values for all changed attributes
23
+
24
+ ## Process Flow
25
+
26
+ ```mermaid
27
+ flowchart TD
28
+ A[Receive update request] --> B{Account exists?}
29
+ B -->|No| C[Return error: not found]
30
+ B -->|Yes| B2{Parent CoA is DRAFT or ACTIVE?}
31
+ B2 -->|No| B3[Return error: CoA is ARCHIVED]
32
+ B2 -->|Yes| D{Structural fields changed?}
33
+ D -->|Yes| E{Account has posted transactions?}
34
+ E -->|Yes| F[Return error: structural fields immutable]
35
+ E -->|No| D2{Code changed?}
36
+ D2 -->|Yes| D3{Valid numeric format?}
37
+ D3 -->|No| D4[Return error: invalid code format]
38
+ D3 -->|Yes| D5{Code unique within CoA?}
39
+ D5 -->|No| D6[Return error: duplicate code]
40
+ D5 -->|Yes| G{Validate other structural changes}
41
+ D2 -->|No| G
42
+ D -->|No| H{Validate non-structural changes}
43
+ G --> H
44
+ H --> H2{Reconciliation invariant violated?}
45
+ H2 -->|Yes| H3[Return error: reconciliation required]
46
+ H2 -->|No| I[Update account fields]
47
+ I --> J[Emit audit event]
48
+ J --> K[Return updated account]
49
+ ```
50
+
51
+ ## External Dependencies
52
+
53
+ - [primitives::getCurrency](../../../primitives/docs/queries/GetCurrency.md) - Validates currency restriction changes
54
+
55
+ ## Error Scenarios
56
+
57
+ - **ACCOUNT_NOT_FOUND**: Specified account ID does not exist
58
+ - **CHART_OF_ACCOUNTS_ARCHIVED**: Parent CoA is in ARCHIVED status; no modifications are permitted
59
+ - **NAME_REQUIRED**: Name is provided but empty
60
+ - **INVALID_ACCOUNT_CODE**: New account code is not a valid structured numeric identifier
61
+ - **DUPLICATE_ACCOUNT_CODE**: An account with the same code already exists in the CoA
62
+ - **STRUCTURAL_FIELD_IMMUTABLE**: Attempted to change a structural field on an account with posted transactions
63
+ - **INCOMPATIBLE_CLASSIFICATION**: New classification is not compatible with the account type
64
+ - **DUPLICATE_RETAINED_EARNINGS**: Another account in the CoA already has RETAINED_EARNINGS classification
65
+ - **RECONCILIATION_REQUIRED**: Cannot disable reconciliation on an account with RECEIVABLE, PAYABLE, or BANK_CASH classification
66
+ - **CURRENCY_NOT_FOUND**: Referenced currency does not exist or is not active
67
+ - **ACCOUNT_GROUP_NOT_FOUND**: Referenced account group does not exist or belongs to a different CoA
68
+ - **CODE_OUT_OF_RANGE**: Account code does not fall within the target group's number range (applies when changing the group, changing the code, or changing both)
69
+
70
+ ## Test Cases
71
+
72
+ - returns error when account does not exist
73
+ - returns error when parent CoA is ARCHIVED
74
+ - returns error when name is empty
75
+ - returns error when new account code is not a valid numeric identifier
76
+ - returns error when new account code already exists in the CoA
77
+ - returns error when changing structural field on account with posted transactions
78
+ - returns error when new classification is incompatible with type
79
+ - returns error when changing to RETAINED_EARNINGS and another account already has it
80
+ - returns error when new currency does not exist
81
+ - returns error when new group belongs to different CoA
82
+ - updates name of an account
83
+ - updates tags of an account
84
+ - updates default tax code
85
+ - updates account group assignment
86
+ - updates structural fields when no posted transactions exist
87
+ - returns error when setting isReconciliation to false on a RECEIVABLE account
88
+ - returns error when setting isReconciliation to false on a PAYABLE account
89
+ - returns error when setting isReconciliation to false on a BANK_CASH account
90
+ - returns error when changing classification to RECEIVABLE with isReconciliation explicitly set to false
91
+ - enforces reconciliation when classification changes to RECEIVABLE
92
+ - marks account as excluded from posting when classification changes to NON_POSTING
93
+ - marks account as control account blocking manual postings when classification changes to RECEIVABLE
94
+ - marks account as control account blocking manual postings when classification changes to PAYABLE
95
+ - removes posting exclusion when classification changes from NON_POSTING to REGULAR
96
+ - updates currency restriction and posting currency constraint accordingly
97
+ - returns error when account code outside new group number range
98
+ - returns error when changing code to a value outside the current group's number range
99
+ - returns error when changing classification from RECEIVABLE after posted transactions
100
+ - returns error when changing classification from PAYABLE after posted transactions
101
+ - emits audit event recording previous and new field values for all changed attributes
102
+ - passes custom fields through to update
@@ -0,0 +1,62 @@
1
+ # UpdateAccountGroup
2
+
3
+ ## Overview
4
+
5
+ updateAccountGroup modifies the mutable fields (name, sort order, number range) of an existing account group. Code is immutable after creation. Number range changes must not conflict with existing account assignments or overlap with other groups' ranges.
6
+
7
+ ## Business Rules
8
+
9
+ - Target group must exist
10
+ - Parent CoA must be in DRAFT or ACTIVE status; updating a group under an ARCHIVED CoA is rejected
11
+ - Name, when provided, must be non-empty
12
+ - Group code is immutable
13
+ - Number range changes, when provided, require both start and end to be provided together, must remain a valid non-overlapping interval within the CoA
14
+ - Changing a number range must not invalidate existing accounts already assigned to the group (their codes must still fall within the new range)
15
+ - Emits an audit event via the audit module recording the acting user, timestamp, and previous and new field values for all changed attributes
16
+
17
+ ## Process Flow
18
+
19
+ ```mermaid
20
+ flowchart TD
21
+ A[Receive update request] --> B{Group exists?}
22
+ B -->|No| C[Return error: not found]
23
+ B -->|Yes| B2{Parent CoA is DRAFT or ACTIVE?}
24
+ B2 -->|No| B3[Return error: CoA is ARCHIVED]
25
+ B2 -->|Yes| D{Name valid if provided?}
26
+ D -->|No| E[Return error: name required]
27
+ D -->|Yes| F{Number range valid if changed?}
28
+ F -->|No| G[Return error: invalid or overlapping range]
29
+ F -->|Yes| H{Existing accounts within new range?}
30
+ H -->|No| I[Return error: accounts out of range]
31
+ H -->|Yes| J[Update group fields]
32
+ J --> K[Emit audit event]
33
+ K --> L[Return updated group]
34
+ ```
35
+
36
+ ## External Dependencies
37
+
38
+ - [audit](../../../audit/README.md) — Receives audit events emitted by this command
39
+
40
+ ## Error Scenarios
41
+
42
+ - **ACCOUNT_GROUP_NOT_FOUND**: Specified group ID does not exist
43
+ - **CHART_OF_ACCOUNTS_ARCHIVED**: Parent CoA is in ARCHIVED status; no modifications are permitted
44
+ - **NAME_REQUIRED**: Name is provided but empty
45
+ - **INVALID_NUMBER_RANGE**: Number range is invalid or overlaps with another group's range
46
+ - **ACCOUNTS_OUT_OF_RANGE**: Existing assigned accounts have codes outside the new number range
47
+
48
+ ## Test Cases
49
+
50
+ - returns error when group does not exist
51
+ - returns error when parent CoA is ARCHIVED
52
+ - returns error when name is empty
53
+ - returns error when new number range is invalid
54
+ - returns error when updating to one-sided number range (start only)
55
+ - returns error when updating to one-sided number range (end only)
56
+ - returns error when new number range overlaps with another group
57
+ - returns error when existing accounts fall outside new number range
58
+ - updates group name
59
+ - updates sort order
60
+ - updates number range
61
+ - emits audit event recording previous and new field values
62
+ - passes custom fields through to update
@@ -0,0 +1,49 @@
1
+ # UpdateChartOfAccounts
2
+
3
+ ## Overview
4
+
5
+ updateChartOfAccounts modifies the mutable fields (name, description) of an existing Chart of Accounts. Updates are permitted while the CoA is in DRAFT or ACTIVE status. ARCHIVED CoA records cannot be updated.
6
+
7
+ ## Business Rules
8
+
9
+ - Target CoA must exist
10
+ - Target CoA must be in DRAFT or ACTIVE status; updating an ARCHIVED CoA is rejected
11
+ - Name, when provided, must be non-empty
12
+ - Description is optional and can be cleared
13
+ - Emits an audit event via the audit module recording the acting user, timestamp, and previous and new field values for all changed attributes
14
+
15
+ ## Process Flow
16
+
17
+ ```mermaid
18
+ flowchart TD
19
+ A[Receive update request] --> B{CoA exists?}
20
+ B -->|No| C[Return error: not found]
21
+ B -->|Yes| D{Status is DRAFT or ACTIVE?}
22
+ D -->|No| E[Return error: CoA is archived]
23
+ D -->|Yes| F{Name valid if provided?}
24
+ F -->|No| G[Return error: name required]
25
+ F -->|Yes| H[Update CoA fields]
26
+ H --> I[Emit audit event]
27
+ I --> J[Return updated CoA]
28
+ ```
29
+
30
+ ## External Dependencies
31
+
32
+ - None
33
+
34
+ ## Error Scenarios
35
+
36
+ - **CHART_OF_ACCOUNTS_NOT_FOUND**: Specified CoA ID does not exist
37
+ - **CHART_OF_ACCOUNTS_ARCHIVED**: CoA is in ARCHIVED status and cannot be modified
38
+ - **NAME_REQUIRED**: Name is provided but empty
39
+
40
+ ## Test Cases
41
+
42
+ - returns error when CoA does not exist
43
+ - returns error when CoA is ARCHIVED
44
+ - returns error when name is empty
45
+ - updates name of a DRAFT CoA
46
+ - updates description of an ACTIVE CoA
47
+ - clears description by setting to null
48
+ - emits audit event recording previous and new field values
49
+ - passes custom fields through to update
@@ -0,0 +1,81 @@
1
+ # Account Group Hierarchy
2
+
3
+ ## Overview
4
+
5
+ Account groups organize general ledger (GL) accounts into logical categories and nestable hierarchical tree structures within a Chart of Accounts (CoA). Each group has a code, name, optional parent group reference for nesting, and a sort order that controls display sequencing. Groups define categories such as "Current Assets" or "Long-Term Liabilities" and may constrain the account number ranges assignable to their member accounts.
6
+
7
+ Groups can be nested to form a multi-level tree hierarchy that provides structural metadata for the CoA. A root group with no parent represents a top-level section (e.g., "Assets"), while child groups subdivide it into progressively finer categories. Accounts are mapped to leaf or intermediate groups. The hierarchy defines the structure; how that structure is consumed — for balance aggregation, financial statement rendering, or period-close validation — is the responsibility of downstream modules (general-ledger, reporting).
8
+
9
+ ## Business Purpose
10
+
11
+ - **Logical categorization**: Groups classify GL accounts into meaningful business categories (e.g., "Cash and Cash Equivalents", "Accounts Receivable") so that users and downstream modules can reason about accounts collectively
12
+ - **Hierarchical structure**: Nested group trees define the structural organization of accounts. The hierarchy provides the metadata that downstream modules (general-ledger, reporting) consume for balance aggregation and financial statement rendering — this module owns the tree structure, not the aggregation logic
13
+ - **Account number range control**: Groups can define allowed number intervals, ensuring that accounts created within a group fall into the expected numbering range (e.g., 1000-1999 for Assets)
14
+ - **Single operational hierarchy**: Each CoA has one group hierarchy tree that defines the operational categorization of accounts. Financial statement versions (FSV) and multi-GAAP alternative hierarchies are out of scope for this module and belong to a future reporting module
15
+ - **Structural consistency**: Account group assignment is optional per account, but recommended. This module provides a query to list accounts not assigned to any group, enabling downstream consumers to validate completeness according to their own requirements
16
+
17
+ ## Process Flow
18
+
19
+ ```mermaid
20
+ flowchart TD
21
+ A[Create Chart of Accounts] --> B[Define Root Groups]
22
+ B --> C[Create Child Groups under Root]
23
+ C --> D{More nesting needed?}
24
+ D -- Yes --> C
25
+ D -- No --> E[Set Account Number Ranges per Group]
26
+ E --> F[Assign Accounts to Groups]
27
+ F --> G[Hierarchy Structure Complete]
28
+ ```
29
+
30
+ ```mermaid
31
+ flowchart TD
32
+ L1[Root Group: Assets]
33
+ L1 --> L2A[Child Group: Current Assets]
34
+ L1 --> L2B[Child Group: Non-Current Assets]
35
+ L2A --> L3A[Leaf Group: Cash and Equivalents]
36
+ L2A --> L3B[Leaf Group: Accounts Receivable]
37
+ L3A --> A1[Account 1010: Petty Cash]
38
+ L3A --> A2[Account 1020: Bank Account]
39
+ L3B --> A3[Account 1100: Trade Receivables]
40
+ L2B --> L3C[Leaf Group: Fixed Assets]
41
+ L3C --> A4[Account 1500: Equipment]
42
+ ```
43
+
44
+ ## Scenario Patterns
45
+
46
+ - **Standard Balance Sheet Structure**: A controller creates root groups for Assets, Liabilities, and Equity, then nests child groups (Current Assets, Non-Current Assets, Current Liabilities, etc.) to define the account organization structure
47
+ - **Income Statement Structure**: Revenue and expense root groups are subdivided into operating and non-operating categories, with leaf groups for specific reporting classes such as operating expenses, non-operating expenses, and revenue subclasses (e.g., product revenue, service revenue)
48
+ - **Operational Hierarchy Setup**: A single group hierarchy is defined for the CoA, structuring accounts into logical sections (Balance Sheet and Income Statement categories). Downstream modules consume this hierarchy for reporting and aggregation
49
+ - **Account Range Enforcement**: An "Accounts Payable" group is configured with the number range 2000-2099; attempting to create an account numbered 3001 within this group is rejected
50
+ - **Reparenting a Group**: A "Short-Term Investments" group is moved from "Non-Current Assets" to "Current Assets" to reflect a reclassification, updating the hierarchy path
51
+ - **Unassigned Account Query**: A query lists all active accounts not assigned to any group, enabling downstream consumers (e.g., reporting module) to validate hierarchy completeness according to their own requirements
52
+
53
+ ## Test Cases
54
+
55
+ - Every account group belongs to exactly one Chart of Accounts
56
+ - Account group code is required and must be unique within its CoA
57
+ - Account group code is immutable after creation
58
+ - Account group name is required and must be non-empty
59
+ - A group with no parent reference is treated as a root-level group
60
+ - A group with a parent reference must reference a valid group within the same CoA
61
+ - Circular parent references are rejected (a group cannot be its own ancestor)
62
+ - Sort order controls the display sequence of sibling groups under the same parent
63
+ - Deleting a group that contains child groups or assigned accounts is rejected
64
+ - Account number range, when defined on a group, must be a valid non-overlapping interval within the CoA
65
+ - Accounts assigned to a group must have account numbers within the group's allowed range (when a range is defined)
66
+ - Hierarchy depth is not artificially limited but must remain acyclic
67
+ - Moving a group to a new parent within the same CoA updates the hierarchy without breaking existing account assignments
68
+ - A query returns all active accounts within a CoA that are not assigned to any group
69
+ - Account group assignment is optional; accounts can exist in a CoA without belonging to any group
70
+ - The hierarchy tree structure is queryable by downstream modules for consumption (e.g., balance aggregation, report rendering)
71
+ - Creating an account group emits an audit event via the audit module recording the acting user, timestamp, and initial field values
72
+ - Updating an account group (name, sort order, number range) emits an audit event recording previous and new field values; parent changes are handled by the moveAccountGroup operation, not updateAccountGroup
73
+ - Deleting an account group emits an audit event recording the deletion and acting user
74
+ - Moving a group to a new parent emits an audit event recording the previous and new parent references
75
+
76
+ ## Reference Links
77
+
78
+ - [SAP Account Groups and Number Ranges](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee5c9e37ff4f4e33a6c7e2c32f8fc3b5/4b0d35d32d6b3e41e10000000a42189c.html)
79
+ - [SAP Financial Statement Versions](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee5c9e37ff4f4e33a6c7e2c32f8fc3b5/577f8c2a397b4ce589e1ad03a64eb1ae.html)
80
+ - [Oracle General Ledger Trees and Hierarchies](https://docs.oracle.com/en/cloud/saas/financials/24d/oaglg/overview-of-accounting-hierarchies.html)
81
+ - [Odoo Account Groups](https://www.odoo.com/documentation/19.0/applications/finance/accounting/get_started/chart_of_accounts.html)
@@ -0,0 +1,80 @@
1
+ # Account Lifecycle
2
+
3
+ ## Overview
4
+
5
+ GL accounts follow a state machine (DRAFT -> ACTIVE <-> INACTIVE) that governs when an account can receive journal postings, be modified, or be deactivated. The lifecycle ensures that accounts are fully validated before they participate in financial transactions, and that historical data is preserved when an account is retired.
6
+
7
+ Accounts with posted transactions cannot be deleted — they must be deactivated instead. Deactivation prevents new postings while retaining the account for regulatory reporting and audit purposes. An optional successor account mapping allows a replacement to be designated during deactivation; the actual posting redirection behavior is owned by the general-ledger module, which reads the successor mapping from this module. All status transitions emit audit events through the audit module, supporting SOX compliance requirements for change tracking on the chart of accounts.
8
+
9
+ ## Business Purpose
10
+
11
+ - **Lifecycle gating**: Only ACTIVE accounts can receive new journal postings, preventing use of incomplete or retired accounts in financial transactions. Account activation itself requires the parent CoA to be in ACTIVE status — accounts under a DRAFT CoA remain in DRAFT until the CoA is activated, ensuring safe cascade deletion of DRAFT CoAs
12
+ - **Data preservation**: Accounts with posted transactions are never deleted; deactivation preserves history for regulatory retention requirements (typically 7-10 years)
13
+ - **Deprecation with successor mapping**: When retiring an account, an optional successor account can be designated. This module stores the mapping; the general-ledger module is responsible for reading this mapping and redirecting future postings
14
+ - **Balance verification (integration point)**: Deactivation can optionally verify that the account carries no open or unreconciled balances. The balance truth is owned by the general-ledger module — this module exposes a hook for the GL module to block deactivation when open balances exist
15
+ - **Audit trail**: Every status transition is recorded via the audit module, providing a complete change history for internal controls and external audits
16
+ - **Segregation of duties**: Account creation, modification, and approval of status changes can be assigned to separate roles, satisfying SOX and internal control requirements
17
+
18
+ ## Process Flow
19
+
20
+ ```mermaid
21
+ stateDiagram-v2
22
+ [*] --> Draft: createAccount
23
+ Draft --> Active: activateAccount
24
+ Active --> Inactive: deactivateAccount
25
+ Inactive --> Active: reactivateAccount
26
+ Draft --> [*]: deleteAccount
27
+ ```
28
+
29
+ ```mermaid
30
+ stateDiagram-v2
31
+ state "Deactivation Workflow" as deact {
32
+ [*] --> VerifyBalances: initiate deactivation
33
+ VerifyBalances --> MapSuccessor: no open balances
34
+ VerifyBalances --> Blocked: open balances exist
35
+ MapSuccessor --> SetInactive: successor mapped (optional)
36
+ SetInactive --> EmitAuditEvent
37
+ EmitAuditEvent --> [*]
38
+ Blocked --> [*]: resolve balances first
39
+ }
40
+ ```
41
+
42
+ ## Scenario Patterns
43
+
44
+ - **New Account Setup**: A controller creates a GL account in DRAFT, assigns it to the correct account group and hierarchy, then activates it once the parent CoA is ACTIVE (account activation is gated on CoA ACTIVE status) before the first posting period
45
+ - **Account Deprecation with Successor**: A revenue account is being replaced by a more granular set of accounts; the old account is deactivated with a successor mapped. The general-ledger module reads this mapping to redirect any future automated postings to the new account
46
+ - **Balance-Blocked Deactivation (with GL integration)**: An attempt to deactivate an expense account is blocked by the general-ledger module's balance check hook because it still carries an unreconciled balance; the balance must be cleared or transferred before deactivation can proceed
47
+ - **Seasonal Reactivation**: A project-specific account was deactivated at project close but is reactivated when the project resumes, avoiding a duplicate account
48
+ - **Draft Cleanup**: An account created in error is deleted while still in DRAFT before any transactions are posted against it
49
+ - **Regulatory Retention**: A long-inactive account remains in the system with full posting history to satisfy the organization's 7-year data retention policy
50
+
51
+ ## Test Cases
52
+
53
+ - Account lifecycle follows DRAFT -> ACTIVE <-> INACTIVE state machine
54
+ - Accounts can only be created in DRAFT status
55
+ - Only DRAFT accounts with no posted transactions can be deleted
56
+ - Activating a DRAFT account transitions status to ACTIVE when the parent CoA is ACTIVE
57
+ - Activating an account under a DRAFT CoA fails because account activation requires the parent CoA to be in ACTIVE status
58
+ - Activating an account under an ARCHIVED CoA fails because archived CoAs are immutable
59
+ - Activating an already ACTIVE account fails with an invalid status transition error
60
+ - Deactivating an ACTIVE account transitions status to INACTIVE
61
+ - Deactivating a DRAFT account fails with an invalid status transition error
62
+ - Reactivating an INACTIVE account transitions status to ACTIVE
63
+ - Only ACTIVE accounts can receive new journal postings
64
+ - Deactivation exposes a pre-deactivation hook that the general-ledger module can use to block the transition when open or unreconciled balances exist
65
+ - Without a GL module integrated, deactivation proceeds without balance checks
66
+ - A successor account can be mapped during deactivation; posting redirection is owned by the general-ledger module
67
+ - The successor account must itself be ACTIVE at the time of mapping
68
+ - A successor account mapping is optional; deactivation succeeds without one when balances are clear
69
+ - Deleting an account that has posted transactions fails regardless of current status
70
+ - Each status transition emits an audit event via the audit module
71
+ - Audit events record the previous status, new status, acting user, and timestamp
72
+ - Reactivating an account clears any previously mapped successor account
73
+ - Inactive accounts and their posted transactions remain queryable for reporting
74
+
75
+ ## Reference Links
76
+
77
+ - [SAP GL Account Master Data](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee8e4a0f52db415aaa43eb0bf5446a35/4b0a1e1c2d6b3e41e10000000a42189c.html)
78
+ - [Odoo Chart of Accounts](https://www.odoo.com/documentation/19.0/applications/finance/accounting/get_started/chart_of_accounts.html)
79
+ - [Oracle GL Account Maintenance](https://docs.oracle.com/en/cloud/saas/financials/24d/oafmg/overview-of-oracle-general-ledger.html)
80
+ - [SOX Section 302 — Internal Controls](https://www.sarbanes-oxley-101.com/sarbanes-oxley-compliance.htm)
@@ -0,0 +1,114 @@
1
+ # Account Management
2
+
3
+ ## Overview
4
+
5
+ Account Management provides CRUD operations for General Ledger (GL) accounts within a Chart of Accounts (CoA). A GL account is the fundamental building block of financial recording — every journal entry, sub-ledger posting, and financial report ultimately references one or more GL accounts. Each account carries a structured numeric code, a descriptive name, an account type drawn from the standard five-category classification (ASSET, LIABILITY, EQUITY, REVENUE, EXPENSE), an account classification that describes its operational role (e.g., RECEIVABLE, PAYABLE, BANK_CASH, FIXED_ASSET, RETAINED_EARNINGS, NON_POSTING, REGULAR), and optional attributes such as currency restriction, reconciliation flag, default tax code reference, and tags.
6
+
7
+ Accounts are always scoped to a parent CoA and may optionally belong to an account group for hierarchical reporting. The account code follows a structured numbering convention (e.g., 1000-1999 for assets, 2000-2999 for liabilities) that encodes classification directly in the identifier, enabling consistent sorting and range-based queries across the ledger.
8
+
9
+ ## Business Purpose
10
+
11
+ - **Standardized financial classification**: The five account types (ASSET, LIABILITY, EQUITY, REVENUE, EXPENSE) map directly to the structure of the balance sheet and income statement, ensuring every transaction is categorized correctly
12
+ - **Operational account classification**: Beyond the five financial types, each account carries a classification that describes its operational role in the ERP system. Classifications include RECEIVABLE (sub-ledger integration with AR), PAYABLE (sub-ledger integration with AP), BANK_CASH (cash management and bank reconciliation), FIXED_ASSET (asset accounting integration), RETAINED_EARNINGS (equity roll-forward), NON_POSTING (a postability attribute that marks accounts as excluded from journal entry posting; this is not a hierarchy mechanism — structural hierarchy is owned exclusively by account groups), and REGULAR (general-purpose accounts with no special behavior). This classification drives downstream module behavior — for example, only RECEIVABLE accounts can serve as AR control accounts, and NON_POSTING accounts are excluded from journal entry target selection
13
+ - **Structured code numbering**: Numeric code ranges provide an immediately recognizable, sortable identifier that conveys account classification without requiring a lookup
14
+ - **Currency restriction**: Restricting an account to a specific currency prevents mixed-currency postings and simplifies reconciliation for foreign-currency bank or receivable accounts
15
+ - **Reconciliation control**: The reconciliation flag designates accounts (such as bank, accounts receivable, and accounts payable) where individual line items must be matched and cleared, supporting accurate cash and partner balance tracking. Accounts classified as RECEIVABLE, PAYABLE, or BANK_CASH must have reconciliation enabled — this is enforced as an invariant, not a default
16
+ - **Control account posting restrictions**: Accounts classified as RECEIVABLE or PAYABLE serve as sub-ledger control accounts. Direct manual journal postings to these accounts must be blocked; only automated postings from the AR/AP sub-ledger modules are permitted. This invariant preserves the integrity of the sub-ledger ↔ GL reconciliation and prevents manual entries from creating discrepancies between the sub-ledger detail and the GL summary balance
17
+ - **Structural immutability after posting**: Once an account has received posted transactions, structural fields (account code, account type, account classification, currency restriction) become immutable. This applies to all accounts but is especially critical for control accounts (RECEIVABLE, PAYABLE) where a classification change would break sub-ledger integration
18
+ - **Default tax code**: An optional free-text tax code identifier stored on the account for downstream use. When the `tax-configuration` module is implemented, this field will be migrated to a validated foreign-key reference against the tax code catalog. Until then, this module stores the identifier as free text with no external validation. The migration contract: the `tax-configuration` module will own the validation rule; this module will add a dependency and enforce referential integrity at that time
19
+ - **Tag-based categorization**: Tags provide flexible, cross-cutting labels for filtering and reporting beyond the rigid type and group hierarchy — for example, tagging accounts as "intercompany", "cost-center-allocable", or "cash-flow-relevant"
20
+ - **CoA and group membership**: Scoping accounts to a CoA and optional account group maintains structural integrity and supports hierarchical roll-up in trial balances and financial statements
21
+
22
+ ## Process Flow
23
+
24
+ ```mermaid
25
+ flowchart TD
26
+ A[Start] --> B[Create Account in CoA]
27
+ B --> C{All required fields valid?}
28
+ C -- No --> D[Return validation error]
29
+ C -- Yes --> E[Account created]
30
+ E --> F{Update needed?}
31
+ F -- Yes --> G[Update account attributes]
32
+ G --> H{Account referenced in journal entries?}
33
+ H -- Yes --> I[Restrict updates to non-structural fields]
34
+ H -- No --> J[Allow full update]
35
+ I --> E
36
+ J --> E
37
+ F -- No --> K{Delete requested?}
38
+ K -- Yes --> L{Account in DRAFT status?}
39
+ L -- No --> M[Reject deletion — must deactivate instead]
40
+ L -- Yes --> L2{Account has posted transactions?}
41
+ L2 -- Yes --> M
42
+ L2 -- No --> N[Delete account]
43
+ K -- No --> O[Read / List / Filter accounts]
44
+ ```
45
+
46
+ ```mermaid
47
+ flowchart TD
48
+ subgraph Code Structure
49
+ A1[1000-1999: ASSET] --> A2[2000-2999: LIABILITY]
50
+ A2 --> A3[3000-3999: EQUITY]
51
+ A3 --> A4[4000-4999: REVENUE]
52
+ A4 --> A5[5000-5999: EXPENSE]
53
+ end
54
+ ```
55
+
56
+ ## Scenario Patterns
57
+
58
+ - **Standard Account Creation**: A finance team sets up a new CoA and creates GL accounts following the structured numbering convention — cash at 1010 (BANK_CASH), accounts receivable at 1200 (RECEIVABLE), accounts payable at 2100 (PAYABLE), retained earnings at 3100 (RETAINED_EARNINGS), sales revenue at 4000 (REGULAR), and office supplies expense at 5200 (REGULAR)
59
+ - **Foreign Currency Bank Account**: A treasury team creates a bank account (ASSET, BANK_CASH, code 1015) with a currency restriction set to USD, ensuring only USD-denominated entries can be posted to it
60
+ - **Reconcilable Receivable Account**: An accounts receivable control account (ASSET, RECEIVABLE, code 1200) is created with the reconciliation flag enabled, allowing individual customer invoice and payment lines to be matched and cleared. The RECEIVABLE classification marks it as the AR sub-ledger control account
61
+ - **Non-Posting Control Account**: A clearing or suspense account (ASSET, NON_POSTING, code 1000) is created with the NON_POSTING classification, marking it as excluded from journal entry posting. This is strictly a postability control — it prevents the account from being selected as a target in journal entries. Structural grouping, subtotals, and report labels are owned by account groups and downstream reporting modules, not by account classification
62
+ - **Tax-Defaulted Revenue Account**: A domestic sales revenue account (REVENUE, REGULAR, code 4010) is created with a default tax code referencing the standard VAT rate, so journal lines hitting this account auto-populate the correct tax treatment
63
+ - **Tagged Intercompany Account**: An intercompany receivable account is created with RECEIVABLE classification and tagged with "intercompany" to enable cross-entity elimination reports without relying solely on account code ranges
64
+ - **Retained Earnings Account**: An equity account (EQUITY, RETAINED_EARNINGS, code 3100) is designated to receive the net income roll-forward at period close. Only one account per CoA should carry this classification
65
+ - **Fixed Asset Account**: Equipment account (ASSET, FIXED_ASSET, code 1500) is created with the FIXED_ASSET classification, enabling future integration with the fixed-asset module for depreciation scheduling
66
+ - **Account Group Assignment**: Multiple expense accounts (5100 salaries, 5200 rent, 5300 utilities) are assigned to an "Operating Expenses" account group for hierarchical organization
67
+ - **Blocked Manual Posting to Control Account**: A user attempts to create a manual journal entry debiting the AR control account (1200, RECEIVABLE); the posting is rejected because RECEIVABLE accounts only accept automated sub-ledger postings from the AR module
68
+ - **Prevented Deletion of Active Account**: An attempt to delete account 1010 (cash), which is in ACTIVE status, fails because only DRAFT accounts can be deleted; accounts with posted transactions must be deactivated instead
69
+ - **Prevented Structural Change on Posted Control Account**: An attempt to change the classification of account 2100 (PAYABLE) to REGULAR is rejected because the account has posted transactions; the PAYABLE classification is immutable after posting
70
+ - **Bulk Account Setup**: During initial CoA configuration, a batch of accounts is created from a template covering all five types with appropriate classifications, codes, names, and default attributes
71
+
72
+ ## Test Cases
73
+
74
+ - Creating an account requires a valid parent CoA reference
75
+ - Account code must be unique within the same CoA
76
+ - Account code must be a structured numeric identifier and cannot be empty
77
+ - Account name is required and must be non-empty
78
+ - Account type must be one of ASSET, LIABILITY, EQUITY, REVENUE, or EXPENSE
79
+ - Account classification must be one of REGULAR, RECEIVABLE, PAYABLE, BANK_CASH, FIXED_ASSET, RETAINED_EARNINGS, or NON_POSTING
80
+ - Account classification defaults to REGULAR when not explicitly set
81
+ - Account classification must be compatible with account type: RECEIVABLE and BANK_CASH and FIXED_ASSET require type ASSET; PAYABLE requires type LIABILITY; RETAINED_EARNINGS requires type EQUITY; REGULAR and NON_POSTING are allowed with any account type
82
+ - NON_POSTING accounts cannot receive journal postings — downstream modules must exclude them from posting target selection. NON_POSTING is a postability attribute only; it does not imply parent-child relationships between accounts (hierarchy is owned by account groups)
83
+ - Only one account per CoA may carry the RETAINED_EARNINGS classification
84
+ - Currency restriction, when provided, must reference a valid currency from the primitives module
85
+ - An account with currency restriction only accepts postings in that currency
86
+ - Reconciliation flag defaults to false when not explicitly set for REGULAR, FIXED_ASSET, RETAINED_EARNINGS, and NON_POSTING classifications
87
+ - Accounts with RECEIVABLE, PAYABLE, or BANK_CASH classification must have reconciliation enabled; attempting to set reconciliation to false for these classifications is rejected
88
+ - Creating a RECEIVABLE or PAYABLE account automatically enforces reconciliation enabled as an invariant
89
+ - RECEIVABLE and PAYABLE accounts block direct manual journal postings; only sub-ledger module automated postings are permitted
90
+ - Attempting a direct manual journal posting to a RECEIVABLE or PAYABLE control account is rejected by downstream posting modules (this module marks the constraint; enforcement is at the GL/posting layer)
91
+ - Default tax code is an optional free-text identifier (validation against a tax configuration module is a future integration point)
92
+ - Tags are optional and may contain zero or more string labels
93
+ - An account can optionally belong to an account group within the same CoA
94
+ - Updating an account that has posted journal entries restricts changes to non-structural fields (name, tags, default tax code); structural fields (account code, account type, account classification, currency restriction) become immutable
95
+ - Updating account type, code, or classification is rejected when the account has posted transactions
96
+ - Changing account classification from RECEIVABLE or PAYABLE to any other classification is rejected once the account has posted transactions, preserving sub-ledger integrity
97
+ - Only DRAFT accounts with no posted transactions can be deleted (consistent with account lifecycle state machine)
98
+ - Deleting an ACTIVE or INACTIVE account is rejected regardless of transaction history; these accounts must be deactivated instead
99
+ - Deleting a DRAFT account that has posted transactions is rejected to preserve ledger integrity
100
+ - Listing accounts supports filtering by type, account group, tags, and currency restriction
101
+ - Accounts within a CoA can be retrieved sorted by account code
102
+ - Creating two accounts with the same code in the same CoA fails with a uniqueness constraint error
103
+ - Creating an account with a code outside valid numeric format fails validation
104
+ - Assigning an account to a group that belongs to a different CoA fails validation
105
+ - Creating an account emits an audit event via the audit module recording the acting user, timestamp, and initial field values
106
+ - Updating an account emits an audit event recording the previous and new field values for all changed attributes
107
+ - Deleting a DRAFT account emits an audit event recording the deletion and acting user
108
+ - Audit events for account operations include the CoA reference, account code, and account classification for traceability
109
+
110
+ ## Reference Links
111
+
112
+ - [SAP GL Account Master Data](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee4e846b9aea4e78b6665038855e5148/4d9a976ecc0e7a30e10000000a15822b.html)
113
+ - [Odoo Chart of Accounts (account.account)](https://www.odoo.com/documentation/19.0/applications/finance/accounting/get_started/chart_of_accounts.html)
114
+ - [IFRS Conceptual Framework — Elements of Financial Statements](https://www.ifrs.org/issued-standards/list-of-standards/conceptual-framework/)