@tailor-platform/erp-kit 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +35 -7
  3. package/dist/cli.mjs +779 -268
  4. package/package.json +5 -4
  5. package/skills/erp-kit-app-1-requirements/SKILL.md +8 -9
  6. package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +4 -0
  7. package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +4 -0
  8. package/skills/erp-kit-app-3-plan/SKILL.md +27 -27
  9. package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +21 -17
  10. package/skills/erp-kit-app-3-plan/references/screen-extraction.md +15 -1
  11. package/skills/erp-kit-app-3-plan/references/story-extraction.md +8 -2
  12. package/skills/erp-kit-app-5-impl-backend/SKILL.md +9 -11
  13. package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -22
  14. package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +0 -1
  15. package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +13 -4
  16. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +5 -0
  17. package/skills/erp-kit-app-6-impl-frontend/references/pages.md +16 -46
  18. package/skills/erp-kit-app-7-impl-review/SKILL.md +13 -11
  19. package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +16 -17
  20. package/skills/erp-kit-module-1-requirements/SKILL.md +6 -12
  21. package/skills/erp-kit-module-2-requirements-review/SKILL.md +21 -5
  22. package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +19 -0
  23. package/skills/erp-kit-module-3-plan/SKILL.md +2 -4
  24. package/skills/erp-kit-module-4-plan-review/SKILL.md +21 -5
  25. package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +15 -0
  26. package/skills/erp-kit-module-6-impl-review/SKILL.md +21 -7
  27. package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +15 -0
  28. package/skills/erp-kit-module-shared/SKILL.md +4 -0
  29. package/src/commands/app/index.ts +28 -17
  30. package/src/commands/check.test.ts +1 -1
  31. package/src/commands/check.ts +2 -35
  32. package/src/commands/doc/index.ts +83 -0
  33. package/src/commands/doc/module.test.ts +119 -0
  34. package/src/commands/doc/module.ts +114 -0
  35. package/src/commands/doc/modules.test.ts +103 -0
  36. package/src/commands/doc/modules.ts +98 -0
  37. package/src/commands/doc/search.test.ts +94 -0
  38. package/src/commands/doc/search.ts +111 -0
  39. package/src/commands/generate-doc.ts +17 -10
  40. package/src/commands/index.ts +20 -8
  41. package/src/commands/lib/command-result.ts +30 -0
  42. package/src/commands/lib/discovery.test.ts +74 -0
  43. package/src/commands/lib/discovery.ts +106 -0
  44. package/src/commands/lib/paths.ts +22 -0
  45. package/src/commands/lib/sync-check-source.test.ts +197 -0
  46. package/src/commands/lib/sync-check-source.ts +100 -0
  47. package/src/commands/lib/sync-check-tests.test.ts +178 -0
  48. package/src/commands/lib/sync-check-tests.ts +69 -0
  49. package/src/commands/mock/index.ts +11 -6
  50. package/src/commands/module/generate.ts +13 -8
  51. package/src/commands/module/index.ts +17 -21
  52. package/src/commands/parse-doc-test-cases.ts +13 -2
  53. package/src/commands/sync-check.test.ts +6 -364
  54. package/src/commands/sync-check.ts +7 -251
  55. package/src/generator/generate-app-code.test.ts +121 -0
  56. package/src/generator/generate-app-code.ts +51 -0
  57. package/src/generator/generate-code-boilerplate.test.ts +1 -1
  58. package/src/generator/generate-code.test.ts +33 -6
  59. package/src/generator/generate-code.ts +12 -226
  60. package/src/generator/generate-errors.ts +34 -0
  61. package/src/generator/generate-permissions.ts +12 -0
  62. package/src/generator/generate-shells.ts +28 -0
  63. package/src/generator/generate-stubs.ts +31 -0
  64. package/src/generator/parse-resolver-doc.test.ts +89 -0
  65. package/src/generator/parse-resolver-doc.ts +125 -0
  66. package/src/generator/scaffold.ts +57 -0
  67. package/src/generator/stub-templates.test.ts +55 -0
  68. package/src/generator/stub-templates.ts +145 -0
  69. package/src/modules/audit/README.md +46 -0
  70. package/src/modules/audit/command/activateAuditPolicy.generated.ts +6 -0
  71. package/src/modules/audit/command/activateAuditPolicy.test.ts +186 -0
  72. package/src/modules/audit/command/activateAuditPolicy.ts +97 -0
  73. package/src/modules/audit/command/createAuditPolicy.generated.ts +6 -0
  74. package/src/modules/audit/command/createAuditPolicy.test.ts +395 -0
  75. package/src/modules/audit/command/createAuditPolicy.ts +131 -0
  76. package/src/modules/audit/command/deactivateAuditPolicy.generated.ts +6 -0
  77. package/src/modules/audit/command/deactivateAuditPolicy.test.ts +138 -0
  78. package/src/modules/audit/command/deactivateAuditPolicy.ts +58 -0
  79. package/src/modules/audit/command/deleteAuditPolicy.generated.ts +6 -0
  80. package/src/modules/audit/command/deleteAuditPolicy.test.ts +121 -0
  81. package/src/modules/audit/command/deleteAuditPolicy.ts +52 -0
  82. package/src/modules/audit/command/logAuditEvent.generated.ts +6 -0
  83. package/src/modules/audit/command/logAuditEvent.test.ts +991 -0
  84. package/src/modules/audit/command/logAuditEvent.ts +357 -0
  85. package/src/modules/audit/command/reactivateAuditPolicy.generated.ts +6 -0
  86. package/src/modules/audit/command/reactivateAuditPolicy.test.ts +143 -0
  87. package/src/modules/audit/command/reactivateAuditPolicy.ts +79 -0
  88. package/src/modules/audit/command/registerAuditableEntity.generated.ts +6 -0
  89. package/src/modules/audit/command/registerAuditableEntity.test.ts +268 -0
  90. package/src/modules/audit/command/registerAuditableEntity.ts +94 -0
  91. package/src/modules/audit/command/replaceAuditPolicy.generated.ts +6 -0
  92. package/src/modules/audit/command/replaceAuditPolicy.test.ts +242 -0
  93. package/src/modules/audit/command/replaceAuditPolicy.ts +91 -0
  94. package/src/modules/audit/command/updateAuditPolicy.generated.ts +6 -0
  95. package/src/modules/audit/command/updateAuditPolicy.test.ts +284 -0
  96. package/src/modules/audit/command/updateAuditPolicy.ts +151 -0
  97. package/src/modules/audit/db/auditEntry.ts +47 -0
  98. package/src/modules/audit/db/auditPolicy.ts +33 -0
  99. package/src/modules/audit/db/auditableEntity.ts +22 -0
  100. package/src/modules/audit/db/changeDetail.ts +28 -0
  101. package/src/modules/audit/db/policyFieldRule.ts +23 -0
  102. package/src/modules/audit/docs/commands/ActivateAuditPolicy.md +69 -0
  103. package/src/modules/audit/docs/commands/CreateAuditPolicy.md +79 -0
  104. package/src/modules/audit/docs/commands/DeactivateAuditPolicy.md +55 -0
  105. package/src/modules/audit/docs/commands/DeleteAuditPolicy.md +55 -0
  106. package/src/modules/audit/docs/commands/LogAuditEvent.md +137 -0
  107. package/src/modules/audit/docs/commands/ReactivateAuditPolicy.md +58 -0
  108. package/src/modules/audit/docs/commands/RegisterAuditableEntity.md +62 -0
  109. package/src/modules/audit/docs/commands/ReplaceAuditPolicy.md +72 -0
  110. package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +77 -0
  111. package/src/modules/audit/docs/features/audit-event-logging.md +126 -0
  112. package/src/modules/audit/docs/features/audit-policy-configuration.md +135 -0
  113. package/src/modules/audit/docs/features/field-level-change-tracking.md +95 -0
  114. package/src/modules/audit/docs/models/AuditEntry.md +55 -0
  115. package/src/modules/audit/docs/models/AuditPolicy.md +79 -0
  116. package/src/modules/audit/docs/models/AuditableEntity.md +38 -0
  117. package/src/modules/audit/docs/models/ChangeDetail.md +55 -0
  118. package/src/modules/audit/docs/models/PolicyFieldRule.md +45 -0
  119. package/src/modules/audit/docs/queries/GetAuditEntry.md +49 -0
  120. package/src/modules/audit/docs/queries/GetAuditPolicy.md +54 -0
  121. package/src/modules/audit/docs/queries/GetAuditSummary.md +84 -0
  122. package/src/modules/audit/docs/queries/GetChangeDetails.md +56 -0
  123. package/src/modules/audit/docs/queries/ListAuditPolicies.md +58 -0
  124. package/src/modules/audit/docs/queries/SearchAuditEntries.md +91 -0
  125. package/src/modules/audit/generated/kysely-tailordb.ts +92 -0
  126. package/src/modules/audit/index.ts +2 -0
  127. package/src/modules/audit/lib/_db_deps.ts +13 -0
  128. package/src/modules/audit/lib/errors.generated.ts +120 -0
  129. package/src/modules/audit/lib/permissions.generated.ts +14 -0
  130. package/src/modules/audit/lib/types.ts +28 -0
  131. package/src/modules/audit/module.ts +57 -0
  132. package/src/modules/audit/permissions.ts +39 -0
  133. package/src/modules/audit/query/getAuditEntry.generated.ts +5 -0
  134. package/src/modules/audit/query/getAuditEntry.test.ts +123 -0
  135. package/src/modules/audit/query/getAuditEntry.ts +36 -0
  136. package/src/modules/audit/query/getAuditPolicy.generated.ts +5 -0
  137. package/src/modules/audit/query/getAuditPolicy.test.ts +169 -0
  138. package/src/modules/audit/query/getAuditPolicy.ts +42 -0
  139. package/src/modules/audit/query/getAuditSummary.generated.ts +5 -0
  140. package/src/modules/audit/query/getAuditSummary.test.ts +632 -0
  141. package/src/modules/audit/query/getAuditSummary.ts +164 -0
  142. package/src/modules/audit/query/getChangeDetails.generated.ts +5 -0
  143. package/src/modules/audit/query/getChangeDetails.test.ts +195 -0
  144. package/src/modules/audit/query/getChangeDetails.ts +42 -0
  145. package/src/modules/audit/query/listAuditPolicies.generated.ts +5 -0
  146. package/src/modules/audit/query/listAuditPolicies.test.ts +239 -0
  147. package/src/modules/audit/query/listAuditPolicies.ts +100 -0
  148. package/src/modules/audit/query/searchAuditEntries.generated.ts +5 -0
  149. package/src/modules/audit/query/searchAuditEntries.test.ts +424 -0
  150. package/src/modules/audit/query/searchAuditEntries.ts +121 -0
  151. package/src/modules/audit/tailor.config.ts +13 -0
  152. package/src/modules/audit/tailor.d.ts +13 -0
  153. package/src/modules/audit/testing/fixtures.ts +215 -0
  154. package/src/modules/business-partner/README.md +60 -0
  155. package/src/modules/business-partner/command/.gitkeep +0 -0
  156. package/src/modules/business-partner/command/activatePartner.generated.ts +6 -0
  157. package/src/modules/business-partner/command/activatePartner.test.ts +59 -0
  158. package/src/modules/business-partner/command/activatePartner.ts +45 -0
  159. package/src/modules/business-partner/command/assignRoleToPartner.generated.ts +6 -0
  160. package/src/modules/business-partner/command/assignRoleToPartner.test.ts +113 -0
  161. package/src/modules/business-partner/command/assignRoleToPartner.ts +72 -0
  162. package/src/modules/business-partner/command/createContactPerson.generated.ts +6 -0
  163. package/src/modules/business-partner/command/createContactPerson.test.ts +193 -0
  164. package/src/modules/business-partner/command/createContactPerson.ts +98 -0
  165. package/src/modules/business-partner/command/createPartner.generated.ts +6 -0
  166. package/src/modules/business-partner/command/createPartner.test.ts +179 -0
  167. package/src/modules/business-partner/command/createPartner.ts +83 -0
  168. package/src/modules/business-partner/command/createPartnerAddress.generated.ts +6 -0
  169. package/src/modules/business-partner/command/createPartnerAddress.test.ts +195 -0
  170. package/src/modules/business-partner/command/createPartnerAddress.ts +119 -0
  171. package/src/modules/business-partner/command/createPartnerBankAccount.generated.ts +6 -0
  172. package/src/modules/business-partner/command/createPartnerBankAccount.test.ts +297 -0
  173. package/src/modules/business-partner/command/createPartnerBankAccount.ts +114 -0
  174. package/src/modules/business-partner/command/createPartnerIdentification.generated.ts +6 -0
  175. package/src/modules/business-partner/command/createPartnerIdentification.test.ts +255 -0
  176. package/src/modules/business-partner/command/createPartnerIdentification.ts +97 -0
  177. package/src/modules/business-partner/command/deactivateContactPerson.generated.ts +6 -0
  178. package/src/modules/business-partner/command/deactivateContactPerson.test.ts +70 -0
  179. package/src/modules/business-partner/command/deactivateContactPerson.ts +54 -0
  180. package/src/modules/business-partner/command/deactivatePartner.generated.ts +6 -0
  181. package/src/modules/business-partner/command/deactivatePartner.test.ts +59 -0
  182. package/src/modules/business-partner/command/deactivatePartner.ts +46 -0
  183. package/src/modules/business-partner/command/deleteContactPerson.generated.ts +6 -0
  184. package/src/modules/business-partner/command/deleteContactPerson.test.ts +61 -0
  185. package/src/modules/business-partner/command/deleteContactPerson.ts +48 -0
  186. package/src/modules/business-partner/command/deletePartner.generated.ts +6 -0
  187. package/src/modules/business-partner/command/deletePartner.test.ts +58 -0
  188. package/src/modules/business-partner/command/deletePartner.ts +46 -0
  189. package/src/modules/business-partner/command/deletePartnerAddress.generated.ts +6 -0
  190. package/src/modules/business-partner/command/deletePartnerAddress.test.ts +74 -0
  191. package/src/modules/business-partner/command/deletePartnerAddress.ts +52 -0
  192. package/src/modules/business-partner/command/deletePartnerBankAccount.generated.ts +6 -0
  193. package/src/modules/business-partner/command/deletePartnerBankAccount.test.ts +55 -0
  194. package/src/modules/business-partner/command/deletePartnerBankAccount.ts +36 -0
  195. package/src/modules/business-partner/command/deletePartnerIdentification.generated.ts +6 -0
  196. package/src/modules/business-partner/command/deletePartnerIdentification.test.ts +47 -0
  197. package/src/modules/business-partner/command/deletePartnerIdentification.ts +37 -0
  198. package/src/modules/business-partner/command/reactivateContactPerson.generated.ts +6 -0
  199. package/src/modules/business-partner/command/reactivateContactPerson.test.ts +48 -0
  200. package/src/modules/business-partner/command/reactivateContactPerson.ts +48 -0
  201. package/src/modules/business-partner/command/reactivatePartner.generated.ts +6 -0
  202. package/src/modules/business-partner/command/reactivatePartner.test.ts +59 -0
  203. package/src/modules/business-partner/command/reactivatePartner.ts +46 -0
  204. package/src/modules/business-partner/command/removeRoleFromPartner.generated.ts +6 -0
  205. package/src/modules/business-partner/command/removeRoleFromPartner.test.ts +82 -0
  206. package/src/modules/business-partner/command/removeRoleFromPartner.ts +73 -0
  207. package/src/modules/business-partner/command/setDefaultPartnerAddress.generated.ts +6 -0
  208. package/src/modules/business-partner/command/setDefaultPartnerAddress.test.ts +60 -0
  209. package/src/modules/business-partner/command/setDefaultPartnerAddress.ts +48 -0
  210. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.generated.ts +6 -0
  211. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.test.ts +56 -0
  212. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.ts +51 -0
  213. package/src/modules/business-partner/command/setPrimaryContactPerson.generated.ts +6 -0
  214. package/src/modules/business-partner/command/setPrimaryContactPerson.test.ts +63 -0
  215. package/src/modules/business-partner/command/setPrimaryContactPerson.ts +55 -0
  216. package/src/modules/business-partner/command/updateContactPerson.generated.ts +6 -0
  217. package/src/modules/business-partner/command/updateContactPerson.test.ts +193 -0
  218. package/src/modules/business-partner/command/updateContactPerson.ts +92 -0
  219. package/src/modules/business-partner/command/updatePartner.generated.ts +6 -0
  220. package/src/modules/business-partner/command/updatePartner.test.ts +101 -0
  221. package/src/modules/business-partner/command/updatePartner.ts +76 -0
  222. package/src/modules/business-partner/command/updatePartnerAddress.generated.ts +6 -0
  223. package/src/modules/business-partner/command/updatePartnerAddress.test.ts +148 -0
  224. package/src/modules/business-partner/command/updatePartnerAddress.ts +64 -0
  225. package/src/modules/business-partner/command/updatePartnerBankAccount.generated.ts +6 -0
  226. package/src/modules/business-partner/command/updatePartnerBankAccount.test.ts +249 -0
  227. package/src/modules/business-partner/command/updatePartnerBankAccount.ts +109 -0
  228. package/src/modules/business-partner/command/updatePartnerIdentification.generated.ts +6 -0
  229. package/src/modules/business-partner/command/updatePartnerIdentification.test.ts +162 -0
  230. package/src/modules/business-partner/command/updatePartnerIdentification.ts +105 -0
  231. package/src/modules/business-partner/db/.gitkeep +0 -0
  232. package/src/modules/business-partner/db/businessPartner.ts +59 -0
  233. package/src/modules/business-partner/db/contactPerson.ts +49 -0
  234. package/src/modules/business-partner/db/partnerAddress.ts +45 -0
  235. package/src/modules/business-partner/db/partnerBankAccount.ts +53 -0
  236. package/src/modules/business-partner/db/partnerIdentification.ts +53 -0
  237. package/src/modules/business-partner/db/partnerRole.ts +43 -0
  238. package/src/modules/business-partner/docs/commands/ActivatePartner.md +39 -0
  239. package/src/modules/business-partner/docs/commands/AssignRoleToPartner.md +49 -0
  240. package/src/modules/business-partner/docs/commands/CreateContactPerson.md +59 -0
  241. package/src/modules/business-partner/docs/commands/CreatePartner.md +54 -0
  242. package/src/modules/business-partner/docs/commands/CreatePartnerAddress.md +60 -0
  243. package/src/modules/business-partner/docs/commands/CreatePartnerBankAccount.md +68 -0
  244. package/src/modules/business-partner/docs/commands/CreatePartnerIdentification.md +59 -0
  245. package/src/modules/business-partner/docs/commands/DeactivateContactPerson.md +42 -0
  246. package/src/modules/business-partner/docs/commands/DeactivatePartner.md +39 -0
  247. package/src/modules/business-partner/docs/commands/DeleteContactPerson.md +43 -0
  248. package/src/modules/business-partner/docs/commands/DeletePartner.md +40 -0
  249. package/src/modules/business-partner/docs/commands/DeletePartnerAddress.md +40 -0
  250. package/src/modules/business-partner/docs/commands/DeletePartnerBankAccount.md +35 -0
  251. package/src/modules/business-partner/docs/commands/DeletePartnerIdentification.md +33 -0
  252. package/src/modules/business-partner/docs/commands/ReactivateContactPerson.md +38 -0
  253. package/src/modules/business-partner/docs/commands/ReactivatePartner.md +39 -0
  254. package/src/modules/business-partner/docs/commands/RemoveRoleFromPartner.md +46 -0
  255. package/src/modules/business-partner/docs/commands/SetDefaultPartnerAddress.md +38 -0
  256. package/src/modules/business-partner/docs/commands/SetDefaultPartnerBankAccount.md +38 -0
  257. package/src/modules/business-partner/docs/commands/SetPrimaryContactPerson.md +43 -0
  258. package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +66 -0
  259. package/src/modules/business-partner/docs/commands/UpdatePartner.md +48 -0
  260. package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +46 -0
  261. package/src/modules/business-partner/docs/commands/UpdatePartnerBankAccount.md +64 -0
  262. package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +52 -0
  263. package/src/modules/business-partner/docs/features/contact-person-management.md +70 -0
  264. package/src/modules/business-partner/docs/features/partner-address-management.md +96 -0
  265. package/src/modules/business-partner/docs/features/partner-bank-account.md +70 -0
  266. package/src/modules/business-partner/docs/features/partner-identification.md +76 -0
  267. package/src/modules/business-partner/docs/features/partner-lifecycle.md +59 -0
  268. package/src/modules/business-partner/docs/features/partner-role-classification.md +73 -0
  269. package/src/modules/business-partner/docs/models/BusinessPartner.md +64 -0
  270. package/src/modules/business-partner/docs/models/ContactPerson.md +62 -0
  271. package/src/modules/business-partner/docs/models/PartnerAddress.md +52 -0
  272. package/src/modules/business-partner/docs/models/PartnerBankAccount.md +50 -0
  273. package/src/modules/business-partner/docs/models/PartnerIdentification.md +46 -0
  274. package/src/modules/business-partner/docs/models/PartnerRole.md +42 -0
  275. package/src/modules/business-partner/docs/queries/GetContactPerson.md +34 -0
  276. package/src/modules/business-partner/docs/queries/GetDefaultPartnerAddress.md +40 -0
  277. package/src/modules/business-partner/docs/queries/GetDefaultPartnerBankAccount.md +36 -0
  278. package/src/modules/business-partner/docs/queries/GetPartner.md +35 -0
  279. package/src/modules/business-partner/docs/queries/GetPartnerAddress.md +34 -0
  280. package/src/modules/business-partner/docs/queries/GetPartnerBankAccount.md +34 -0
  281. package/src/modules/business-partner/docs/queries/GetPartnerIdentification.md +34 -0
  282. package/src/modules/business-partner/docs/queries/GetPartnerRole.md +34 -0
  283. package/src/modules/business-partner/docs/queries/GetPrimaryContactPerson.md +36 -0
  284. package/src/modules/business-partner/docs/queries/ListContactPersonsByPartner.md +39 -0
  285. package/src/modules/business-partner/docs/queries/ListPartnerAddressesByPartner.md +41 -0
  286. package/src/modules/business-partner/docs/queries/ListPartnerBankAccountsByPartner.md +39 -0
  287. package/src/modules/business-partner/docs/queries/ListPartnerIdentificationsByPartner.md +41 -0
  288. package/src/modules/business-partner/docs/queries/ListPartnersByRole.md +47 -0
  289. package/src/modules/business-partner/executor/.gitkeep +0 -0
  290. package/src/modules/business-partner/generated/.gitkeep +0 -0
  291. package/src/modules/business-partner/generated/enums.ts +60 -0
  292. package/src/modules/business-partner/generated/kysely-tailordb.ts +114 -0
  293. package/src/modules/business-partner/index.ts +2 -0
  294. package/src/modules/business-partner/lib/_db_deps.ts +17 -0
  295. package/src/modules/business-partner/lib/errors.generated.ts +172 -0
  296. package/src/modules/business-partner/lib/errors.ts +2 -0
  297. package/src/modules/business-partner/lib/permissions.generated.ts +30 -0
  298. package/src/modules/business-partner/lib/types.ts +53 -0
  299. package/src/modules/business-partner/module.ts +181 -0
  300. package/src/modules/business-partner/permissions.ts +3 -0
  301. package/src/modules/business-partner/query/.gitkeep +0 -0
  302. package/src/modules/business-partner/query/getContactPerson.generated.ts +5 -0
  303. package/src/modules/business-partner/query/getContactPerson.test.ts +31 -0
  304. package/src/modules/business-partner/query/getContactPerson.ts +16 -0
  305. package/src/modules/business-partner/query/getDefaultPartnerAddress.generated.ts +5 -0
  306. package/src/modules/business-partner/query/getDefaultPartnerAddress.test.ts +45 -0
  307. package/src/modules/business-partner/query/getDefaultPartnerAddress.ts +30 -0
  308. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.generated.ts +5 -0
  309. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.test.ts +43 -0
  310. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.ts +17 -0
  311. package/src/modules/business-partner/query/getPartner.generated.ts +5 -0
  312. package/src/modules/business-partner/query/getPartner.test.ts +31 -0
  313. package/src/modules/business-partner/query/getPartner.ts +16 -0
  314. package/src/modules/business-partner/query/getPartnerAddress.generated.ts +5 -0
  315. package/src/modules/business-partner/query/getPartnerAddress.test.ts +31 -0
  316. package/src/modules/business-partner/query/getPartnerAddress.ts +16 -0
  317. package/src/modules/business-partner/query/getPartnerBankAccount.generated.ts +5 -0
  318. package/src/modules/business-partner/query/getPartnerBankAccount.test.ts +31 -0
  319. package/src/modules/business-partner/query/getPartnerBankAccount.ts +16 -0
  320. package/src/modules/business-partner/query/getPartnerIdentification.generated.ts +5 -0
  321. package/src/modules/business-partner/query/getPartnerIdentification.test.ts +31 -0
  322. package/src/modules/business-partner/query/getPartnerIdentification.ts +16 -0
  323. package/src/modules/business-partner/query/getPartnerRole.generated.ts +5 -0
  324. package/src/modules/business-partner/query/getPartnerRole.test.ts +31 -0
  325. package/src/modules/business-partner/query/getPartnerRole.ts +19 -0
  326. package/src/modules/business-partner/query/getPrimaryContactPerson.generated.ts +5 -0
  327. package/src/modules/business-partner/query/getPrimaryContactPerson.test.ts +43 -0
  328. package/src/modules/business-partner/query/getPrimaryContactPerson.ts +17 -0
  329. package/src/modules/business-partner/query/listContactPersonsByPartner.generated.ts +5 -0
  330. package/src/modules/business-partner/query/listContactPersonsByPartner.test.ts +77 -0
  331. package/src/modules/business-partner/query/listContactPersonsByPartner.ts +32 -0
  332. package/src/modules/business-partner/query/listPartnerAddressesByPartner.generated.ts +5 -0
  333. package/src/modules/business-partner/query/listPartnerAddressesByPartner.test.ts +71 -0
  334. package/src/modules/business-partner/query/listPartnerAddressesByPartner.ts +37 -0
  335. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.generated.ts +5 -0
  336. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.test.ts +59 -0
  337. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.ts +32 -0
  338. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.generated.ts +5 -0
  339. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.test.ts +72 -0
  340. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.ts +40 -0
  341. package/src/modules/business-partner/query/listPartnersByRole.generated.ts +5 -0
  342. package/src/modules/business-partner/query/listPartnersByRole.test.ts +103 -0
  343. package/src/modules/business-partner/query/listPartnersByRole.ts +47 -0
  344. package/src/modules/business-partner/tailor.config.ts +13 -0
  345. package/src/modules/business-partner/tailor.d.ts +13 -0
  346. package/src/modules/business-partner/testing/fixtures.ts +204 -0
  347. package/src/modules/coa-management/README.md +61 -0
  348. package/src/modules/coa-management/command/.gitkeep +0 -0
  349. package/src/modules/coa-management/command/activateAccount.generated.ts +6 -0
  350. package/src/modules/coa-management/command/activateAccount.test.ts +125 -0
  351. package/src/modules/coa-management/command/activateAccount.ts +105 -0
  352. package/src/modules/coa-management/command/activateChartOfAccounts.generated.ts +6 -0
  353. package/src/modules/coa-management/command/activateChartOfAccounts.test.ts +113 -0
  354. package/src/modules/coa-management/command/activateChartOfAccounts.ts +104 -0
  355. package/src/modules/coa-management/command/createAccount.generated.ts +6 -0
  356. package/src/modules/coa-management/command/createAccount.test.ts +767 -0
  357. package/src/modules/coa-management/command/createAccount.ts +247 -0
  358. package/src/modules/coa-management/command/createAccountGroup.generated.ts +6 -0
  359. package/src/modules/coa-management/command/createAccountGroup.test.ts +494 -0
  360. package/src/modules/coa-management/command/createAccountGroup.ts +207 -0
  361. package/src/modules/coa-management/command/createChartOfAccounts.generated.ts +6 -0
  362. package/src/modules/coa-management/command/createChartOfAccounts.test.ts +502 -0
  363. package/src/modules/coa-management/command/createChartOfAccounts.ts +267 -0
  364. package/src/modules/coa-management/command/deactivateAccount.generated.ts +6 -0
  365. package/src/modules/coa-management/command/deactivateAccount.test.ts +199 -0
  366. package/src/modules/coa-management/command/deactivateAccount.ts +142 -0
  367. package/src/modules/coa-management/command/deactivateChartOfAccounts.generated.ts +6 -0
  368. package/src/modules/coa-management/command/deactivateChartOfAccounts.test.ts +91 -0
  369. package/src/modules/coa-management/command/deactivateChartOfAccounts.ts +88 -0
  370. package/src/modules/coa-management/command/deleteAccount.generated.ts +6 -0
  371. package/src/modules/coa-management/command/deleteAccount.test.ts +122 -0
  372. package/src/modules/coa-management/command/deleteAccount.ts +103 -0
  373. package/src/modules/coa-management/command/deleteAccountGroup.generated.ts +6 -0
  374. package/src/modules/coa-management/command/deleteAccountGroup.test.ts +120 -0
  375. package/src/modules/coa-management/command/deleteAccountGroup.ts +113 -0
  376. package/src/modules/coa-management/command/deleteChartOfAccounts.generated.ts +6 -0
  377. package/src/modules/coa-management/command/deleteChartOfAccounts.test.ts +154 -0
  378. package/src/modules/coa-management/command/deleteChartOfAccounts.ts +133 -0
  379. package/src/modules/coa-management/command/moveAccountGroup.generated.ts +6 -0
  380. package/src/modules/coa-management/command/moveAccountGroup.test.ts +199 -0
  381. package/src/modules/coa-management/command/moveAccountGroup.ts +145 -0
  382. package/src/modules/coa-management/command/reactivateAccount.generated.ts +6 -0
  383. package/src/modules/coa-management/command/reactivateAccount.test.ts +126 -0
  384. package/src/modules/coa-management/command/reactivateAccount.ts +123 -0
  385. package/src/modules/coa-management/command/updateAccount.generated.ts +6 -0
  386. package/src/modules/coa-management/command/updateAccount.test.ts +669 -0
  387. package/src/modules/coa-management/command/updateAccount.ts +370 -0
  388. package/src/modules/coa-management/command/updateAccountGroup.generated.ts +6 -0
  389. package/src/modules/coa-management/command/updateAccountGroup.test.ts +253 -0
  390. package/src/modules/coa-management/command/updateAccountGroup.ts +191 -0
  391. package/src/modules/coa-management/command/updateChartOfAccounts.generated.ts +6 -0
  392. package/src/modules/coa-management/command/updateChartOfAccounts.test.ts +153 -0
  393. package/src/modules/coa-management/command/updateChartOfAccounts.ts +133 -0
  394. package/src/modules/coa-management/db/.gitkeep +0 -0
  395. package/src/modules/coa-management/db/account.ts +119 -0
  396. package/src/modules/coa-management/db/accountGroup.ts +57 -0
  397. package/src/modules/coa-management/db/chartOfAccounts.ts +55 -0
  398. package/src/modules/coa-management/docs/commands/ActivateAccount.md +49 -0
  399. package/src/modules/coa-management/docs/commands/ActivateChartOfAccounts.md +47 -0
  400. package/src/modules/coa-management/docs/commands/CreateAccount.md +94 -0
  401. package/src/modules/coa-management/docs/commands/CreateAccountGroup.md +70 -0
  402. package/src/modules/coa-management/docs/commands/CreateChartOfAccounts.md +72 -0
  403. package/src/modules/coa-management/docs/commands/DeactivateAccount.md +65 -0
  404. package/src/modules/coa-management/docs/commands/DeactivateChartOfAccounts.md +44 -0
  405. package/src/modules/coa-management/docs/commands/DeleteAccount.md +52 -0
  406. package/src/modules/coa-management/docs/commands/DeleteAccountGroup.md +50 -0
  407. package/src/modules/coa-management/docs/commands/DeleteChartOfAccounts.md +48 -0
  408. package/src/modules/coa-management/docs/commands/MoveAccountGroup.md +57 -0
  409. package/src/modules/coa-management/docs/commands/ReactivateAccount.md +50 -0
  410. package/src/modules/coa-management/docs/commands/UpdateAccount.md +102 -0
  411. package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +62 -0
  412. package/src/modules/coa-management/docs/commands/UpdateChartOfAccounts.md +49 -0
  413. package/src/modules/coa-management/docs/features/account-group-hierarchy.md +81 -0
  414. package/src/modules/coa-management/docs/features/account-lifecycle.md +80 -0
  415. package/src/modules/coa-management/docs/features/account-management.md +114 -0
  416. package/src/modules/coa-management/docs/features/chart-of-accounts-setup.md +86 -0
  417. package/src/modules/coa-management/docs/models/Account.md +84 -0
  418. package/src/modules/coa-management/docs/models/AccountGroup.md +55 -0
  419. package/src/modules/coa-management/docs/models/ChartOfAccounts.md +65 -0
  420. package/src/modules/coa-management/docs/queries/DetectCircularReference.md +52 -0
  421. package/src/modules/coa-management/docs/queries/GetAccount.md +42 -0
  422. package/src/modules/coa-management/docs/queries/GetAccountGroup.md +42 -0
  423. package/src/modules/coa-management/docs/queries/GetChartOfAccounts.md +48 -0
  424. package/src/modules/coa-management/docs/queries/ListAccountGroups.md +42 -0
  425. package/src/modules/coa-management/docs/queries/ListAccounts.md +54 -0
  426. package/src/modules/coa-management/docs/queries/ListUnassignedAccounts.md +40 -0
  427. package/src/modules/coa-management/executor/.gitkeep +0 -0
  428. package/src/modules/coa-management/generated/.gitkeep +0 -0
  429. package/src/modules/coa-management/generated/enums.ts +45 -0
  430. package/src/modules/coa-management/generated/kysely-tailordb.ts +81 -0
  431. package/src/modules/coa-management/index.ts +2 -0
  432. package/src/modules/coa-management/lib/_db_deps.ts +17 -0
  433. package/src/modules/coa-management/lib/errors.generated.ts +162 -0
  434. package/src/modules/coa-management/lib/errors.ts +0 -0
  435. package/src/modules/coa-management/lib/permissions.generated.ts +20 -0
  436. package/src/modules/coa-management/lib/types.ts +22 -0
  437. package/src/modules/coa-management/module.ts +136 -0
  438. package/src/modules/coa-management/permissions.ts +3 -0
  439. package/src/modules/coa-management/query/.gitkeep +0 -0
  440. package/src/modules/coa-management/query/detectCircularReference.generated.ts +5 -0
  441. package/src/modules/coa-management/query/detectCircularReference.test.ts +88 -0
  442. package/src/modules/coa-management/query/detectCircularReference.ts +46 -0
  443. package/src/modules/coa-management/query/getAccount.generated.ts +5 -0
  444. package/src/modules/coa-management/query/getAccount.test.ts +55 -0
  445. package/src/modules/coa-management/query/getAccount.ts +25 -0
  446. package/src/modules/coa-management/query/getAccountGroup.generated.ts +5 -0
  447. package/src/modules/coa-management/query/getAccountGroup.test.ts +55 -0
  448. package/src/modules/coa-management/query/getAccountGroup.ts +25 -0
  449. package/src/modules/coa-management/query/getChartOfAccounts.generated.ts +5 -0
  450. package/src/modules/coa-management/query/getChartOfAccounts.test.ts +79 -0
  451. package/src/modules/coa-management/query/getChartOfAccounts.ts +28 -0
  452. package/src/modules/coa-management/query/listAccountGroups.generated.ts +5 -0
  453. package/src/modules/coa-management/query/listAccountGroups.test.ts +72 -0
  454. package/src/modules/coa-management/query/listAccountGroups.ts +49 -0
  455. package/src/modules/coa-management/query/listAccounts.generated.ts +5 -0
  456. package/src/modules/coa-management/query/listAccounts.test.ts +136 -0
  457. package/src/modules/coa-management/query/listAccounts.ts +82 -0
  458. package/src/modules/coa-management/query/listUnassignedAccounts.generated.ts +5 -0
  459. package/src/modules/coa-management/query/listUnassignedAccounts.test.ts +96 -0
  460. package/src/modules/coa-management/query/listUnassignedAccounts.ts +39 -0
  461. package/src/modules/coa-management/tailor.config.ts +13 -0
  462. package/src/modules/coa-management/tailor.d.ts +13 -0
  463. package/src/modules/coa-management/testing/fixtures.ts +201 -0
  464. package/src/modules/item-management/README.md +1 -1
  465. package/src/modules/organization/README.md +57 -0
  466. package/src/modules/organization/command/.gitkeep +0 -0
  467. package/src/modules/organization/command/activateCompany.generated.ts +6 -0
  468. package/src/modules/organization/command/activateCompany.test.ts +184 -0
  469. package/src/modules/organization/command/activateCompany.ts +92 -0
  470. package/src/modules/organization/command/createCompany.generated.ts +6 -0
  471. package/src/modules/organization/command/createCompany.test.ts +156 -0
  472. package/src/modules/organization/command/createCompany.ts +80 -0
  473. package/src/modules/organization/command/createDepartment.generated.ts +6 -0
  474. package/src/modules/organization/command/createDepartment.test.ts +239 -0
  475. package/src/modules/organization/command/createDepartment.ts +98 -0
  476. package/src/modules/organization/command/createSite.generated.ts +6 -0
  477. package/src/modules/organization/command/createSite.test.ts +262 -0
  478. package/src/modules/organization/command/createSite.ts +155 -0
  479. package/src/modules/organization/command/deactivateCompany.generated.ts +6 -0
  480. package/src/modules/organization/command/deactivateCompany.test.ts +58 -0
  481. package/src/modules/organization/command/deactivateCompany.ts +47 -0
  482. package/src/modules/organization/command/deactivateDepartment.generated.ts +6 -0
  483. package/src/modules/organization/command/deactivateDepartment.test.ts +115 -0
  484. package/src/modules/organization/command/deactivateDepartment.ts +63 -0
  485. package/src/modules/organization/command/deactivateSite.generated.ts +6 -0
  486. package/src/modules/organization/command/deactivateSite.test.ts +53 -0
  487. package/src/modules/organization/command/deactivateSite.ts +47 -0
  488. package/src/modules/organization/command/deleteCompany.generated.ts +6 -0
  489. package/src/modules/organization/command/deleteCompany.test.ts +99 -0
  490. package/src/modules/organization/command/deleteCompany.ts +66 -0
  491. package/src/modules/organization/command/reactivateCompany.generated.ts +6 -0
  492. package/src/modules/organization/command/reactivateCompany.test.ts +58 -0
  493. package/src/modules/organization/command/reactivateCompany.ts +47 -0
  494. package/src/modules/organization/command/reactivateDepartment.generated.ts +6 -0
  495. package/src/modules/organization/command/reactivateDepartment.test.ts +59 -0
  496. package/src/modules/organization/command/reactivateDepartment.ts +47 -0
  497. package/src/modules/organization/command/reactivateSite.generated.ts +6 -0
  498. package/src/modules/organization/command/reactivateSite.test.ts +53 -0
  499. package/src/modules/organization/command/reactivateSite.ts +47 -0
  500. package/src/modules/organization/command/updateCompany.generated.ts +6 -0
  501. package/src/modules/organization/command/updateCompany.test.ts +239 -0
  502. package/src/modules/organization/command/updateCompany.ts +127 -0
  503. package/src/modules/organization/command/updateDepartment.generated.ts +6 -0
  504. package/src/modules/organization/command/updateDepartment.test.ts +232 -0
  505. package/src/modules/organization/command/updateDepartment.ts +120 -0
  506. package/src/modules/organization/command/updateSite.generated.ts +6 -0
  507. package/src/modules/organization/command/updateSite.test.ts +274 -0
  508. package/src/modules/organization/command/updateSite.ts +176 -0
  509. package/src/modules/organization/db/.gitkeep +0 -0
  510. package/src/modules/organization/db/company.ts +44 -0
  511. package/src/modules/organization/db/department.ts +46 -0
  512. package/src/modules/organization/db/site.ts +44 -0
  513. package/src/modules/organization/docs/commands/ActivateCompany.md +62 -0
  514. package/src/modules/organization/docs/commands/CreateCompany.md +49 -0
  515. package/src/modules/organization/docs/commands/CreateDepartment.md +62 -0
  516. package/src/modules/organization/docs/commands/CreateSite.md +74 -0
  517. package/src/modules/organization/docs/commands/DeactivateCompany.md +40 -0
  518. package/src/modules/organization/docs/commands/DeactivateDepartment.md +44 -0
  519. package/src/modules/organization/docs/commands/DeactivateSite.md +38 -0
  520. package/src/modules/organization/docs/commands/DeleteCompany.md +50 -0
  521. package/src/modules/organization/docs/commands/ReactivateCompany.md +39 -0
  522. package/src/modules/organization/docs/commands/ReactivateDepartment.md +37 -0
  523. package/src/modules/organization/docs/commands/ReactivateSite.md +37 -0
  524. package/src/modules/organization/docs/commands/UpdateCompany.md +58 -0
  525. package/src/modules/organization/docs/commands/UpdateDepartment.md +64 -0
  526. package/src/modules/organization/docs/commands/UpdateSite.md +80 -0
  527. package/src/modules/organization/docs/features/company-lifecycle.md +76 -0
  528. package/src/modules/organization/docs/features/department-management.md +66 -0
  529. package/src/modules/organization/docs/features/site-management.md +86 -0
  530. package/src/modules/organization/docs/models/Company.md +60 -0
  531. package/src/modules/organization/docs/models/Department.md +57 -0
  532. package/src/modules/organization/docs/models/Site.md +57 -0
  533. package/src/modules/organization/docs/queries/DetectDepartmentCircularReference.md +50 -0
  534. package/src/modules/organization/docs/queries/GetCompany.md +40 -0
  535. package/src/modules/organization/docs/queries/GetDepartment.md +44 -0
  536. package/src/modules/organization/docs/queries/GetDepartmentChildren.md +40 -0
  537. package/src/modules/organization/docs/queries/GetSite.md +37 -0
  538. package/src/modules/organization/docs/queries/ListDepartmentsByCompany.md +54 -0
  539. package/src/modules/organization/docs/queries/ListSitesByCompany.md +54 -0
  540. package/src/modules/organization/executor/.gitkeep +0 -0
  541. package/src/modules/organization/generated/.gitkeep +0 -0
  542. package/src/modules/organization/generated/kysely-tailordb.ts +77 -0
  543. package/src/modules/organization/index.ts +2 -0
  544. package/src/modules/organization/lib/_db_deps.ts +10 -0
  545. package/src/modules/organization/lib/errors.generated.ts +117 -0
  546. package/src/modules/organization/lib/errors.ts +1 -0
  547. package/src/modules/organization/lib/permissions.generated.ts +19 -0
  548. package/src/modules/organization/lib/types.ts +16 -0
  549. package/src/modules/organization/module.ts +89 -0
  550. package/src/modules/organization/permissions.ts +3 -0
  551. package/src/modules/organization/query/.gitkeep +0 -0
  552. package/src/modules/organization/query/detectDepartmentCircularReference.generated.ts +5 -0
  553. package/src/modules/organization/query/detectDepartmentCircularReference.test.ts +102 -0
  554. package/src/modules/organization/query/detectDepartmentCircularReference.ts +27 -0
  555. package/src/modules/organization/query/getCompany.generated.ts +5 -0
  556. package/src/modules/organization/query/getCompany.test.ts +70 -0
  557. package/src/modules/organization/query/getCompany.ts +16 -0
  558. package/src/modules/organization/query/getDepartment.generated.ts +5 -0
  559. package/src/modules/organization/query/getDepartment.test.ts +85 -0
  560. package/src/modules/organization/query/getDepartment.ts +17 -0
  561. package/src/modules/organization/query/getDepartmentChildren.generated.ts +5 -0
  562. package/src/modules/organization/query/getDepartmentChildren.test.ts +75 -0
  563. package/src/modules/organization/query/getDepartmentChildren.ts +21 -0
  564. package/src/modules/organization/query/getSite.generated.ts +5 -0
  565. package/src/modules/organization/query/getSite.test.ts +55 -0
  566. package/src/modules/organization/query/getSite.ts +16 -0
  567. package/src/modules/organization/query/listDepartmentsByCompany.generated.ts +5 -0
  568. package/src/modules/organization/query/listDepartmentsByCompany.test.ts +124 -0
  569. package/src/modules/organization/query/listDepartmentsByCompany.ts +43 -0
  570. package/src/modules/organization/query/listSitesByCompany.generated.ts +5 -0
  571. package/src/modules/organization/query/listSitesByCompany.test.ts +126 -0
  572. package/src/modules/organization/query/listSitesByCompany.ts +41 -0
  573. package/src/modules/organization/tailor.config.ts +13 -0
  574. package/src/modules/organization/tailor.d.ts +13 -0
  575. package/src/modules/organization/testing/fixtures.ts +155 -0
  576. package/src/modules/primitives/README.md +1 -1
  577. package/src/modules/primitives/command/setBaseCurrency.test.ts +8 -64
  578. package/src/modules/primitives/command/setBaseCurrency.ts +6 -64
  579. package/src/modules/primitives/docs/commands/ActivateCategory.md +1 -1
  580. package/src/modules/primitives/docs/commands/ActivateCurrency.md +1 -1
  581. package/src/modules/primitives/docs/commands/ActivateUnit.md +1 -1
  582. package/src/modules/primitives/docs/commands/CreateExchangeRate.md +2 -2
  583. package/src/modules/primitives/docs/commands/CreateUnit.md +1 -1
  584. package/src/modules/primitives/docs/commands/DeactivateCategory.md +1 -1
  585. package/src/modules/primitives/docs/commands/DeactivateCurrency.md +1 -1
  586. package/src/modules/primitives/docs/commands/DeactivateUnit.md +1 -1
  587. package/src/modules/primitives/docs/commands/SetBaseCurrency.md +13 -23
  588. package/src/modules/primitives/docs/commands/SetReferenceUnit.md +1 -1
  589. package/src/modules/primitives/docs/features/currency-definitions.md +13 -14
  590. package/src/modules/primitives/docs/models/Currency.md +3 -4
  591. package/src/modules/primitives/docs/queries/ConvertAmount.md +2 -2
  592. package/src/modules/primitives/docs/queries/ConvertQuantity.md +2 -2
  593. package/src/modules/primitives/lib/errors.generated.ts +5 -0
  594. package/src/modules/product-management/README.md +1 -1
  595. package/src/modules/user-management/docs/commands/CreatePermission.md +3 -3
  596. package/src/modules/user-management/docs/commands/CreateRole.md +1 -1
  597. package/src/modules/user-management/docs/queries/ListRolePermissionsByRole.md +39 -0
  598. package/src/modules/user-management/docs/queries/ListUserRolesByUser.md +39 -0
  599. package/src/modules/user-management/generated/enums.ts +0 -15
  600. package/src/modules/user-management/generated/kysely-tailordb.ts +0 -11
  601. package/src/shared/createContext.ts +2 -1
  602. package/src/shared/defineQuery.ts +36 -1
  603. package/src/shared/requirePermission.ts +3 -3
  604. package/src/shared/types.ts +3 -0
  605. package/templates/scaffold/app/backend/package.json +4 -3
  606. package/templates/scaffold/app/frontend/eslint.config.js +12 -0
  607. package/templates/scaffold/app/frontend/package.json +10 -7
  608. package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +30 -0
  609. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +3 -2
  610. package/templates/scaffold/app/frontend/vite.config.ts +5 -5
  611. package/src/commands/module/list.test.ts +0 -57
  612. package/src/commands/module/list.ts +0 -64
  613. /package/src/modules/{accounting → audit/db}/.gitkeep +0 -0
  614. /package/src/modules/audit/{.gitkeep → executor/.gitkeep} +0 -0
  615. /package/src/modules/{coa-management/.gitkeep → audit/lib/errors.ts} +0 -0
  616. /package/src/modules/{supplier-management → business-partner}/.gitkeep +0 -0
@@ -0,0 +1,64 @@
1
+ # UpdateDepartment
2
+
3
+ ## Overview
4
+
5
+ UpdateDepartment modifies the name or parent department of an existing department. The department code and company are immutable. Parent department changes are validated to prevent self-references and circular hierarchies. Updating is allowed on both ACTIVE and INACTIVE departments.
6
+
7
+ This command supports organizational restructuring and department renaming.
8
+
9
+ ## Business Rules
10
+
11
+ - Department must exist
12
+ - Name, if provided, must be non-empty
13
+ - Department code cannot be changed
14
+ - companyId cannot be changed
15
+ - Parent department, if provided, must exist and belong to the same company
16
+ - A department cannot reference itself as its own parent
17
+ - Circular parent references are rejected
18
+ - Updating parent department is allowed on both ACTIVE and INACTIVE departments
19
+
20
+ ## Process Flow
21
+
22
+ ```mermaid
23
+ flowchart TD
24
+ A[Receive update request] --> B{Department exists?}
25
+ B -->|No| C[Return error: DEPARTMENT_NOT_FOUND]
26
+ B -->|Yes| D{Name provided and empty?}
27
+ D -->|Yes| E[Return error: INVALID_NAME]
28
+ D -->|No| F{Parent change requested?}
29
+ F -->|Yes| G{Self-reference?}
30
+ G -->|Yes| H[Return error: SELF_REFERENCE]
31
+ G -->|No| I{Parent exists in same company?}
32
+ I -->|No| J[Return error: PARENT_NOT_FOUND]
33
+ I -->|Yes| K{Circular reference?}
34
+ K -->|Yes| L[Return error: CIRCULAR_REFERENCE]
35
+ K -->|No| M[Update department record]
36
+ F -->|No| M
37
+ M --> N[Return updated department]
38
+ ```
39
+
40
+ ## External Dependencies
41
+
42
+ - [organization::detectDepartmentCircularReference](../queries/DetectDepartmentCircularReference.md) - Validates that reparenting would not create a cycle
43
+
44
+ ## Error Scenarios
45
+
46
+ - **DEPARTMENT_NOT_FOUND**: Specified department ID does not exist
47
+ - **INVALID_NAME**: Department name is empty
48
+ - **SELF_REFERENCE**: Department references itself as parent
49
+ - **PARENT_NOT_FOUND**: Referenced parent department does not exist or belongs to a different company
50
+ - **CIRCULAR_REFERENCE**: Reparenting would create a circular hierarchy
51
+
52
+ ## Test Cases
53
+
54
+ - updates department name
55
+ - updates parent department
56
+ - removes parent department (promotes to top-level)
57
+ - throws when department does not exist
58
+ - throws when name is empty
59
+ - throws when name is whitespace-only
60
+ - throws when setting self as parent
61
+ - throws when parent does not exist
62
+ - throws when parent belongs to different company
63
+ - throws when reparenting creates circular reference
64
+ - updates parent on INACTIVE department
@@ -0,0 +1,80 @@
1
+ # UpdateSite
2
+
3
+ ## Overview
4
+
5
+ UpdateSite modifies fields on an existing site. Updatable fields include name, type, address fields, country, and timezone. The companyId is immutable after creation. Updating is permitted on both ACTIVE and INACTIVE sites.
6
+
7
+ This command supports address corrections, type reclassification, and timezone updates.
8
+
9
+ ## Business Rules
10
+
11
+ - Site must exist
12
+ - Name, if provided, must be non-empty
13
+ - Name, if changed, must remain unique within the same company
14
+ - Type, if provided, must be one of the allowed classifications
15
+ - companyId cannot be changed
16
+ - Timezone, if provided, must be a valid IANA timezone identifier
17
+ - Country, if provided, must reference a valid country code
18
+ - Address fields can be individually updated
19
+ - Required address fields (street, city, postalCode, country), if provided, must be non-empty
20
+ - State/province is optional and may be set or cleared
21
+ - Updating is allowed on both ACTIVE and INACTIVE sites
22
+
23
+ ## Process Flow
24
+
25
+ ```mermaid
26
+ flowchart TD
27
+ A[Receive update request] --> B{Site exists?}
28
+ B -->|No| C[Return error: SITE_NOT_FOUND]
29
+ B -->|Yes| D{Name provided and empty?}
30
+ D -->|Yes| E[Return error: INVALID_NAME]
31
+ D -->|No| F{Name changed?}
32
+ F -->|Yes| G{Name unique in company?}
33
+ G -->|No| H[Return error: DUPLICATE_NAME]
34
+ G -->|Yes| I{Type valid?}
35
+ F -->|No| I
36
+ I -->|Invalid| J[Return error: INVALID_TYPE]
37
+ I -->|Valid or unchanged| I2{Required address field set to empty?}
38
+ I2 -->|Yes| I3[Return error: MISSING_REQUIRED_FIELDS]
39
+ I2 -->|No| K{Country valid?}
40
+ K -->|Invalid| K2[Return error: INVALID_COUNTRY]
41
+ K -->|Valid or unchanged| L{Timezone valid?}
42
+ L -->|Invalid| L2[Return error: INVALID_TIMEZONE]
43
+ L -->|Valid or unchanged| M[Update site record]
44
+ M --> N[Return updated site]
45
+ ```
46
+
47
+ ## External Dependencies
48
+
49
+ - None
50
+
51
+ ## Error Scenarios
52
+
53
+ - **SITE_NOT_FOUND**: Specified site ID does not exist
54
+ - **INVALID_NAME**: Site name is empty
55
+ - **DUPLICATE_NAME**: Site with same name already exists in the same company
56
+ - **INVALID_TYPE**: Site type is not one of the allowed classifications
57
+ - **MISSING_REQUIRED_FIELDS**: A required address field (street, city, postalCode, or country) was set to empty
58
+ - **INVALID_COUNTRY**: Country code is not a valid country code
59
+ - **INVALID_TIMEZONE**: Timezone is not a valid IANA timezone identifier
60
+
61
+ ## Test Cases
62
+
63
+ - updates site name
64
+ - updates site address fields
65
+ - updates site type
66
+ - updates site timezone
67
+ - throws when site does not exist
68
+ - throws when name is empty
69
+ - throws when name already exists in same company
70
+ - throws when type is invalid
71
+ - throws when country code is invalid
72
+ - throws when timezone is invalid
73
+ - updates site country
74
+ - throws when street is set to empty
75
+ - throws when city is set to empty
76
+ - throws when postalCode is set to empty
77
+ - throws when country is set to empty
78
+ - updates state/province field
79
+ - clears state/province field
80
+ - updates address fields on INACTIVE site
@@ -0,0 +1,76 @@
1
+ # Company Lifecycle
2
+
3
+ ## Overview
4
+
5
+ Companies are the root organizational entity in the Organization module. A company represents a legal entity — identified by its legal name, tax identification number, and registration number, along with its registered address and base currency assignment. Companies serve as the scoping entity for all transactional modules; every accounting entry, sales order, purchase order, and inventory movement belongs to exactly one company. Each company has a lifecycle state machine (DRAFT → ACTIVE ↔ INACTIVE) that controls when transactional operations and downstream module integrations are permitted. Fiscal calendar management (fiscal year, periods, cutoff dates) is owned by the accounting module — organization only provides the structural identity that accounting attaches fiscal configuration to.
6
+
7
+ ## Business Purpose
8
+
9
+ Companies model real-world legal entities that enter contracts, hold tax identities, and prepare financial statements. This enables:
10
+
11
+ - Multi-company support with data isolation: each transactional record is scoped by companyId
12
+ - Separation of legal entity setup from day-to-day operations — companies are fully configured before going live
13
+ - Assignment of a base/functional currency per company (referencing the primitives module's Currency), ensuring consistent monetary calculations. Currency master data (ISO codes, symbols, exchange rates) is owned by the primitives module; organization only stores which currency a company uses as its base currency
14
+
15
+ The lifecycle ensures:
16
+
17
+ - Companies are reviewed and fully configured before downstream modules can reference them (DRAFT → ACTIVE). Activation means the structural identity (legal name, tax ID, registered address, base currency) is complete — it does not imply transactional readiness. Downstream master-data modules (e.g., CoA management) and transactional modules each enforce their own readiness gates on top of company ACTIVE status
18
+ - Inactive companies stop accepting new transactions while preserving all historical data
19
+ - Only DRAFT companies can be permanently deleted; ACTIVE/INACTIVE companies are preserved for audit and legal compliance
20
+
21
+ ## Process Flow
22
+
23
+ ```mermaid
24
+ stateDiagram-v2
25
+ [*] --> Draft: createCompany
26
+ Draft --> Active: activateCompany
27
+ Active --> Inactive: deactivateCompany
28
+ Inactive --> Active: reactivateCompany
29
+ Draft --> [*]: deleteCompany
30
+ ```
31
+
32
+ The company creation and setup flow follows this pattern:
33
+
34
+ ```mermaid
35
+ flowchart TD
36
+ A[Create Company] --> B[Set Legal Details]
37
+ B --> C[Configure Registered Address]
38
+ C --> D[Assign Base Currency]
39
+ D --> E{Ready to go live?}
40
+ E -->|Yes| F[Activate Company]
41
+ E -->|No| G[Continue editing]
42
+ G --> B
43
+ F --> H[Available for Transactions]
44
+ ```
45
+
46
+ ## Scenario Patterns
47
+
48
+ - **New Company Setup**: A company is created in DRAFT with its legal name and tax identification number. The registered address and base currency are configured, then the company is activated to confirm its structural identity is complete. After activation, master-data modules (e.g., CoA management) can begin building financial configuration on top of the company. Transactional readiness (e.g., journal posting) requires additional setup: an active Chart of Accounts and fiscal calendar configuration
49
+ - **Company Deactivation**: A legal entity ceases operations. The company moves to INACTIVE status, preventing new transactions from being created against it, but all historical records remain accessible for reporting and audit
50
+ - **Company Reactivation**: A previously inactive company resumes operations and is reactivated, allowing new transactions to be recorded against it
51
+ - **Draft Cleanup**: Incomplete company records in DRAFT are deleted before activation when a planned legal entity is no longer needed
52
+ - **Multi-Company Expansion**: A new subsidiary is added to the system as a separate company with its own base currency, enabling consolidated reporting across legal entities. Fiscal calendar for the subsidiary is configured independently via the accounting module
53
+
54
+ ## Test Cases
55
+
56
+ - Company lifecycle follows DRAFT → ACTIVE ↔ INACTIVE state machine
57
+ - Companies can only be created in DRAFT status
58
+ - Only DRAFT companies can be deleted; ACTIVE and INACTIVE companies cannot
59
+ - Legal name is required and must be non-empty
60
+ - Tax identification number is stored and queryable per company
61
+ - Registration number is stored per company
62
+ - Base currency is optional at creation but must be set and reference a valid Currency from the primitives module before activation
63
+ - Base currency is immutable after activation to preserve transactional consistency
64
+ - Registered address fields are required before activation
65
+ - Activating a company without required fields (legal name, base currency, registered address) is rejected
66
+ - Deactivating a company does not affect existing historical transactions
67
+ - Reactivating an INACTIVE company returns it to ACTIVE status
68
+ - Each company has a unique companyId used for data isolation across transactional modules
69
+ - Deleting an ACTIVE or INACTIVE company returns an error
70
+
71
+ ## Reference Links
72
+
73
+ - [SAP Business One Company Setup](https://help.sap.com/docs/SAP_BUSINESS_ONE)
74
+ - [Odoo Multi-Company](https://www.odoo.com/documentation/19.0/applications/general/companies.html)
75
+ - [Dynamics 365 Legal Entities](https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/fin-ops/organization-administration/plan-organizational-hierarchy)
76
+ - [Oracle Financials Legal Entity Configuration](https://docs.oracle.com/en/cloud/saas/financials/24d/faigl/legal-entities.html)
@@ -0,0 +1,66 @@
1
+ # Department Management
2
+
3
+ ## Overview
4
+
5
+ Departments represent functional organizational units within a company — such as Sales, Engineering, Finance, and Human Resources. Each department belongs to exactly one company and is identified by a unique code scoped to that company. Departments form a self-referential hierarchy through an optional parent department reference, enabling the modeling of organizational trees (e.g., Engineering > Backend Engineering > Platform Team). Each department carries a lifecycle state of ACTIVE or INACTIVE and a human-readable name. Departments serve as the primary structural unit for grouping business functions and are referenced by downstream modules. Manager assignment is owned by a future HR/employee module where the manager is an employee/worker reference, not a login identity.
6
+
7
+ ## Business Purpose
8
+
9
+ Departments provide the foundational organizational structure that other modules build upon. This enables:
10
+
11
+ - Modeling the functional structure of a company as a hierarchical tree
12
+ - Scoping operational data (budgets, headcount, approvals) to specific organizational units
13
+ - Deactivating departments that are no longer in use without losing historical references
14
+ - Enforcing unique department codes per company for reliable cross-system integration
15
+
16
+ ## Process Flow
17
+
18
+ ```mermaid
19
+ flowchart TD
20
+ A[Create Department] --> B{Has parent?}
21
+ B -->|Yes| C[Set parent department]
22
+ B -->|No| D[Top-level department]
23
+ C --> E[Department ACTIVE]
24
+ D --> E
25
+ E --> F{Restructure needed?}
26
+ F -->|Reassign parent| G[Update parent reference]
27
+ G --> E
28
+ F -->|No longer needed| H{Has active sub-departments?}
29
+ H -->|Yes| I[Block deactivation]
30
+ I --> F
31
+ H -->|No| J[Deactivate Department]
32
+ J --> K[Department INACTIVE]
33
+ K --> L{Reactivate?}
34
+ L -->|Yes| E
35
+ L -->|No| M[Remains INACTIVE]
36
+ ```
37
+
38
+ ## Scenario Patterns
39
+
40
+ - **Initial Org Structure Setup**: A company is created and its top-level departments (Sales, Engineering, Finance, HR) are added as ACTIVE departments with no parent. Sub-departments are then created beneath them to reflect the real organizational hierarchy.
41
+ - **Department Restructuring**: A reorganization moves the "DevOps" department from under "Engineering" to under "Infrastructure" by updating its parent department reference. All sub-departments of DevOps move with it implicitly through the hierarchy.
42
+ - **Department Deactivation**: The "Legacy Products" department is no longer needed. After confirming it has no active sub-departments, it is set to INACTIVE. Historical records that reference this department remain intact.
43
+ - **Department Reactivation**: A previously deactivated "Partnerships" department is reactivated when the company re-enters a market segment, restoring it to ACTIVE status for new assignments.
44
+ - **Cross-Company Isolation**: Two companies in the same tenant each have a department with code "ENG". The codes are unique per company but do not conflict across companies.
45
+
46
+ ## Test Cases
47
+
48
+ - A department is created in ACTIVE status by default
49
+ - Department code is required, unique per company, and immutable after creation
50
+ - Department name is required and must be non-empty
51
+ - A department must reference an existing, valid company
52
+ - Setting a parent department creates a hierarchical relationship
53
+ - A department cannot reference itself as its own parent
54
+ - A department cannot be deactivated while it has active sub-departments
55
+ - Deactivating a department sets its state to INACTIVE
56
+ - Reactivating an INACTIVE department sets its state to ACTIVE
57
+ - Updating a department's parent department is allowed on both ACTIVE and INACTIVE departments
58
+ - Department codes from different companies do not conflict (company-scoped uniqueness)
59
+ - Circular parent references are rejected (A -> B -> C -> A)
60
+ - Deleting a company is restricted (rejected) if it has existing department references
61
+
62
+ ## Reference Links
63
+
64
+ - [SAP Organizational Units](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/5765fa03d4c34ae7b8965e7a41d7c077/af204256a1f84457b2c3f16825e6af89.html)
65
+ - [Odoo Departments (HR)](https://www.odoo.com/documentation/19.0/applications/hr/employees/departments.html)
66
+ - [Dynamics 365 Operating Units](https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/fin-ops/organization-administration/organizations-organizational-hierarchies)
@@ -0,0 +1,86 @@
1
+ # Site Management
2
+
3
+ ## Overview
4
+
5
+ Sites represent physical facilities owned or operated by a company — offices, warehouses, stores, factories, and distribution centers. Each site is scoped to a single company (companyId) and stores a structured address (street, city, postalCode, country, and optional state/province), a type classification, timezone, and a lifecycle state. Sites provide the geographic foundation that downstream modules depend on: inventory uses sites to determine where stock is held, sales and purchasing reference sites for ship-from and ship-to addresses, and tax modules reference sites for jurisdiction determination.
6
+
7
+ Unlike business-partner addresses (which represent external parties' billing and shipping details), sites model company-owned facilities only. The organization module owns the physical site definition; storage layout concerns (zones, bins, aisles) belong to future warehouse modules that use `Warehouse`/`StorageLocation` entities referencing a site. Organization uses "Site" to mean a company-owned physical facility; warehouse modules use "Warehouse" and "StorageLocation" for internal storage layout within a site.
8
+
9
+ ## Business Purpose
10
+
11
+ Sites bridge the gap between the legal entity (company) and its physical presence. This enables:
12
+
13
+ - Geographic scoping of operations: each warehouse, office, or store is a distinct addressable entity
14
+ - Structured address storage for consistent formatting, postal validation, and country-specific address rules
15
+ - Type classification (office, warehouse, store, factory, distribution center) to distinguish facility purposes
16
+ - Timezone assignment per site for scheduling, cutoff times, and local reporting
17
+ - Country assignment for tax jurisdiction determination and regulatory compliance
18
+ - A reference point for inventory (stock-on-hand at a site), shipping (origin/destination), and purchasing (delivery destination)
19
+
20
+ The lifecycle ensures:
21
+
22
+ - Sites are either ACTIVE (available for operational reference) or INACTIVE (no longer in use but preserved for historical records)
23
+ - Inactivating a site prevents new inventory movements and order references while preserving all historical data
24
+ - Sites have no DRAFT state — they are operational entities created ready for use
25
+
26
+ ## Process Flow
27
+
28
+ ```mermaid
29
+ stateDiagram-v2
30
+ [*] --> Active: createSite
31
+ Active --> Inactive: deactivateSite
32
+ Inactive --> Active: reactivateSite
33
+ ```
34
+
35
+ The site creation and configuration flow follows this pattern:
36
+
37
+ ```mermaid
38
+ flowchart TD
39
+ A[Create Site] --> B[Set Name & Type]
40
+ B --> C[Enter Structured Address]
41
+ C --> D[Assign Country & Timezone]
42
+ D --> E[Activate for Operations]
43
+ E --> F{Site no longer needed?}
44
+ F -->|Yes| G[Deactivate Site]
45
+ F -->|No| H[Site remains ACTIVE]
46
+ G --> I{Reopen facility?}
47
+ I -->|Yes| J[Reactivate Site]
48
+ I -->|No| K[Site remains INACTIVE]
49
+ ```
50
+
51
+ ## Scenario Patterns
52
+
53
+ - **New Warehouse Site**: A company opens a new distribution warehouse. A site is created with type WAREHOUSE, the full structured address, country, and the local timezone. Once created, inventory and shipping modules can reference it as a stock-holding and ship-from facility
54
+ - **Office Registration**: A company registers its headquarters as a site with type OFFICE. The address and country are recorded for legal correspondence and tax jurisdiction purposes
55
+ - **Store Opening**: A retail company opens a new storefront. A site of type STORE is created with the store's physical address, enabling point-of-sale and local inventory tracking
56
+ - **Facility Closure**: A factory is shut down permanently. The site is deactivated, preventing new inventory or orders from referencing it, while all historical transactions tied to the site remain intact
57
+ - **Facility Reopening**: A previously closed warehouse site is reopened for seasonal demand. The site is reactivated, making it available again for inventory and shipping operations
58
+ - **Multi-Site Expansion**: A company expands internationally by adding sites in new countries, each with the appropriate country code and timezone, enabling localized tax and regulatory compliance
59
+ - **Address Correction**: A site's street address or postal code is updated to correct a data entry error. The structured address fields are individually updatable without affecting the site's identity or references
60
+
61
+ ## Test Cases
62
+
63
+ - Sites are created in ACTIVE status (no DRAFT state)
64
+ - Site lifecycle follows ACTIVE ↔ INACTIVE state machine
65
+ - Site name is required and must be non-empty
66
+ - Site type is required and must be one of the allowed classifications (e.g., OFFICE, WAREHOUSE, STORE, FACTORY, DISTRIBUTION_CENTER)
67
+ - Each site is scoped to exactly one companyId
68
+ - The referenced company must exist and be in ACTIVE status
69
+ - Structured address fields (street, city, postal code, country) are required at creation
70
+ - Country field is required and must reference a valid country code
71
+ - Timezone is required and must be a valid IANA timezone identifier
72
+ - A site's companyId is immutable after creation
73
+ - Updating address fields on an ACTIVE site is permitted
74
+ - Deactivating a site does not delete or modify historical transactions referencing it
75
+ - Reactivating an INACTIVE site returns it to ACTIVE status
76
+ - Attempting to create a site under a non-existent or INACTIVE company is rejected
77
+ - Site deletion is not supported; sites are deactivated instead to preserve referential integrity with downstream records (inventory, orders)
78
+ - Multiple sites can exist for the same company
79
+ - Site name uniqueness is enforced within the same companyId scope
80
+
81
+ ## Reference Links
82
+
83
+ - [Odoo Branches / Multi-Location](https://www.odoo.com/documentation/19.0/applications/general/companies.html)
84
+ - [Dynamics 365 Sites and Warehouses](https://learn.microsoft.com/en-us/dynamics365/supply-chain/warehousing/warehouse-configuration)
85
+ - [SAP Business One Warehouses](https://help.sap.com/docs/SAP_BUSINESS_ONE)
86
+ - [Oracle SCM Locations](https://docs.oracle.com/en/cloud/saas/supply-chain-management/24d/fadmm/manage-locations.html)
@@ -0,0 +1,60 @@
1
+ # Company
2
+
3
+ ## Description
4
+
5
+ Company represents a legal entity in the ERP system — identified by its legal name, tax identification number, registration number, and registered address. Each company is assigned a base currency from the primitives module and serves as the root scoping entity for all transactional modules. Every accounting entry, sales order, purchase order, and inventory movement belongs to exactly one company. Companies follow a lifecycle state machine (DRAFT → ACTIVE ↔ INACTIVE) that controls when transactional operations are permitted.
6
+
7
+ Examples: "Acme Corp" (active manufacturing company), "Beta Ltd" (draft subsidiary being configured).
8
+
9
+ ## Domain Model Definitions
10
+
11
+ ### Model type
12
+
13
+ Stateful
14
+
15
+ #### State Transitions
16
+
17
+ ```mermaid
18
+ stateDiagram-v2
19
+ [*] --> Draft: createCompany
20
+ Draft --> Active: activateCompany
21
+ Active --> Inactive: deactivateCompany
22
+ Inactive --> Active: reactivateCompany
23
+ Draft --> [*]: deleteCompany
24
+ note right of Draft: Only DRAFT companies can be deleted
25
+ note right of Active: Base currency is immutable after activation
26
+ ```
27
+
28
+ ### Command Definitions
29
+
30
+ - [createCompany](../commands/CreateCompany.md) - Create a new company in DRAFT status
31
+ - [updateCompany](../commands/UpdateCompany.md) - Modify company fields (legal name, address, tax ID, etc.)
32
+ - [activateCompany](../commands/ActivateCompany.md) - Transition company from DRAFT to ACTIVE
33
+ - [deactivateCompany](../commands/DeactivateCompany.md) - Transition company from ACTIVE to INACTIVE
34
+ - [reactivateCompany](../commands/ReactivateCompany.md) - Transition company from INACTIVE to ACTIVE
35
+ - [deleteCompany](../commands/DeleteCompany.md) - Permanently remove a DRAFT company
36
+
37
+ ### Query Definitions
38
+
39
+ - [getCompany](../queries/GetCompany.md) - Retrieve a company by ID
40
+
41
+ ### Models
42
+
43
+ - Company
44
+
45
+ ### Invariants
46
+
47
+ - Legal name is required and must be non-empty
48
+ - Base currency is optional at creation but must reference a valid Currency from the primitives module before activation
49
+ - Base currency is immutable after activation (ACTIVE or INACTIVE state)
50
+ - Only DRAFT companies can be permanently deleted; ACTIVE and INACTIVE companies are preserved for audit
51
+ - Deleting a DRAFT company is rejected (restrict) if it has existing departments or sites referencing it
52
+ - Registered address fields (street, city, postalCode, country) are required before activation
53
+ - Each company has a unique system-generated ID used for data isolation across transactional modules
54
+
55
+ ### Relationships
56
+
57
+ - **References Currency (cross-module)**: Company references a Currency from the primitives module as its base currency via baseCurrencyId
58
+ - **Referenced By Department**: Departments belong to exactly one company via companyId
59
+ - **Referenced By Site**: Sites belong to exactly one company via companyId
60
+ - **Referenced By Transactions**: Company is used as scoping entity across all transactional modules (accounting, sales, purchasing, inventory)
@@ -0,0 +1,57 @@
1
+ # Department
2
+
3
+ ## Description
4
+
5
+ Department represents a functional organizational unit within a company — such as Sales, Engineering, Finance, or Human Resources. Each department belongs to exactly one company and is identified by a unique code scoped to that company. Departments form a self-referential hierarchy through an optional parent department reference, enabling the modeling of organizational trees (e.g., Engineering > Backend Engineering > Platform Team). Manager assignment is deferred to a future HR/employee module.
6
+
7
+ Examples: "ENG" (Engineering), "FIN" (Finance), "ENG-BE" (Backend Engineering under Engineering).
8
+
9
+ ## Domain Model Definitions
10
+
11
+ ### Model type
12
+
13
+ Stateful
14
+
15
+ #### State Transitions
16
+
17
+ ```mermaid
18
+ stateDiagram-v2
19
+ [*] --> Active: createDepartment
20
+ Active --> Inactive: deactivateDepartment
21
+ Inactive --> Active: reactivateDepartment
22
+ ```
23
+
24
+ ### Command Definitions
25
+
26
+ - [createDepartment](../commands/CreateDepartment.md) - Create a new department in ACTIVE status
27
+ - [updateDepartment](../commands/UpdateDepartment.md) - Update department name or parent department
28
+ - [deactivateDepartment](../commands/DeactivateDepartment.md) - Transition department from ACTIVE to INACTIVE
29
+ - [reactivateDepartment](../commands/ReactivateDepartment.md) - Transition department from INACTIVE to ACTIVE
30
+
31
+ ### Query Definitions
32
+
33
+ - [getDepartment](../queries/GetDepartment.md) - Retrieve a department by ID or code
34
+ - [getDepartmentChildren](../queries/GetDepartmentChildren.md) - Retrieve direct child departments of a given department
35
+ - [detectDepartmentCircularReference](../queries/DetectDepartmentCircularReference.md) - Validate that reparenting would not create a cycle
36
+ - [listDepartmentsByCompany](../queries/ListDepartmentsByCompany.md) - List all departments for a given company
37
+
38
+ ### Models
39
+
40
+ - Department
41
+
42
+ ### Invariants
43
+
44
+ - Department code is required, unique per company, and immutable after creation
45
+ - Department name is required and must be non-empty
46
+ - A department must reference an existing, valid company
47
+ - A department cannot reference itself as its own parent
48
+ - Circular parent references are rejected (A → B → C → A)
49
+ - A department cannot be deactivated while it has active sub-departments
50
+ - Updating a department's parent is allowed in both ACTIVE and INACTIVE states
51
+ - Department codes from different companies do not conflict (company-scoped uniqueness)
52
+
53
+ ### Relationships
54
+
55
+ - **Belongs To Company**: Each department references exactly one Company via companyId
56
+ - **Self-Referential Parent-Child**: Each department optionally references another Department as its parent via parentDepartmentId, forming a tree hierarchy
57
+ - **Referenced By Downstream Modules**: Departments are referenced by future modules for cost allocation, approval workflows, and reporting
@@ -0,0 +1,57 @@
1
+ # Site
2
+
3
+ ## Description
4
+
5
+ Site represents a physical facility owned or operated by a company — offices, warehouses, stores, factories, and distribution centers. Each site is scoped to a single company and stores a structured address (street, city, state/province, postal code, country), type classification, timezone, and lifecycle state. Sites provide the geographic foundation that downstream modules depend on: inventory uses sites to determine where stock is held, sales and purchasing reference sites for ship-from and ship-to addresses, and tax modules reference sites for jurisdiction determination.
6
+
7
+ Examples: "Tokyo HQ" (OFFICE), "Osaka Warehouse" (WAREHOUSE), "Shibuya Store" (STORE).
8
+
9
+ ## Domain Model Definitions
10
+
11
+ ### Model type
12
+
13
+ Stateful
14
+
15
+ #### State Transitions
16
+
17
+ ```mermaid
18
+ stateDiagram-v2
19
+ [*] --> Active: createSite
20
+ Active --> Inactive: deactivateSite
21
+ Inactive --> Active: reactivateSite
22
+ ```
23
+
24
+ ### Command Definitions
25
+
26
+ - [createSite](../commands/CreateSite.md) - Create a new site in ACTIVE status
27
+ - [updateSite](../commands/UpdateSite.md) - Update site name, address, type, or timezone
28
+ - [deactivateSite](../commands/DeactivateSite.md) - Transition site from ACTIVE to INACTIVE
29
+ - [reactivateSite](../commands/ReactivateSite.md) - Transition site from INACTIVE to ACTIVE
30
+
31
+ ### Query Definitions
32
+
33
+ - [getSite](../queries/GetSite.md) - Retrieve a site by ID
34
+ - [listSitesByCompany](../queries/ListSitesByCompany.md) - List all sites for a given company
35
+
36
+ ### Models
37
+
38
+ - Site
39
+
40
+ ### Invariants
41
+
42
+ - Site name is required, non-empty, and unique within the same company
43
+ - Site type is required and must be one of: OFFICE, WAREHOUSE, STORE, FACTORY, DISTRIBUTION_CENTER
44
+ - Structured address fields (street, city, postalCode, country) are required at creation
45
+ - State/province is optional (not all countries use states or provinces)
46
+ - Country must reference a valid country code
47
+ - Timezone is required and must be a valid IANA timezone identifier
48
+ - companyId is immutable after creation
49
+ - The referenced company must exist and be in ACTIVE status at creation time
50
+ - Site deletion is not supported; deactivation is used instead to preserve referential integrity with downstream records
51
+
52
+ ### Relationships
53
+
54
+ - **Belongs To Company**: Each site references exactly one Company via companyId
55
+ - **Referenced By Warehouse (future)**: Future warehouse modules will reference sites for storage layout (Warehouse/StorageLocation entities)
56
+ - **Referenced By Inventory**: Sites are referenced by inventory for stock-on-hand tracking
57
+ - **Referenced By Sales/Purchasing**: Sites are referenced as ship-from and delivery destinations
@@ -0,0 +1,50 @@
1
+ # DetectDepartmentCircularReference
2
+
3
+ ## Overview
4
+
5
+ DetectDepartmentCircularReference validates that reparenting a department would not create a circular reference in the hierarchy. It walks up the ancestor chain from the proposed new parent, checking whether the department being moved appears as an ancestor. If the moved department is found in the ancestor chain, the move would create a cycle.
6
+
7
+ ## Business Rules
8
+
9
+ - A department cannot be moved to become a descendant of itself
10
+ - Self-referencing is explicitly rejected: newParentId === departmentId
11
+ - Ancestor chain is traversed from the new parent upward to the root
12
+ - If the moved department's ID is found in the ancestor chain, the move is circular
13
+ - Traversal stops at root (parentDepartmentId = null) or broken chain (parent not found)
14
+ - Only relevant when newParentId is non-null (promoting to root cannot create a cycle)
15
+
16
+ ## Process Flow
17
+
18
+ ```mermaid
19
+ flowchart TD
20
+ A[Receive departmentId + newParentId] --> B{newParentId === departmentId?}
21
+ B -->|Yes| C[Return isCircular: true]
22
+ B -->|No| D[Set ancestorId = newParentId]
23
+ D --> E[SELECT ancestor where id = ancestorId]
24
+ E --> F{Ancestor found?}
25
+ F -->|No| G[Return isCircular: false]
26
+ F -->|Yes| H[Set ancestorId = ancestor.parentDepartmentId]
27
+ H --> I{ancestorId === departmentId?}
28
+ I -->|Yes| C
29
+ I -->|No| J{ancestorId is null?}
30
+ J -->|Yes| G
31
+ J -->|No| E
32
+ ```
33
+
34
+ ## External Dependencies
35
+
36
+ - None
37
+
38
+ ## Error Scenarios
39
+
40
+ - **CIRCULAR_REFERENCE**: The moved department appears in the ancestor chain of the new parent — returns isCircular: true
41
+ - **SELF_REFERENCE**: Department is moved to itself as parent — returns isCircular: true
42
+
43
+ ## Test Cases
44
+
45
+ - detects self-reference as circular
46
+ - detects moving department under its child as circular
47
+ - detects moving department under its grandchild as circular
48
+ - returns not circular for valid move
49
+ - returns not circular when new parent is root
50
+ - handles broken ancestor chain gracefully (not circular)
@@ -0,0 +1,40 @@
1
+ # GetCompany
2
+
3
+ ## Overview
4
+
5
+ GetCompany retrieves a single company by its unique identifier. Returns the full company record including status, legal details, address, and base currency reference, or null if no matching company exists.
6
+
7
+ This function supports company validation and lookup operations across all modules that reference companies.
8
+
9
+ ## Business Rules
10
+
11
+ - Lookup by `id` performs an exact UUID match
12
+ - Returns the full company record including status, legal name, tax ID, registration number, address, and base currency
13
+ - Does not filter by status — returns DRAFT, ACTIVE, and INACTIVE companies
14
+ - Returns null when no matching company is found
15
+
16
+ ## Process Flow
17
+
18
+ ```mermaid
19
+ flowchart TD
20
+ A[Receive lookup request] --> B[Query Company by id]
21
+ B --> C{Found?}
22
+ C -->|Yes| D[Return company]
23
+ C -->|No| E[Return null]
24
+ ```
25
+
26
+ ## External Dependencies
27
+
28
+ - None
29
+
30
+ ## Error Scenarios
31
+
32
+ - None (returns null when not found instead of throwing)
33
+
34
+ ## Test Cases
35
+
36
+ - returns company when found by id
37
+ - returns null when company not found
38
+ - returns DRAFT company
39
+ - returns ACTIVE company
40
+ - returns INACTIVE company