@tailor-platform/erp-kit 0.2.2 → 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 (639) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +193 -69
  3. package/dist/cli.mjs +1038 -398
  4. package/package.json +7 -5
  5. package/skills/erp-kit-app-1-requirements/SKILL.md +27 -17
  6. package/skills/erp-kit-app-2-requirements-review/SKILL.md +5 -4
  7. package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +10 -1
  8. package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +10 -1
  9. package/skills/erp-kit-app-3-plan/SKILL.md +31 -34
  10. package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +22 -36
  11. package/skills/erp-kit-app-3-plan/references/screen-extraction.md +15 -1
  12. package/skills/erp-kit-app-3-plan/references/story-extraction.md +8 -2
  13. package/skills/erp-kit-app-4-plan-review/SKILL.md +1 -10
  14. package/skills/erp-kit-app-5-impl-backend/SKILL.md +10 -19
  15. package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -22
  16. package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +0 -1
  17. package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +13 -4
  18. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +5 -0
  19. package/skills/erp-kit-app-6-impl-frontend/references/pages.md +16 -46
  20. package/skills/erp-kit-app-7-impl-review/SKILL.md +13 -11
  21. package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +16 -17
  22. package/skills/erp-kit-app-shared/SKILL.md +15 -0
  23. package/skills/erp-kit-app-shared/references/link-format-reference.md +13 -0
  24. package/skills/erp-kit-app-shared/references/naming-conventions.md +21 -0
  25. package/skills/erp-kit-app-shared/references/resolver-classification.md +23 -0
  26. package/skills/erp-kit-app-shared/references/schema-constraints.md +25 -0
  27. package/skills/erp-kit-module-1-requirements/SKILL.md +7 -13
  28. package/skills/erp-kit-module-1-requirements/references/feature-doc.md +1 -1
  29. package/skills/erp-kit-module-2-requirements-review/SKILL.md +21 -5
  30. package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +19 -0
  31. package/skills/erp-kit-module-3-plan/SKILL.md +6 -8
  32. package/skills/erp-kit-module-3-plan/references/naming.md +15 -1
  33. package/skills/erp-kit-module-4-plan-review/SKILL.md +21 -5
  34. package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +15 -0
  35. package/skills/erp-kit-module-5-impl/SKILL.md +12 -10
  36. package/skills/erp-kit-module-5-impl/references/generated-code.md +2 -2
  37. package/skills/erp-kit-module-6-impl-review/SKILL.md +21 -7
  38. package/skills/erp-kit-module-6-impl-review/references/error-implementation-parity.md +1 -1
  39. package/skills/erp-kit-module-6-impl-review/references/errors.md +1 -1
  40. package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +15 -0
  41. package/skills/erp-kit-module-shared/SKILL.md +4 -0
  42. package/skills/erp-kit-module-shared/references/errors.md +1 -1
  43. package/skills/erp-kit-module-shared/references/queries.md +1 -1
  44. package/skills/erp-kit-module-shared/references/structure.md +1 -1
  45. package/skills/erp-kit-update/SKILL.md +2 -2
  46. package/src/commands/app/index.ts +75 -31
  47. package/src/commands/check.test.ts +1 -1
  48. package/src/commands/check.ts +2 -35
  49. package/src/commands/doc/index.ts +83 -0
  50. package/src/commands/doc/module.test.ts +119 -0
  51. package/src/commands/doc/module.ts +114 -0
  52. package/src/commands/doc/modules.test.ts +103 -0
  53. package/src/commands/doc/modules.ts +98 -0
  54. package/src/commands/doc/search.test.ts +94 -0
  55. package/src/commands/doc/search.ts +111 -0
  56. package/src/commands/generate-doc.test.ts +63 -0
  57. package/src/commands/generate-doc.ts +105 -0
  58. package/src/commands/index.ts +20 -8
  59. package/src/commands/init-module.test.ts +43 -0
  60. package/src/commands/init-module.ts +74 -0
  61. package/src/commands/lib/command-result.ts +30 -0
  62. package/src/commands/lib/discovery.test.ts +74 -0
  63. package/src/commands/lib/discovery.ts +106 -0
  64. package/src/commands/lib/paths.ts +22 -0
  65. package/src/commands/lib/sync-check-source.test.ts +197 -0
  66. package/src/commands/lib/sync-check-source.ts +100 -0
  67. package/src/commands/lib/sync-check-tests.test.ts +178 -0
  68. package/src/commands/lib/sync-check-tests.ts +69 -0
  69. package/src/commands/mock/index.ts +11 -6
  70. package/src/commands/module/generate.ts +39 -14
  71. package/src/commands/module/index.ts +31 -45
  72. package/src/commands/parse-doc-test-cases.ts +13 -2
  73. package/src/commands/sync-check.test.ts +6 -364
  74. package/src/commands/sync-check.ts +7 -251
  75. package/src/generator/generate-app-code.test.ts +121 -0
  76. package/src/generator/generate-app-code.ts +51 -0
  77. package/src/{commands/scaffold.test.ts → generator/generate-code-boilerplate.test.ts} +19 -89
  78. package/src/generator/generate-code.test.ts +57 -6
  79. package/src/generator/generate-code.ts +40 -157
  80. package/src/generator/generate-errors.ts +34 -0
  81. package/src/generator/generate-permissions.ts +12 -0
  82. package/src/generator/generate-shells.ts +28 -0
  83. package/src/generator/generate-stubs.ts +31 -0
  84. package/src/generator/parse-resolver-doc.test.ts +89 -0
  85. package/src/generator/parse-resolver-doc.ts +125 -0
  86. package/src/generator/scaffold.ts +57 -0
  87. package/src/generator/stub-templates.test.ts +55 -0
  88. package/src/generator/stub-templates.ts +145 -0
  89. package/src/integration.test.ts +2 -2
  90. package/src/modules/audit/README.md +46 -0
  91. package/src/modules/audit/command/activateAuditPolicy.generated.ts +6 -0
  92. package/src/modules/audit/command/activateAuditPolicy.test.ts +186 -0
  93. package/src/modules/audit/command/activateAuditPolicy.ts +97 -0
  94. package/src/modules/audit/command/createAuditPolicy.generated.ts +6 -0
  95. package/src/modules/audit/command/createAuditPolicy.test.ts +395 -0
  96. package/src/modules/audit/command/createAuditPolicy.ts +131 -0
  97. package/src/modules/audit/command/deactivateAuditPolicy.generated.ts +6 -0
  98. package/src/modules/audit/command/deactivateAuditPolicy.test.ts +138 -0
  99. package/src/modules/audit/command/deactivateAuditPolicy.ts +58 -0
  100. package/src/modules/audit/command/deleteAuditPolicy.generated.ts +6 -0
  101. package/src/modules/audit/command/deleteAuditPolicy.test.ts +121 -0
  102. package/src/modules/audit/command/deleteAuditPolicy.ts +52 -0
  103. package/src/modules/audit/command/logAuditEvent.generated.ts +6 -0
  104. package/src/modules/audit/command/logAuditEvent.test.ts +991 -0
  105. package/src/modules/audit/command/logAuditEvent.ts +357 -0
  106. package/src/modules/audit/command/reactivateAuditPolicy.generated.ts +6 -0
  107. package/src/modules/audit/command/reactivateAuditPolicy.test.ts +143 -0
  108. package/src/modules/audit/command/reactivateAuditPolicy.ts +79 -0
  109. package/src/modules/audit/command/registerAuditableEntity.generated.ts +6 -0
  110. package/src/modules/audit/command/registerAuditableEntity.test.ts +268 -0
  111. package/src/modules/audit/command/registerAuditableEntity.ts +94 -0
  112. package/src/modules/audit/command/replaceAuditPolicy.generated.ts +6 -0
  113. package/src/modules/audit/command/replaceAuditPolicy.test.ts +242 -0
  114. package/src/modules/audit/command/replaceAuditPolicy.ts +91 -0
  115. package/src/modules/audit/command/updateAuditPolicy.generated.ts +6 -0
  116. package/src/modules/audit/command/updateAuditPolicy.test.ts +284 -0
  117. package/src/modules/audit/command/updateAuditPolicy.ts +151 -0
  118. package/src/modules/audit/db/auditEntry.ts +47 -0
  119. package/src/modules/audit/db/auditPolicy.ts +33 -0
  120. package/src/modules/audit/db/auditableEntity.ts +22 -0
  121. package/src/modules/audit/db/changeDetail.ts +28 -0
  122. package/src/modules/audit/db/policyFieldRule.ts +23 -0
  123. package/src/modules/audit/docs/commands/ActivateAuditPolicy.md +69 -0
  124. package/src/modules/audit/docs/commands/CreateAuditPolicy.md +79 -0
  125. package/src/modules/audit/docs/commands/DeactivateAuditPolicy.md +55 -0
  126. package/src/modules/audit/docs/commands/DeleteAuditPolicy.md +55 -0
  127. package/src/modules/audit/docs/commands/LogAuditEvent.md +137 -0
  128. package/src/modules/audit/docs/commands/ReactivateAuditPolicy.md +58 -0
  129. package/src/modules/audit/docs/commands/RegisterAuditableEntity.md +62 -0
  130. package/src/modules/audit/docs/commands/ReplaceAuditPolicy.md +72 -0
  131. package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +77 -0
  132. package/src/modules/audit/docs/features/audit-event-logging.md +126 -0
  133. package/src/modules/audit/docs/features/audit-policy-configuration.md +135 -0
  134. package/src/modules/audit/docs/features/field-level-change-tracking.md +95 -0
  135. package/src/modules/audit/docs/models/AuditEntry.md +55 -0
  136. package/src/modules/audit/docs/models/AuditPolicy.md +79 -0
  137. package/src/modules/audit/docs/models/AuditableEntity.md +38 -0
  138. package/src/modules/audit/docs/models/ChangeDetail.md +55 -0
  139. package/src/modules/audit/docs/models/PolicyFieldRule.md +45 -0
  140. package/src/modules/audit/docs/queries/GetAuditEntry.md +49 -0
  141. package/src/modules/audit/docs/queries/GetAuditPolicy.md +54 -0
  142. package/src/modules/audit/docs/queries/GetAuditSummary.md +84 -0
  143. package/src/modules/audit/docs/queries/GetChangeDetails.md +56 -0
  144. package/src/modules/audit/docs/queries/ListAuditPolicies.md +58 -0
  145. package/src/modules/audit/docs/queries/SearchAuditEntries.md +91 -0
  146. package/src/modules/audit/generated/kysely-tailordb.ts +92 -0
  147. package/src/modules/audit/index.ts +2 -0
  148. package/src/modules/audit/lib/_db_deps.ts +13 -0
  149. package/src/modules/audit/lib/errors.generated.ts +120 -0
  150. package/src/modules/audit/lib/permissions.generated.ts +14 -0
  151. package/src/modules/audit/lib/types.ts +28 -0
  152. package/src/modules/audit/module.ts +57 -0
  153. package/src/modules/audit/permissions.ts +39 -0
  154. package/src/modules/audit/query/getAuditEntry.generated.ts +5 -0
  155. package/src/modules/audit/query/getAuditEntry.test.ts +123 -0
  156. package/src/modules/audit/query/getAuditEntry.ts +36 -0
  157. package/src/modules/audit/query/getAuditPolicy.generated.ts +5 -0
  158. package/src/modules/audit/query/getAuditPolicy.test.ts +169 -0
  159. package/src/modules/audit/query/getAuditPolicy.ts +42 -0
  160. package/src/modules/audit/query/getAuditSummary.generated.ts +5 -0
  161. package/src/modules/audit/query/getAuditSummary.test.ts +632 -0
  162. package/src/modules/audit/query/getAuditSummary.ts +164 -0
  163. package/src/modules/audit/query/getChangeDetails.generated.ts +5 -0
  164. package/src/modules/audit/query/getChangeDetails.test.ts +195 -0
  165. package/src/modules/audit/query/getChangeDetails.ts +42 -0
  166. package/src/modules/audit/query/listAuditPolicies.generated.ts +5 -0
  167. package/src/modules/audit/query/listAuditPolicies.test.ts +239 -0
  168. package/src/modules/audit/query/listAuditPolicies.ts +100 -0
  169. package/src/modules/audit/query/searchAuditEntries.generated.ts +5 -0
  170. package/src/modules/audit/query/searchAuditEntries.test.ts +424 -0
  171. package/src/modules/audit/query/searchAuditEntries.ts +121 -0
  172. package/src/modules/audit/tailor.config.ts +13 -0
  173. package/src/modules/audit/tailor.d.ts +13 -0
  174. package/src/modules/audit/testing/fixtures.ts +215 -0
  175. package/src/modules/business-partner/README.md +60 -0
  176. package/src/modules/business-partner/command/.gitkeep +0 -0
  177. package/src/modules/business-partner/command/activatePartner.generated.ts +6 -0
  178. package/src/modules/business-partner/command/activatePartner.test.ts +59 -0
  179. package/src/modules/business-partner/command/activatePartner.ts +45 -0
  180. package/src/modules/business-partner/command/assignRoleToPartner.generated.ts +6 -0
  181. package/src/modules/business-partner/command/assignRoleToPartner.test.ts +113 -0
  182. package/src/modules/business-partner/command/assignRoleToPartner.ts +72 -0
  183. package/src/modules/business-partner/command/createContactPerson.generated.ts +6 -0
  184. package/src/modules/business-partner/command/createContactPerson.test.ts +193 -0
  185. package/src/modules/business-partner/command/createContactPerson.ts +98 -0
  186. package/src/modules/business-partner/command/createPartner.generated.ts +6 -0
  187. package/src/modules/business-partner/command/createPartner.test.ts +179 -0
  188. package/src/modules/business-partner/command/createPartner.ts +83 -0
  189. package/src/modules/business-partner/command/createPartnerAddress.generated.ts +6 -0
  190. package/src/modules/business-partner/command/createPartnerAddress.test.ts +195 -0
  191. package/src/modules/business-partner/command/createPartnerAddress.ts +119 -0
  192. package/src/modules/business-partner/command/createPartnerBankAccount.generated.ts +6 -0
  193. package/src/modules/business-partner/command/createPartnerBankAccount.test.ts +297 -0
  194. package/src/modules/business-partner/command/createPartnerBankAccount.ts +114 -0
  195. package/src/modules/business-partner/command/createPartnerIdentification.generated.ts +6 -0
  196. package/src/modules/business-partner/command/createPartnerIdentification.test.ts +255 -0
  197. package/src/modules/business-partner/command/createPartnerIdentification.ts +97 -0
  198. package/src/modules/business-partner/command/deactivateContactPerson.generated.ts +6 -0
  199. package/src/modules/business-partner/command/deactivateContactPerson.test.ts +70 -0
  200. package/src/modules/business-partner/command/deactivateContactPerson.ts +54 -0
  201. package/src/modules/business-partner/command/deactivatePartner.generated.ts +6 -0
  202. package/src/modules/business-partner/command/deactivatePartner.test.ts +59 -0
  203. package/src/modules/business-partner/command/deactivatePartner.ts +46 -0
  204. package/src/modules/business-partner/command/deleteContactPerson.generated.ts +6 -0
  205. package/src/modules/business-partner/command/deleteContactPerson.test.ts +61 -0
  206. package/src/modules/business-partner/command/deleteContactPerson.ts +48 -0
  207. package/src/modules/business-partner/command/deletePartner.generated.ts +6 -0
  208. package/src/modules/business-partner/command/deletePartner.test.ts +58 -0
  209. package/src/modules/business-partner/command/deletePartner.ts +46 -0
  210. package/src/modules/business-partner/command/deletePartnerAddress.generated.ts +6 -0
  211. package/src/modules/business-partner/command/deletePartnerAddress.test.ts +74 -0
  212. package/src/modules/business-partner/command/deletePartnerAddress.ts +52 -0
  213. package/src/modules/business-partner/command/deletePartnerBankAccount.generated.ts +6 -0
  214. package/src/modules/business-partner/command/deletePartnerBankAccount.test.ts +55 -0
  215. package/src/modules/business-partner/command/deletePartnerBankAccount.ts +36 -0
  216. package/src/modules/business-partner/command/deletePartnerIdentification.generated.ts +6 -0
  217. package/src/modules/business-partner/command/deletePartnerIdentification.test.ts +47 -0
  218. package/src/modules/business-partner/command/deletePartnerIdentification.ts +37 -0
  219. package/src/modules/business-partner/command/reactivateContactPerson.generated.ts +6 -0
  220. package/src/modules/business-partner/command/reactivateContactPerson.test.ts +48 -0
  221. package/src/modules/business-partner/command/reactivateContactPerson.ts +48 -0
  222. package/src/modules/business-partner/command/reactivatePartner.generated.ts +6 -0
  223. package/src/modules/business-partner/command/reactivatePartner.test.ts +59 -0
  224. package/src/modules/business-partner/command/reactivatePartner.ts +46 -0
  225. package/src/modules/business-partner/command/removeRoleFromPartner.generated.ts +6 -0
  226. package/src/modules/business-partner/command/removeRoleFromPartner.test.ts +82 -0
  227. package/src/modules/business-partner/command/removeRoleFromPartner.ts +73 -0
  228. package/src/modules/business-partner/command/setDefaultPartnerAddress.generated.ts +6 -0
  229. package/src/modules/business-partner/command/setDefaultPartnerAddress.test.ts +60 -0
  230. package/src/modules/business-partner/command/setDefaultPartnerAddress.ts +48 -0
  231. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.generated.ts +6 -0
  232. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.test.ts +56 -0
  233. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.ts +51 -0
  234. package/src/modules/business-partner/command/setPrimaryContactPerson.generated.ts +6 -0
  235. package/src/modules/business-partner/command/setPrimaryContactPerson.test.ts +63 -0
  236. package/src/modules/business-partner/command/setPrimaryContactPerson.ts +55 -0
  237. package/src/modules/business-partner/command/updateContactPerson.generated.ts +6 -0
  238. package/src/modules/business-partner/command/updateContactPerson.test.ts +193 -0
  239. package/src/modules/business-partner/command/updateContactPerson.ts +92 -0
  240. package/src/modules/business-partner/command/updatePartner.generated.ts +6 -0
  241. package/src/modules/business-partner/command/updatePartner.test.ts +101 -0
  242. package/src/modules/business-partner/command/updatePartner.ts +76 -0
  243. package/src/modules/business-partner/command/updatePartnerAddress.generated.ts +6 -0
  244. package/src/modules/business-partner/command/updatePartnerAddress.test.ts +148 -0
  245. package/src/modules/business-partner/command/updatePartnerAddress.ts +64 -0
  246. package/src/modules/business-partner/command/updatePartnerBankAccount.generated.ts +6 -0
  247. package/src/modules/business-partner/command/updatePartnerBankAccount.test.ts +249 -0
  248. package/src/modules/business-partner/command/updatePartnerBankAccount.ts +109 -0
  249. package/src/modules/business-partner/command/updatePartnerIdentification.generated.ts +6 -0
  250. package/src/modules/business-partner/command/updatePartnerIdentification.test.ts +162 -0
  251. package/src/modules/business-partner/command/updatePartnerIdentification.ts +105 -0
  252. package/src/modules/business-partner/db/.gitkeep +0 -0
  253. package/src/modules/business-partner/db/businessPartner.ts +59 -0
  254. package/src/modules/business-partner/db/contactPerson.ts +49 -0
  255. package/src/modules/business-partner/db/partnerAddress.ts +45 -0
  256. package/src/modules/business-partner/db/partnerBankAccount.ts +53 -0
  257. package/src/modules/business-partner/db/partnerIdentification.ts +53 -0
  258. package/src/modules/business-partner/db/partnerRole.ts +43 -0
  259. package/src/modules/business-partner/docs/commands/ActivatePartner.md +39 -0
  260. package/src/modules/business-partner/docs/commands/AssignRoleToPartner.md +49 -0
  261. package/src/modules/business-partner/docs/commands/CreateContactPerson.md +59 -0
  262. package/src/modules/business-partner/docs/commands/CreatePartner.md +54 -0
  263. package/src/modules/business-partner/docs/commands/CreatePartnerAddress.md +60 -0
  264. package/src/modules/business-partner/docs/commands/CreatePartnerBankAccount.md +68 -0
  265. package/src/modules/business-partner/docs/commands/CreatePartnerIdentification.md +59 -0
  266. package/src/modules/business-partner/docs/commands/DeactivateContactPerson.md +42 -0
  267. package/src/modules/business-partner/docs/commands/DeactivatePartner.md +39 -0
  268. package/src/modules/business-partner/docs/commands/DeleteContactPerson.md +43 -0
  269. package/src/modules/business-partner/docs/commands/DeletePartner.md +40 -0
  270. package/src/modules/business-partner/docs/commands/DeletePartnerAddress.md +40 -0
  271. package/src/modules/business-partner/docs/commands/DeletePartnerBankAccount.md +35 -0
  272. package/src/modules/business-partner/docs/commands/DeletePartnerIdentification.md +33 -0
  273. package/src/modules/business-partner/docs/commands/ReactivateContactPerson.md +38 -0
  274. package/src/modules/business-partner/docs/commands/ReactivatePartner.md +39 -0
  275. package/src/modules/business-partner/docs/commands/RemoveRoleFromPartner.md +46 -0
  276. package/src/modules/business-partner/docs/commands/SetDefaultPartnerAddress.md +38 -0
  277. package/src/modules/business-partner/docs/commands/SetDefaultPartnerBankAccount.md +38 -0
  278. package/src/modules/business-partner/docs/commands/SetPrimaryContactPerson.md +43 -0
  279. package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +66 -0
  280. package/src/modules/business-partner/docs/commands/UpdatePartner.md +48 -0
  281. package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +46 -0
  282. package/src/modules/business-partner/docs/commands/UpdatePartnerBankAccount.md +64 -0
  283. package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +52 -0
  284. package/src/modules/business-partner/docs/features/contact-person-management.md +70 -0
  285. package/src/modules/business-partner/docs/features/partner-address-management.md +96 -0
  286. package/src/modules/business-partner/docs/features/partner-bank-account.md +70 -0
  287. package/src/modules/business-partner/docs/features/partner-identification.md +76 -0
  288. package/src/modules/business-partner/docs/features/partner-lifecycle.md +59 -0
  289. package/src/modules/business-partner/docs/features/partner-role-classification.md +73 -0
  290. package/src/modules/business-partner/docs/models/BusinessPartner.md +64 -0
  291. package/src/modules/business-partner/docs/models/ContactPerson.md +62 -0
  292. package/src/modules/business-partner/docs/models/PartnerAddress.md +52 -0
  293. package/src/modules/business-partner/docs/models/PartnerBankAccount.md +50 -0
  294. package/src/modules/business-partner/docs/models/PartnerIdentification.md +46 -0
  295. package/src/modules/business-partner/docs/models/PartnerRole.md +42 -0
  296. package/src/modules/business-partner/docs/queries/GetContactPerson.md +34 -0
  297. package/src/modules/business-partner/docs/queries/GetDefaultPartnerAddress.md +40 -0
  298. package/src/modules/business-partner/docs/queries/GetDefaultPartnerBankAccount.md +36 -0
  299. package/src/modules/business-partner/docs/queries/GetPartner.md +35 -0
  300. package/src/modules/business-partner/docs/queries/GetPartnerAddress.md +34 -0
  301. package/src/modules/business-partner/docs/queries/GetPartnerBankAccount.md +34 -0
  302. package/src/modules/business-partner/docs/queries/GetPartnerIdentification.md +34 -0
  303. package/src/modules/business-partner/docs/queries/GetPartnerRole.md +34 -0
  304. package/src/modules/business-partner/docs/queries/GetPrimaryContactPerson.md +36 -0
  305. package/src/modules/business-partner/docs/queries/ListContactPersonsByPartner.md +39 -0
  306. package/src/modules/business-partner/docs/queries/ListPartnerAddressesByPartner.md +41 -0
  307. package/src/modules/business-partner/docs/queries/ListPartnerBankAccountsByPartner.md +39 -0
  308. package/src/modules/business-partner/docs/queries/ListPartnerIdentificationsByPartner.md +41 -0
  309. package/src/modules/business-partner/docs/queries/ListPartnersByRole.md +47 -0
  310. package/src/modules/business-partner/executor/.gitkeep +0 -0
  311. package/src/modules/business-partner/generated/.gitkeep +0 -0
  312. package/src/modules/business-partner/generated/enums.ts +60 -0
  313. package/src/modules/business-partner/generated/kysely-tailordb.ts +114 -0
  314. package/src/modules/business-partner/index.ts +2 -0
  315. package/src/modules/business-partner/lib/_db_deps.ts +17 -0
  316. package/src/modules/business-partner/lib/errors.generated.ts +172 -0
  317. package/src/modules/business-partner/lib/errors.ts +2 -0
  318. package/src/modules/business-partner/lib/permissions.generated.ts +30 -0
  319. package/src/modules/business-partner/lib/types.ts +53 -0
  320. package/src/modules/business-partner/module.ts +181 -0
  321. package/src/modules/business-partner/permissions.ts +3 -0
  322. package/src/modules/business-partner/query/.gitkeep +0 -0
  323. package/src/modules/business-partner/query/getContactPerson.generated.ts +5 -0
  324. package/src/modules/business-partner/query/getContactPerson.test.ts +31 -0
  325. package/src/modules/business-partner/query/getContactPerson.ts +16 -0
  326. package/src/modules/business-partner/query/getDefaultPartnerAddress.generated.ts +5 -0
  327. package/src/modules/business-partner/query/getDefaultPartnerAddress.test.ts +45 -0
  328. package/src/modules/business-partner/query/getDefaultPartnerAddress.ts +30 -0
  329. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.generated.ts +5 -0
  330. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.test.ts +43 -0
  331. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.ts +17 -0
  332. package/src/modules/business-partner/query/getPartner.generated.ts +5 -0
  333. package/src/modules/business-partner/query/getPartner.test.ts +31 -0
  334. package/src/modules/business-partner/query/getPartner.ts +16 -0
  335. package/src/modules/business-partner/query/getPartnerAddress.generated.ts +5 -0
  336. package/src/modules/business-partner/query/getPartnerAddress.test.ts +31 -0
  337. package/src/modules/business-partner/query/getPartnerAddress.ts +16 -0
  338. package/src/modules/business-partner/query/getPartnerBankAccount.generated.ts +5 -0
  339. package/src/modules/business-partner/query/getPartnerBankAccount.test.ts +31 -0
  340. package/src/modules/business-partner/query/getPartnerBankAccount.ts +16 -0
  341. package/src/modules/business-partner/query/getPartnerIdentification.generated.ts +5 -0
  342. package/src/modules/business-partner/query/getPartnerIdentification.test.ts +31 -0
  343. package/src/modules/business-partner/query/getPartnerIdentification.ts +16 -0
  344. package/src/modules/business-partner/query/getPartnerRole.generated.ts +5 -0
  345. package/src/modules/business-partner/query/getPartnerRole.test.ts +31 -0
  346. package/src/modules/business-partner/query/getPartnerRole.ts +19 -0
  347. package/src/modules/business-partner/query/getPrimaryContactPerson.generated.ts +5 -0
  348. package/src/modules/business-partner/query/getPrimaryContactPerson.test.ts +43 -0
  349. package/src/modules/business-partner/query/getPrimaryContactPerson.ts +17 -0
  350. package/src/modules/business-partner/query/listContactPersonsByPartner.generated.ts +5 -0
  351. package/src/modules/business-partner/query/listContactPersonsByPartner.test.ts +77 -0
  352. package/src/modules/business-partner/query/listContactPersonsByPartner.ts +32 -0
  353. package/src/modules/business-partner/query/listPartnerAddressesByPartner.generated.ts +5 -0
  354. package/src/modules/business-partner/query/listPartnerAddressesByPartner.test.ts +71 -0
  355. package/src/modules/business-partner/query/listPartnerAddressesByPartner.ts +37 -0
  356. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.generated.ts +5 -0
  357. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.test.ts +59 -0
  358. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.ts +32 -0
  359. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.generated.ts +5 -0
  360. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.test.ts +72 -0
  361. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.ts +40 -0
  362. package/src/modules/business-partner/query/listPartnersByRole.generated.ts +5 -0
  363. package/src/modules/business-partner/query/listPartnersByRole.test.ts +103 -0
  364. package/src/modules/business-partner/query/listPartnersByRole.ts +47 -0
  365. package/src/modules/business-partner/tailor.config.ts +13 -0
  366. package/src/modules/business-partner/tailor.d.ts +13 -0
  367. package/src/modules/business-partner/testing/fixtures.ts +204 -0
  368. package/src/modules/coa-management/README.md +61 -0
  369. package/src/modules/coa-management/command/.gitkeep +0 -0
  370. package/src/modules/coa-management/command/activateAccount.generated.ts +6 -0
  371. package/src/modules/coa-management/command/activateAccount.test.ts +125 -0
  372. package/src/modules/coa-management/command/activateAccount.ts +105 -0
  373. package/src/modules/coa-management/command/activateChartOfAccounts.generated.ts +6 -0
  374. package/src/modules/coa-management/command/activateChartOfAccounts.test.ts +113 -0
  375. package/src/modules/coa-management/command/activateChartOfAccounts.ts +104 -0
  376. package/src/modules/coa-management/command/createAccount.generated.ts +6 -0
  377. package/src/modules/coa-management/command/createAccount.test.ts +767 -0
  378. package/src/modules/coa-management/command/createAccount.ts +247 -0
  379. package/src/modules/coa-management/command/createAccountGroup.generated.ts +6 -0
  380. package/src/modules/coa-management/command/createAccountGroup.test.ts +494 -0
  381. package/src/modules/coa-management/command/createAccountGroup.ts +207 -0
  382. package/src/modules/coa-management/command/createChartOfAccounts.generated.ts +6 -0
  383. package/src/modules/coa-management/command/createChartOfAccounts.test.ts +502 -0
  384. package/src/modules/coa-management/command/createChartOfAccounts.ts +267 -0
  385. package/src/modules/coa-management/command/deactivateAccount.generated.ts +6 -0
  386. package/src/modules/coa-management/command/deactivateAccount.test.ts +199 -0
  387. package/src/modules/coa-management/command/deactivateAccount.ts +142 -0
  388. package/src/modules/coa-management/command/deactivateChartOfAccounts.generated.ts +6 -0
  389. package/src/modules/coa-management/command/deactivateChartOfAccounts.test.ts +91 -0
  390. package/src/modules/coa-management/command/deactivateChartOfAccounts.ts +88 -0
  391. package/src/modules/coa-management/command/deleteAccount.generated.ts +6 -0
  392. package/src/modules/coa-management/command/deleteAccount.test.ts +122 -0
  393. package/src/modules/coa-management/command/deleteAccount.ts +103 -0
  394. package/src/modules/coa-management/command/deleteAccountGroup.generated.ts +6 -0
  395. package/src/modules/coa-management/command/deleteAccountGroup.test.ts +120 -0
  396. package/src/modules/coa-management/command/deleteAccountGroup.ts +113 -0
  397. package/src/modules/coa-management/command/deleteChartOfAccounts.generated.ts +6 -0
  398. package/src/modules/coa-management/command/deleteChartOfAccounts.test.ts +154 -0
  399. package/src/modules/coa-management/command/deleteChartOfAccounts.ts +133 -0
  400. package/src/modules/coa-management/command/moveAccountGroup.generated.ts +6 -0
  401. package/src/modules/coa-management/command/moveAccountGroup.test.ts +199 -0
  402. package/src/modules/coa-management/command/moveAccountGroup.ts +145 -0
  403. package/src/modules/coa-management/command/reactivateAccount.generated.ts +6 -0
  404. package/src/modules/coa-management/command/reactivateAccount.test.ts +126 -0
  405. package/src/modules/coa-management/command/reactivateAccount.ts +123 -0
  406. package/src/modules/coa-management/command/updateAccount.generated.ts +6 -0
  407. package/src/modules/coa-management/command/updateAccount.test.ts +669 -0
  408. package/src/modules/coa-management/command/updateAccount.ts +370 -0
  409. package/src/modules/coa-management/command/updateAccountGroup.generated.ts +6 -0
  410. package/src/modules/coa-management/command/updateAccountGroup.test.ts +253 -0
  411. package/src/modules/coa-management/command/updateAccountGroup.ts +191 -0
  412. package/src/modules/coa-management/command/updateChartOfAccounts.generated.ts +6 -0
  413. package/src/modules/coa-management/command/updateChartOfAccounts.test.ts +153 -0
  414. package/src/modules/coa-management/command/updateChartOfAccounts.ts +133 -0
  415. package/src/modules/coa-management/db/.gitkeep +0 -0
  416. package/src/modules/coa-management/db/account.ts +119 -0
  417. package/src/modules/coa-management/db/accountGroup.ts +57 -0
  418. package/src/modules/coa-management/db/chartOfAccounts.ts +55 -0
  419. package/src/modules/coa-management/docs/commands/ActivateAccount.md +49 -0
  420. package/src/modules/coa-management/docs/commands/ActivateChartOfAccounts.md +47 -0
  421. package/src/modules/coa-management/docs/commands/CreateAccount.md +94 -0
  422. package/src/modules/coa-management/docs/commands/CreateAccountGroup.md +70 -0
  423. package/src/modules/coa-management/docs/commands/CreateChartOfAccounts.md +72 -0
  424. package/src/modules/coa-management/docs/commands/DeactivateAccount.md +65 -0
  425. package/src/modules/coa-management/docs/commands/DeactivateChartOfAccounts.md +44 -0
  426. package/src/modules/coa-management/docs/commands/DeleteAccount.md +52 -0
  427. package/src/modules/coa-management/docs/commands/DeleteAccountGroup.md +50 -0
  428. package/src/modules/coa-management/docs/commands/DeleteChartOfAccounts.md +48 -0
  429. package/src/modules/coa-management/docs/commands/MoveAccountGroup.md +57 -0
  430. package/src/modules/coa-management/docs/commands/ReactivateAccount.md +50 -0
  431. package/src/modules/coa-management/docs/commands/UpdateAccount.md +102 -0
  432. package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +62 -0
  433. package/src/modules/coa-management/docs/commands/UpdateChartOfAccounts.md +49 -0
  434. package/src/modules/coa-management/docs/features/account-group-hierarchy.md +81 -0
  435. package/src/modules/coa-management/docs/features/account-lifecycle.md +80 -0
  436. package/src/modules/coa-management/docs/features/account-management.md +114 -0
  437. package/src/modules/coa-management/docs/features/chart-of-accounts-setup.md +86 -0
  438. package/src/modules/coa-management/docs/models/Account.md +84 -0
  439. package/src/modules/coa-management/docs/models/AccountGroup.md +55 -0
  440. package/src/modules/coa-management/docs/models/ChartOfAccounts.md +65 -0
  441. package/src/modules/coa-management/docs/queries/DetectCircularReference.md +52 -0
  442. package/src/modules/coa-management/docs/queries/GetAccount.md +42 -0
  443. package/src/modules/coa-management/docs/queries/GetAccountGroup.md +42 -0
  444. package/src/modules/coa-management/docs/queries/GetChartOfAccounts.md +48 -0
  445. package/src/modules/coa-management/docs/queries/ListAccountGroups.md +42 -0
  446. package/src/modules/coa-management/docs/queries/ListAccounts.md +54 -0
  447. package/src/modules/coa-management/docs/queries/ListUnassignedAccounts.md +40 -0
  448. package/src/modules/coa-management/executor/.gitkeep +0 -0
  449. package/src/modules/coa-management/generated/.gitkeep +0 -0
  450. package/src/modules/coa-management/generated/enums.ts +45 -0
  451. package/src/modules/coa-management/generated/kysely-tailordb.ts +81 -0
  452. package/src/modules/coa-management/index.ts +2 -0
  453. package/src/modules/coa-management/lib/_db_deps.ts +17 -0
  454. package/src/modules/coa-management/lib/errors.generated.ts +162 -0
  455. package/src/modules/coa-management/lib/errors.ts +0 -0
  456. package/src/modules/coa-management/lib/permissions.generated.ts +20 -0
  457. package/src/modules/coa-management/lib/types.ts +22 -0
  458. package/src/modules/coa-management/module.ts +136 -0
  459. package/src/modules/coa-management/permissions.ts +3 -0
  460. package/src/modules/coa-management/query/.gitkeep +0 -0
  461. package/src/modules/coa-management/query/detectCircularReference.generated.ts +5 -0
  462. package/src/modules/coa-management/query/detectCircularReference.test.ts +88 -0
  463. package/src/modules/coa-management/query/detectCircularReference.ts +46 -0
  464. package/src/modules/coa-management/query/getAccount.generated.ts +5 -0
  465. package/src/modules/coa-management/query/getAccount.test.ts +55 -0
  466. package/src/modules/coa-management/query/getAccount.ts +25 -0
  467. package/src/modules/coa-management/query/getAccountGroup.generated.ts +5 -0
  468. package/src/modules/coa-management/query/getAccountGroup.test.ts +55 -0
  469. package/src/modules/coa-management/query/getAccountGroup.ts +25 -0
  470. package/src/modules/coa-management/query/getChartOfAccounts.generated.ts +5 -0
  471. package/src/modules/coa-management/query/getChartOfAccounts.test.ts +79 -0
  472. package/src/modules/coa-management/query/getChartOfAccounts.ts +28 -0
  473. package/src/modules/coa-management/query/listAccountGroups.generated.ts +5 -0
  474. package/src/modules/coa-management/query/listAccountGroups.test.ts +72 -0
  475. package/src/modules/coa-management/query/listAccountGroups.ts +49 -0
  476. package/src/modules/coa-management/query/listAccounts.generated.ts +5 -0
  477. package/src/modules/coa-management/query/listAccounts.test.ts +136 -0
  478. package/src/modules/coa-management/query/listAccounts.ts +82 -0
  479. package/src/modules/coa-management/query/listUnassignedAccounts.generated.ts +5 -0
  480. package/src/modules/coa-management/query/listUnassignedAccounts.test.ts +96 -0
  481. package/src/modules/coa-management/query/listUnassignedAccounts.ts +39 -0
  482. package/src/modules/coa-management/tailor.config.ts +13 -0
  483. package/src/modules/coa-management/tailor.d.ts +13 -0
  484. package/src/modules/coa-management/testing/fixtures.ts +201 -0
  485. package/src/modules/item-management/README.md +1 -1
  486. package/src/modules/organization/README.md +57 -0
  487. package/src/modules/organization/command/.gitkeep +0 -0
  488. package/src/modules/organization/command/activateCompany.generated.ts +6 -0
  489. package/src/modules/organization/command/activateCompany.test.ts +184 -0
  490. package/src/modules/organization/command/activateCompany.ts +92 -0
  491. package/src/modules/organization/command/createCompany.generated.ts +6 -0
  492. package/src/modules/organization/command/createCompany.test.ts +156 -0
  493. package/src/modules/organization/command/createCompany.ts +80 -0
  494. package/src/modules/organization/command/createDepartment.generated.ts +6 -0
  495. package/src/modules/organization/command/createDepartment.test.ts +239 -0
  496. package/src/modules/organization/command/createDepartment.ts +98 -0
  497. package/src/modules/organization/command/createSite.generated.ts +6 -0
  498. package/src/modules/organization/command/createSite.test.ts +262 -0
  499. package/src/modules/organization/command/createSite.ts +155 -0
  500. package/src/modules/organization/command/deactivateCompany.generated.ts +6 -0
  501. package/src/modules/organization/command/deactivateCompany.test.ts +58 -0
  502. package/src/modules/organization/command/deactivateCompany.ts +47 -0
  503. package/src/modules/organization/command/deactivateDepartment.generated.ts +6 -0
  504. package/src/modules/organization/command/deactivateDepartment.test.ts +115 -0
  505. package/src/modules/organization/command/deactivateDepartment.ts +63 -0
  506. package/src/modules/organization/command/deactivateSite.generated.ts +6 -0
  507. package/src/modules/organization/command/deactivateSite.test.ts +53 -0
  508. package/src/modules/organization/command/deactivateSite.ts +47 -0
  509. package/src/modules/organization/command/deleteCompany.generated.ts +6 -0
  510. package/src/modules/organization/command/deleteCompany.test.ts +99 -0
  511. package/src/modules/organization/command/deleteCompany.ts +66 -0
  512. package/src/modules/organization/command/reactivateCompany.generated.ts +6 -0
  513. package/src/modules/organization/command/reactivateCompany.test.ts +58 -0
  514. package/src/modules/organization/command/reactivateCompany.ts +47 -0
  515. package/src/modules/organization/command/reactivateDepartment.generated.ts +6 -0
  516. package/src/modules/organization/command/reactivateDepartment.test.ts +59 -0
  517. package/src/modules/organization/command/reactivateDepartment.ts +47 -0
  518. package/src/modules/organization/command/reactivateSite.generated.ts +6 -0
  519. package/src/modules/organization/command/reactivateSite.test.ts +53 -0
  520. package/src/modules/organization/command/reactivateSite.ts +47 -0
  521. package/src/modules/organization/command/updateCompany.generated.ts +6 -0
  522. package/src/modules/organization/command/updateCompany.test.ts +239 -0
  523. package/src/modules/organization/command/updateCompany.ts +127 -0
  524. package/src/modules/organization/command/updateDepartment.generated.ts +6 -0
  525. package/src/modules/organization/command/updateDepartment.test.ts +232 -0
  526. package/src/modules/organization/command/updateDepartment.ts +120 -0
  527. package/src/modules/organization/command/updateSite.generated.ts +6 -0
  528. package/src/modules/organization/command/updateSite.test.ts +274 -0
  529. package/src/modules/organization/command/updateSite.ts +176 -0
  530. package/src/modules/organization/db/.gitkeep +0 -0
  531. package/src/modules/organization/db/company.ts +44 -0
  532. package/src/modules/organization/db/department.ts +46 -0
  533. package/src/modules/organization/db/site.ts +44 -0
  534. package/src/modules/organization/docs/commands/ActivateCompany.md +62 -0
  535. package/src/modules/organization/docs/commands/CreateCompany.md +49 -0
  536. package/src/modules/organization/docs/commands/CreateDepartment.md +62 -0
  537. package/src/modules/organization/docs/commands/CreateSite.md +74 -0
  538. package/src/modules/organization/docs/commands/DeactivateCompany.md +40 -0
  539. package/src/modules/organization/docs/commands/DeactivateDepartment.md +44 -0
  540. package/src/modules/organization/docs/commands/DeactivateSite.md +38 -0
  541. package/src/modules/organization/docs/commands/DeleteCompany.md +50 -0
  542. package/src/modules/organization/docs/commands/ReactivateCompany.md +39 -0
  543. package/src/modules/organization/docs/commands/ReactivateDepartment.md +37 -0
  544. package/src/modules/organization/docs/commands/ReactivateSite.md +37 -0
  545. package/src/modules/organization/docs/commands/UpdateCompany.md +58 -0
  546. package/src/modules/organization/docs/commands/UpdateDepartment.md +64 -0
  547. package/src/modules/organization/docs/commands/UpdateSite.md +80 -0
  548. package/src/modules/organization/docs/features/company-lifecycle.md +76 -0
  549. package/src/modules/organization/docs/features/department-management.md +66 -0
  550. package/src/modules/organization/docs/features/site-management.md +86 -0
  551. package/src/modules/organization/docs/models/Company.md +60 -0
  552. package/src/modules/organization/docs/models/Department.md +57 -0
  553. package/src/modules/organization/docs/models/Site.md +57 -0
  554. package/src/modules/organization/docs/queries/DetectDepartmentCircularReference.md +50 -0
  555. package/src/modules/organization/docs/queries/GetCompany.md +40 -0
  556. package/src/modules/organization/docs/queries/GetDepartment.md +44 -0
  557. package/src/modules/organization/docs/queries/GetDepartmentChildren.md +40 -0
  558. package/src/modules/organization/docs/queries/GetSite.md +37 -0
  559. package/src/modules/organization/docs/queries/ListDepartmentsByCompany.md +54 -0
  560. package/src/modules/organization/docs/queries/ListSitesByCompany.md +54 -0
  561. package/src/modules/organization/executor/.gitkeep +0 -0
  562. package/src/modules/organization/generated/.gitkeep +0 -0
  563. package/src/modules/organization/generated/kysely-tailordb.ts +77 -0
  564. package/src/modules/organization/index.ts +2 -0
  565. package/src/modules/organization/lib/_db_deps.ts +10 -0
  566. package/src/modules/organization/lib/errors.generated.ts +117 -0
  567. package/src/modules/organization/lib/errors.ts +1 -0
  568. package/src/modules/organization/lib/permissions.generated.ts +19 -0
  569. package/src/modules/organization/lib/types.ts +16 -0
  570. package/src/modules/organization/module.ts +89 -0
  571. package/src/modules/organization/permissions.ts +3 -0
  572. package/src/modules/organization/query/.gitkeep +0 -0
  573. package/src/modules/organization/query/detectDepartmentCircularReference.generated.ts +5 -0
  574. package/src/modules/organization/query/detectDepartmentCircularReference.test.ts +102 -0
  575. package/src/modules/organization/query/detectDepartmentCircularReference.ts +27 -0
  576. package/src/modules/organization/query/getCompany.generated.ts +5 -0
  577. package/src/modules/organization/query/getCompany.test.ts +70 -0
  578. package/src/modules/organization/query/getCompany.ts +16 -0
  579. package/src/modules/organization/query/getDepartment.generated.ts +5 -0
  580. package/src/modules/organization/query/getDepartment.test.ts +85 -0
  581. package/src/modules/organization/query/getDepartment.ts +17 -0
  582. package/src/modules/organization/query/getDepartmentChildren.generated.ts +5 -0
  583. package/src/modules/organization/query/getDepartmentChildren.test.ts +75 -0
  584. package/src/modules/organization/query/getDepartmentChildren.ts +21 -0
  585. package/src/modules/organization/query/getSite.generated.ts +5 -0
  586. package/src/modules/organization/query/getSite.test.ts +55 -0
  587. package/src/modules/organization/query/getSite.ts +16 -0
  588. package/src/modules/organization/query/listDepartmentsByCompany.generated.ts +5 -0
  589. package/src/modules/organization/query/listDepartmentsByCompany.test.ts +124 -0
  590. package/src/modules/organization/query/listDepartmentsByCompany.ts +43 -0
  591. package/src/modules/organization/query/listSitesByCompany.generated.ts +5 -0
  592. package/src/modules/organization/query/listSitesByCompany.test.ts +126 -0
  593. package/src/modules/organization/query/listSitesByCompany.ts +41 -0
  594. package/src/modules/organization/tailor.config.ts +13 -0
  595. package/src/modules/organization/tailor.d.ts +13 -0
  596. package/src/modules/organization/testing/fixtures.ts +155 -0
  597. package/src/modules/primitives/README.md +1 -1
  598. package/src/modules/primitives/command/setBaseCurrency.test.ts +8 -64
  599. package/src/modules/primitives/command/setBaseCurrency.ts +6 -64
  600. package/src/modules/primitives/docs/commands/ActivateCategory.md +1 -1
  601. package/src/modules/primitives/docs/commands/ActivateCurrency.md +1 -1
  602. package/src/modules/primitives/docs/commands/ActivateUnit.md +1 -1
  603. package/src/modules/primitives/docs/commands/CreateExchangeRate.md +2 -2
  604. package/src/modules/primitives/docs/commands/CreateUnit.md +1 -1
  605. package/src/modules/primitives/docs/commands/DeactivateCategory.md +1 -1
  606. package/src/modules/primitives/docs/commands/DeactivateCurrency.md +1 -1
  607. package/src/modules/primitives/docs/commands/DeactivateUnit.md +1 -1
  608. package/src/modules/primitives/docs/commands/SetBaseCurrency.md +13 -23
  609. package/src/modules/primitives/docs/commands/SetReferenceUnit.md +1 -1
  610. package/src/modules/primitives/docs/features/currency-definitions.md +13 -14
  611. package/src/modules/primitives/docs/models/Currency.md +3 -4
  612. package/src/modules/primitives/docs/queries/ConvertAmount.md +2 -2
  613. package/src/modules/primitives/docs/queries/ConvertQuantity.md +2 -2
  614. package/src/modules/primitives/lib/errors.generated.ts +5 -0
  615. package/src/modules/product-management/README.md +1 -1
  616. package/src/modules/user-management/docs/commands/CreatePermission.md +3 -3
  617. package/src/modules/user-management/docs/commands/CreateRole.md +1 -1
  618. package/src/modules/user-management/docs/queries/ListRolePermissionsByRole.md +39 -0
  619. package/src/modules/user-management/docs/queries/ListUserRolesByUser.md +39 -0
  620. package/src/modules/user-management/generated/enums.ts +0 -15
  621. package/src/modules/user-management/generated/kysely-tailordb.ts +0 -11
  622. package/src/shared/createContext.ts +2 -1
  623. package/src/shared/defineQuery.ts +36 -1
  624. package/src/shared/requirePermission.ts +3 -3
  625. package/src/shared/types.ts +3 -0
  626. package/templates/scaffold/app/backend/package.json +8 -7
  627. package/templates/scaffold/app/frontend/eslint.config.js +12 -0
  628. package/templates/scaffold/app/frontend/package.json +19 -16
  629. package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +30 -0
  630. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +3 -2
  631. package/templates/scaffold/app/frontend/vite.config.ts +5 -5
  632. package/templates/workflows/erp-kit-check.yml +2 -2
  633. package/src/commands/module/list.test.ts +0 -57
  634. package/src/commands/module/list.ts +0 -64
  635. package/src/commands/scaffold.ts +0 -176
  636. /package/src/modules/{accounting → audit/db}/.gitkeep +0 -0
  637. /package/src/modules/audit/{.gitkeep → executor/.gitkeep} +0 -0
  638. /package/src/modules/{coa-management/.gitkeep → audit/lib/errors.ts} +0 -0
  639. /package/src/modules/{supplier-management → business-partner}/.gitkeep +0 -0
@@ -0,0 +1,66 @@
1
+ # UpdateContactPerson
2
+
3
+ ## Overview
4
+
5
+ updateContactPerson modifies the details of an existing contact person. All fields are optional, but validation rules are enforced for any provided values. The contact person's association with its organization partner cannot be changed. After the update, at least one communication channel (email or phone) must remain present.
6
+
7
+ ## Business Rules
8
+
9
+ - Contact person must exist in the system
10
+ - First name, if provided, must be non-empty and not whitespace-only
11
+ - Last name, if provided, must be non-empty and not whitespace-only
12
+ - Email, if provided, must be in a valid format
13
+ - After update, at least one of email or phone must still be present (whitespace-only values do not count)
14
+ - The organization association is immutable and cannot be changed
15
+ - The primary contact designation (isPrimary) is not modifiable through this command; it is preserved as-is
16
+ - Only provided fields are updated; omitted fields retain their current values
17
+
18
+ ## Process Flow
19
+
20
+ ```mermaid
21
+ flowchart TD
22
+ A[Receive update request] --> B{Contact person exists?}
23
+ B -->|No| C[Return error: contact person not found]
24
+ B -->|Yes| B2{firstName provided?}
25
+ B2 -->|Yes| B3{firstName non-empty after trim?}
26
+ B3 -->|No| B4[Return error: invalid first name]
27
+ B3 -->|Yes| B5{lastName provided?}
28
+ B2 -->|No| B5
29
+ B5 -->|Yes| B6{lastName non-empty after trim?}
30
+ B6 -->|No| B7[Return error: invalid last name]
31
+ B6 -->|Yes| D{Email provided?}
32
+ B5 -->|No| D
33
+ D -->|Yes| E{Email format valid?}
34
+ E -->|No| F[Return error: invalid email format]
35
+ E -->|Yes| G{At least one communication channel remains?}
36
+ D -->|No| G
37
+ G -->|No| H[Return error: missing communication channel]
38
+ G -->|Yes| I[Update contact person record]
39
+ I --> J[Return updated contact person]
40
+ ```
41
+
42
+ ## External Dependencies
43
+
44
+ - None
45
+
46
+ ## Error Scenarios
47
+
48
+ - **CONTACT_PERSON_NOT_FOUND**: Specified contact person ID does not exist
49
+ - **INVALID_FIRST_NAME**: Provided first name is empty or whitespace-only
50
+ - **INVALID_LAST_NAME**: Provided last name is empty or whitespace-only
51
+ - **INVALID_EMAIL_FORMAT**: Provided email is not in a valid format
52
+ - **MISSING_COMMUNICATION_CHANNEL**: Update would result in neither email nor phone being present
53
+
54
+ ## Test Cases
55
+
56
+ - updates contact person details
57
+ - returns error when contact not found
58
+ - returns error when first name is empty
59
+ - returns error when first name is whitespace-only
60
+ - returns error when last name is empty
61
+ - returns error when last name is whitespace-only
62
+ - returns error when email format is invalid
63
+ - returns error when update would leave no communication channel
64
+ - returns error when whitespace-only phone would leave no communication channel
65
+ - does not change organization association
66
+ - preserves primary contact designation
@@ -0,0 +1,48 @@
1
+ # UpdatePartner
2
+
3
+ ## Overview
4
+
5
+ updatePartner modifies the mutable fields of an existing business partner. Only name and preferred currency can be updated. The partner type remains immutable after creation. This command supports incremental enrichment of partner data throughout the partner lifecycle.
6
+
7
+ ## Business Rules
8
+
9
+ - Partner must exist in the system
10
+ - Name, if provided, must be non-empty
11
+ - Preferred currency, if provided, must reference an existing Currency in the primitives module
12
+ - Partner type cannot be changed via this command
13
+
14
+ ## Process Flow
15
+
16
+ ```mermaid
17
+ flowchart TD
18
+ A[Receive update request] --> B{Partner exists?}
19
+ B -->|No| C[Return error: partner not found]
20
+ B -->|Yes| D{Name provided?}
21
+ D -->|Yes| E{Name non-empty?}
22
+ E -->|No| F[Return error: invalid name]
23
+ E -->|Yes| G{Currency provided?}
24
+ D -->|No| G
25
+ G -->|Yes| H{Currency exists?}
26
+ H -->|No| I[Return error: currency not found]
27
+ H -->|Yes| J[Update partner record]
28
+ G -->|No| J
29
+ J --> K[Return updated partner]
30
+ ```
31
+
32
+ ## External Dependencies
33
+
34
+ - [primitives::Currency](../../../primitives/docs/models/Currency.md) - Validates that the referenced preferred currency exists (when provided)
35
+
36
+ ## Error Scenarios
37
+
38
+ - **PARTNER_NOT_FOUND**: Specified partner ID does not exist
39
+ - **CURRENCY_NOT_FOUND**: Referenced preferred currency does not exist
40
+ - **INVALID_NAME**: Provided name is empty
41
+
42
+ ## Test Cases
43
+
44
+ - updates partner name
45
+ - updates preferred currency
46
+ - returns error when partner not found
47
+ - returns error when name is empty
48
+ - returns error when currency not found
@@ -0,0 +1,46 @@
1
+ # UpdatePartnerAddress
2
+
3
+ ## Overview
4
+
5
+ updatePartnerAddress modifies the fields of an existing partner address. The address type is immutable and cannot be changed after creation. All other address fields (line1, line2, city, state, postalCode, country) can be updated individually. Country validation is enforced when a new country value is provided. Updates are permitted regardless of the parent partner's lifecycle status (DRAFT, ACTIVE, or INACTIVE) — existing addresses always remain updatable.
6
+
7
+ ## Business Rules
8
+
9
+ - Address must exist in the system
10
+ - Parent partner's lifecycle status is not checked — updates are permitted in any state (DRAFT, ACTIVE, or INACTIVE)
11
+ - Address type is immutable — it cannot be changed after creation
12
+ - Country, if provided, must be a valid ISO 3166-1 alpha-2 code
13
+ - Only provided fields are updated; omitted fields retain their current values
14
+
15
+ ## Process Flow
16
+
17
+ ```mermaid
18
+ flowchart TD
19
+ A[Receive update request] --> B{Address exists?}
20
+ B -->|No| C[Return error: address not found]
21
+ B -->|Yes| D{Country provided?}
22
+ D -->|Yes| E{Country code valid?}
23
+ E -->|No| F[Return error: invalid country code]
24
+ E -->|Yes| G[Update address record]
25
+ D -->|No| G
26
+ G --> H[Return updated address]
27
+ ```
28
+
29
+ ## External Dependencies
30
+
31
+ - None
32
+
33
+ ## Error Scenarios
34
+
35
+ - **ADDRESS_NOT_FOUND**: Specified address ID does not exist
36
+ - **INVALID_COUNTRY_CODE**: Country is not a valid ISO 3166-1 alpha-2 code
37
+
38
+ ## Test Cases
39
+
40
+ - updates address fields
41
+ - updates address for DRAFT partner
42
+ - updates address for ACTIVE partner
43
+ - updates address for INACTIVE partner
44
+ - returns error when address not found
45
+ - returns error when country code is invalid
46
+ - returns error when country code is lowercase
@@ -0,0 +1,64 @@
1
+ # UpdatePartnerBankAccount
2
+
3
+ ## Overview
4
+
5
+ updatePartnerBankAccount modifies the details of an existing bank account. All fields are optional, but the same validation rules that apply at creation are enforced for any provided values. This allows incremental updates to banking information as details change. Updates are permitted regardless of the parent partner's lifecycle status (DRAFT, ACTIVE, or INACTIVE).
6
+
7
+ ## Business Rules
8
+
9
+ - Bank account must exist in the system
10
+ - Parent partner's status is not checked — updates are permitted in any lifecycle state (DRAFT, ACTIVE, or INACTIVE)
11
+ - Bank name, if provided, must be non-empty
12
+ - Account holder name, if provided, must be non-empty
13
+ - After update, at least one of accountNumber or iban must still be present
14
+ - `routingNumber` is optional — can be added, updated, or cleared
15
+ - `swiftBic` is optional — can be added, updated, or cleared
16
+ - Currency, if provided, must reference an existing Currency in the primitives module
17
+
18
+ ## Process Flow
19
+
20
+ ```mermaid
21
+ flowchart TD
22
+ A[Receive update request] --> B{Bank account exists?}
23
+ B -->|No| C[Return error: bank account not found]
24
+ B -->|Yes| D{bankName provided and empty?}
25
+ D -->|Yes| D1[Return error: invalid bank name]
26
+ D -->|No| E2{accountHolderName provided and empty?}
27
+ E2 -->|Yes| E3[Return error: invalid account holder name]
28
+ E2 -->|No| F1{Currency provided?}
29
+ F1 -->|Yes| F2{Currency exists?}
30
+ F2 -->|No| F3[Return error: currency not found]
31
+ F2 -->|Yes| G{At least one account identifier remains?}
32
+ F1 -->|No| G
33
+ G -->|No| H[Return error: missing account identifier]
34
+ G -->|Yes| I[Update bank account record]
35
+ I --> J[Return updated bank account]
36
+ ```
37
+
38
+ ## External Dependencies
39
+
40
+ - [primitives::Currency](../../../primitives/docs/models/Currency.md) - Validates that the referenced currency exists (when provided)
41
+
42
+ ## Error Scenarios
43
+
44
+ - **BANK_ACCOUNT_NOT_FOUND**: Specified bank account ID does not exist
45
+ - **INVALID_BANK_NAME**: Bank name is provided but empty
46
+ - **INVALID_ACCOUNT_HOLDER_NAME**: Account holder name is provided but empty
47
+ - **CURRENCY_NOT_FOUND**: Referenced currency does not exist
48
+ - **MISSING_ACCOUNT_IDENTIFIER**: Update would result in neither accountNumber nor iban being present
49
+
50
+ ## Test Cases
51
+
52
+ - updates bank account details
53
+ - updates routingNumber
54
+ - updates swiftBic
55
+ - clears routingNumber when null is passed
56
+ - clears swiftBic when null is passed
57
+ - updates bank account for DRAFT partner
58
+ - updates bank account for ACTIVE partner
59
+ - updates bank account for INACTIVE partner
60
+ - returns error when account not found
61
+ - returns error when bank name is empty
62
+ - returns error when account holder name is empty
63
+ - returns error when currency not found
64
+ - returns error when update would remove all identifiers
@@ -0,0 +1,52 @@
1
+ # UpdatePartnerIdentification
2
+
3
+ ## Overview
4
+
5
+ updatePartnerIdentification modifies the fields of an existing partner identification. The identification type is immutable and cannot be changed after creation. When the value is updated, uniqueness is re-validated against the company scope to prevent duplicate registrations.
6
+
7
+ ## Business Rules
8
+
9
+ - Identification must exist in the system
10
+ - Type is immutable — it cannot be changed after creation
11
+ - If value is provided, it must be non-empty and not whitespace-only
12
+ - If value is changed, the new (type, value) combination must be unique within the company scope
13
+ - When both validFrom and validTo are set, validTo must be greater than or equal to validFrom
14
+ - Issuing country and validity dates are optional
15
+
16
+ ## Process Flow
17
+
18
+ ```mermaid
19
+ flowchart TD
20
+ A[Receive update request] --> B{Identification exists?}
21
+ B -->|No| C[Return error: identification not found]
22
+ B -->|Yes| D{Value provided?}
23
+ D -->|Yes| D2{Value non-empty after trim?}
24
+ D2 -->|No| D3[Return error: invalid value]
25
+ D2 -->|Yes| E{Value changed and new type + value unique in company?}
26
+ E -->|No| F[Return error: duplicate identification]
27
+ E -->|Yes| G{Validate validity period}
28
+ D -->|No| G
29
+ G -->|validTo < validFrom| H[Return error: invalid validity period]
30
+ G -->|Valid| I[Update identification record]
31
+ I --> J[Return updated identification]
32
+ ```
33
+
34
+ ## External Dependencies
35
+
36
+ - None
37
+
38
+ ## Error Scenarios
39
+
40
+ - **IDENTIFICATION_NOT_FOUND**: Specified identification ID does not exist
41
+ - **INVALID_VALUE**: Provided value is empty or whitespace-only
42
+ - **DUPLICATE_IDENTIFICATION**: Updated (type, value) combination already exists within the company
43
+ - **INVALID_VALIDITY_PERIOD**: validTo is earlier than validFrom
44
+
45
+ ## Test Cases
46
+
47
+ - updates identification value
48
+ - returns error when identification not found
49
+ - returns error when value is empty
50
+ - returns error when value is whitespace-only
51
+ - returns error when updated value creates duplicate
52
+ - returns error when validity period is invalid
@@ -0,0 +1,70 @@
1
+ # Contact Person Management
2
+
3
+ ## Overview
4
+
5
+ Contact Person Management enables organizations to track individual people who represent a business partner organization. Each contact person is a sub-entity linked to exactly one ORGANIZATION-type partner — they are not business partners themselves, but named individuals who act on behalf of that organization. Contact persons carry their own identifying information (name, and at least one of email or phone, plus optional job title and department) and maintain an independent ACTIVE/INACTIVE status.
6
+
7
+ One contact person per organization can be designated as the primary contact, providing a single point of first contact for that partner relationship.
8
+
9
+ ## Business Purpose
10
+
11
+ Business interactions with partner organizations are typically conducted through specific individuals. Tracking contact persons enables:
12
+
13
+ - **Named communication**: Sales, procurement, and support teams can reach the right person at a partner organization rather than relying on generic email addresses or phone numbers
14
+ - **Role clarity**: Job title and department fields identify who is responsible for purchasing, accounts payable, technical escalation, and other functional areas
15
+ - **Primary contact designation**: Each organization has one primary contact, reducing ambiguity about who to contact first for general enquiries
16
+ - **Status tracking**: Contacts who leave or change roles can be marked INACTIVE without losing historical records tied to past transactions or communications
17
+ - **CRM alignment**: Mirrors industry-standard models (SAP BP relationships, Odoo child contacts, Salesforce Contact-Account) for interoperability and familiarity
18
+
19
+ ## Process Flow
20
+
21
+ The relationship between a partner organization and its contact persons:
22
+
23
+ ```mermaid
24
+ flowchart TD
25
+ A[ORGANIZATION-type Partner] -->|has zero or more| B[Contact Person]
26
+ B --> C{Is primary contact?}
27
+ C -->|Yes| D[Designated as primary contact\nfor the organization]
28
+ C -->|No| E[Regular contact person]
29
+ D -->|another contact promoted| F[Primary designation transferred]
30
+ ```
31
+
32
+ Contact person lifecycle:
33
+
34
+ ```mermaid
35
+ stateDiagram-v2
36
+ [*] --> Active: createContactPerson
37
+ Active --> Inactive: deactivateContactPerson
38
+ Inactive --> Active: reactivateContactPerson
39
+ Active --> [*]: deleteContactPerson (only when not primary)
40
+ ```
41
+
42
+ ## Scenario Patterns
43
+
44
+ - **New supplier onboarding**: When a new supplier partner is registered, the procurement team adds the account manager's name, email, and phone as a contact person and marks them as primary contact
45
+ - **Multiple contacts per organization**: A customer organization has separate contacts for accounts payable and technical support — both are recorded with distinct job titles and departments
46
+ - **Primary contact change**: The existing primary contact leaves the organization; their record is marked INACTIVE, and a newly added colleague is designated as the primary contact
47
+ - **Contact details update**: A contact person's phone number or job title changes; the record is updated without affecting their link to the parent organization or their primary status
48
+ - **Departed contact retention**: A contact person who has left the partner organization is deactivated rather than deleted, preserving references in historical correspondence and past transactions
49
+ - **Organization type enforcement**: Attempting to link a contact person to an INDIVIDUAL-type partner is rejected; contact persons may only belong to ORGANIZATION-type partners
50
+
51
+ ## Test Cases
52
+
53
+ - A contact person can only be linked to an ORGANIZATION-type partner; linking to an INDIVIDUAL-type partner must be rejected
54
+ - Contact person fields firstName and lastName are required; email, phone, jobTitle, and department are optional. At least one communication channel (email or phone) must be provided
55
+ - Email format must be validated on creation and update
56
+ - A contact person is created with ACTIVE status by default
57
+ - An ACTIVE contact person can be deactivated; an INACTIVE contact person can be reactivated
58
+ - At most one contact person per organization may hold primary contact designation at any given time
59
+ - Designating a new primary contact automatically removes the designation from the previous primary contact
60
+ - A contact person marked as primary cannot be deleted; the primary designation must be transferred first
61
+ - Deactivating a primary contact person removes their primary designation; the organization has no primary contact until one is explicitly set
62
+ - Multiple contact persons with distinct roles may exist under the same organization
63
+ - Updating a contact person's details does not change their organization association or primary status
64
+ - Listing contact persons for an organization returns only those linked to that specific organization
65
+
66
+ ## Reference Links
67
+
68
+ - [SAP Business Partner Relationships](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/7b24a64d9d0941bda1afa753263d9e39/4e4dece7db1b59cde10000000a42189b.html)
69
+ - [Odoo Contacts as Child Partners](https://www.odoo.com/documentation/19.0/applications/general/contacts.html)
70
+ - [Salesforce Contact Object](https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_contact.htm)
@@ -0,0 +1,96 @@
1
+ # Partner Address Management
2
+
3
+ ## Overview
4
+
5
+ Partner Address Management allows each business partner to maintain multiple addresses, each classified by purpose (BILLING, SHIPPING, REGISTERED, or OTHER). Addresses are child entities — they cannot exist without a parent partner record — and they carry the same structured format used by the organization module's Site entity: line1, line2, city, state/province, postalCode, and country (ISO 3166-1 alpha-2). While a Site models a company-owned physical facility, a partner address models an external party's location and is owned entirely by the business-partner module.
6
+
7
+ One address per partner may be designated as the default for each address type, eliminating ambiguity when downstream modules (accounts payable, order management, shipping) need to resolve where to send an invoice, a shipment, or a legal notice. When no explicit override is provided on a transaction, the relevant default address is used automatically.
8
+
9
+ ## Business Purpose
10
+
11
+ Partners routinely operate out of more than one location and require different addresses for different purposes. This feature enables:
12
+
13
+ - Separate billing and shipping addresses so that invoices reach the accounts-payable office while goods arrive at the warehouse
14
+ - A registered address that captures the legal domicile of a corporate partner for compliance, contract, and regulatory correspondence
15
+ - An OTHER classification for secondary or informal locations not covered by the primary types
16
+ - A default-per-type designation that downstream modules can resolve without bespoke selection logic
17
+ - Structured, country-aware address fields that support postal validation and country-specific formatting rules
18
+ - Independent address lifecycle — addresses can be added, updated, or removed without altering the partner's own record or status. Adding new addresses requires the partner to be in DRAFT or ACTIVE state; INACTIVE partners may only have their existing addresses read or updated, not extended with new entries
19
+ - Preservation of address history: removing an address that has been referenced on historical transactions is prevented to maintain referential integrity
20
+
21
+ ## Process Flow
22
+
23
+ The following diagram shows the end-to-end flow for managing addresses on a partner:
24
+
25
+ ```mermaid
26
+ flowchart TD
27
+ A[Partner exists in system] --> B[Add address to partner]
28
+ B --> C[Provide structured address fields\nline1, city, postalCode, country, addressType]
29
+ C --> D{Mark as default\nfor this type?}
30
+ D -->|Yes| E[Set isDefault = true\nfor this addressType]
31
+ D -->|No| F[Address saved as non-default]
32
+ E --> G[Previous default of same type\nautomatically unset]
33
+ G --> H[Address available for\ndownstream resolution]
34
+ F --> H
35
+ H --> I{Update needed?}
36
+ I -->|Yes| J[Update address fields]
37
+ J --> H
38
+ I -->|No| K{Remove address?}
39
+ K -->|Yes| L{Address referenced\non transactions?}
40
+ L -->|Yes| M[Reject removal —\npreserve referential integrity]
41
+ L -->|No| N[Delete address]
42
+ K -->|No| H
43
+ ```
44
+
45
+ The default-resolution flow used by downstream modules:
46
+
47
+ ```mermaid
48
+ flowchart TD
49
+ A[Downstream module needs address] --> B[Specify partner + addressType]
50
+ B --> C{Default address\nexists for this type?}
51
+ C -->|Yes| D[Return default address]
52
+ C -->|No| E{Any address\nof this type exists?}
53
+ E -->|Yes| F[Return error —\ncaller must select explicitly]
54
+ E -->|No| G[Return error —\nno address of this type exists]
55
+ ```
56
+
57
+ ## Scenario Patterns
58
+
59
+ - **Separate billing and shipping**: A distributor's finance department is located at the head office, but deliveries go to a regional warehouse. Two addresses are added to the partner: one with type BILLING marked as default, one with type SHIPPING marked as default. Purchase orders automatically route the invoice to the head office and the shipment to the warehouse
60
+ - **Legal registered address**: A corporate partner is registered with a government authority at a different location from its operational offices. A REGISTERED address is added to hold the statutory address used for compliance filings and contract headers
61
+ - **Multiple shipping sites**: A large retail chain partner has three distribution centers. Three SHIPPING addresses are maintained; one is marked as the default and the others are available for explicit selection on individual orders
62
+ - **Address correction**: A partner's postal code changes after a municipal rezoning. The affected address record is updated in place without creating a new address or touching the partner's master record
63
+ - **Expanding to a new country**: A partner opens a new subsidiary in another country. A second BILLING address is added with the appropriate country code and regional postal format, and the default BILLING designation is moved to the new address
64
+ - **Removing an obsolete address**: A partner closes one of its warehouses. The corresponding SHIPPING address is removed, provided no open or historical transactions reference it
65
+ - **OTHER address for informal site**: A partner uses a forwarding agent at a location that does not fit BILLING, SHIPPING, or REGISTERED. An OTHER address is recorded to capture the forwarding address for ad hoc use
66
+
67
+ ## Test Cases
68
+
69
+ - An address cannot be created without a valid, existing parent partner
70
+ - address fields line1, city, postalCode, country, and addressType are required at creation
71
+ - line2 is optional
72
+ - country must be a valid ISO 3166-1 alpha-2 code
73
+ - addressType must be one of BILLING, SHIPPING, REGISTERED, OTHER
74
+ - A partner may hold multiple addresses of the same type
75
+ - Setting isDefault = true for an addressType automatically unsets isDefault on any previous default of the same type for the same partner
76
+ - Only one address per partner per addressType may be marked as default at any time
77
+ - Retrieving the default address for a partner and type returns exactly the address with isDefault = true for that type
78
+ - A partner can have independent defaults for BILLING, SHIPPING, REGISTERED, and OTHER simultaneously
79
+ - Updating address fields (line1, line2, city, state, postalCode, country) on an existing address record is permitted
80
+ - addressType is immutable after creation; changing type requires deleting the old address and creating a new one
81
+ - Deleting an address that is referenced on a historical or open transaction is rejected to preserve referential integrity
82
+ - Deleting the default address of a type does not automatically promote another address of the same type to default; no default exists until one is explicitly set
83
+ - Querying addresses by partner returns all addresses for that partner
84
+ - Querying addresses by partner and addressType returns only addresses of the requested type
85
+ - A partner with no addresses returns an empty list, not an error
86
+ - Reading and updating existing addresses is permitted regardless of partner status (DRAFT, ACTIVE, or INACTIVE)
87
+ - Adding new addresses to a partner requires the partner to be in DRAFT or ACTIVE state; adding to an INACTIVE partner is rejected
88
+ - When no default address exists for a requested type, the system returns an error rather than silently picking an arbitrary address; the caller must either set a default or select an address explicitly
89
+
90
+ ## Reference Links
91
+
92
+ - [SAP Business Partner Address Management (BP)](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/f76052846e404ea8811eb06534b6e099/5e13e82b8ca111d1a6090000e8353423.html)
93
+ - [Odoo Contact Addresses (child records under res.partner)](https://www.odoo.com/documentation/19.0/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/delivery_countries.html)
94
+ - [Dynamics 365 Party postal addresses](https://learn.microsoft.com/en-us/dynamics365/finance/accounts-payable/vendor-posting-profiles)
95
+ - [Oracle Supplier Sites and Addresses](https://docs.oracle.com/en/cloud/saas/procurement/24d/faaps/supplier-addresses.html)
96
+ - [ISO 3166-1 alpha-2 Country Codes](https://www.iso.org/iso-3166-country-codes.html)
@@ -0,0 +1,70 @@
1
+ # Partner Bank Account
2
+
3
+ ## Overview
4
+
5
+ Partner Bank Accounts are child entities of a Business Partner that store the banking details required to execute financial transactions with that partner. Each record captures identifying information for a single bank account: bank name, account holder name, account number, routing number, IBAN, SWIFT/BIC, and the transaction currency. A partner may hold multiple bank accounts, and one account per partner may be designated as the default to streamline payment processing.
6
+
7
+ Bank account records can be created and maintained regardless of the partner's current lifecycle state (DRAFT, ACTIVE, or INACTIVE), allowing finance teams to prepare payment details in advance and retain them after a partner is deactivated.
8
+
9
+ ## Business Purpose
10
+
11
+ Accurate bank account data is a prerequisite for both accounts payable (paying suppliers) and accounts receivable (collecting from customers). Maintaining this data on the partner record ensures downstream payment and collection workflows always have a reliable, auditable source:
12
+
13
+ - **Accounts payable**: Supplier bank details are referenced when generating payment runs, wire transfers, or ACH batches for purchase invoices
14
+ - **Accounts receivable**: Customer bank details support direct debit collection and refund processing
15
+ - **Multi-account flexibility**: Partners operating across multiple currencies or banking jurisdictions can have separate accounts per bank or currency
16
+ - **Default designation**: Finance teams can mark one account as default to reduce manual selection during routine payment processing
17
+ - **Regional field coverage**: The model supports both account-number/routing-number conventions (US/Canada) and IBAN/SWIFT conventions (Europe and international), enabling global counterparty management
18
+ - **Currency association**: Each bank account references a Currency from the primitives module, clarifying which denomination the account handles
19
+
20
+ ## Process Flow
21
+
22
+ The following diagram shows how a bank account is added to a partner and how the default designation is managed:
23
+
24
+ ```mermaid
25
+ flowchart TD
26
+ A[Select Business Partner] --> B[Add Bank Account]
27
+ B --> C[Enter Bank Details\nbankName, accountHolderName,\naccountNumber / IBAN,\nroutingNumber / SWIFT/BIC,\ncurrency]
28
+ C --> D{First account\nfor this partner?}
29
+ D -->|Yes| E[Auto-designate as default]
30
+ D -->|No| F[Save as non-default]
31
+ E --> G[Bank Account Saved]
32
+ F --> G
33
+ G --> H{Change default?}
34
+ H -->|Yes| I[Mark account as default\nPrevious default is unset]
35
+ H -->|No| J[No further action]
36
+ I --> K[Default Updated]
37
+ ```
38
+
39
+ ## Scenario Patterns
40
+
41
+ - **New supplier payment setup**: A procurement team onboards a new vendor. Before the first purchase order is issued, the AP team adds the supplier's EUR bank account (IBAN + SWIFT/BIC) and it is automatically designated as the default. Payment runs will reference this account.
42
+ - **US domestic vendor with routing**: A US-based supplier provides an ABA routing number and checking account number instead of an IBAN. Finance adds the account using `routingNumber` and `accountNumber` fields, omitting IBAN and SWIFT/BIC.
43
+ - **Multi-currency supplier**: An international supplier invoices in both USD and EUR. Two bank accounts are added — one per currency — each referencing the appropriate Currency from the primitives module. The USD account is marked as the default for domestic transactions.
44
+ - **Customer direct debit**: A customer agreement includes a direct debit mandate. The AR team records the customer's bank account so that collection runs can reference it without re-entering details each cycle.
45
+ - **Updating the default account**: A supplier notifies the company of a new primary bank account. The finance team adds the new account and marks it as default; the previous default account is retained for reference and audit but is no longer automatically selected.
46
+ - **Inactive partner retention**: A vendor is deactivated following contract expiry. Their bank accounts remain in the system for audit and potential reactivation, but the partner cannot be referenced in new payment runs while INACTIVE.
47
+
48
+ ## Test Cases
49
+
50
+ - A bank account can be added to a partner in DRAFT, ACTIVE, or INACTIVE state
51
+ - The first bank account added to a partner is automatically designated as the default
52
+ - A partner can have more than one bank account
53
+ - Marking a bank account as default unsets the default flag on all other accounts for that partner
54
+ - At most one bank account per partner can be designated as default at any time
55
+ - `bankName` is required and must be non-empty
56
+ - `accountHolderName` is required and must be non-empty
57
+ - At least one of `accountNumber` or `iban` must be provided; both may be provided simultaneously
58
+ - `routingNumber` is optional and applicable for domestic (ACH/wire) routing conventions
59
+ - `swiftBic` is optional and applicable for international transfers
60
+ - `currency` must reference a valid, existing Currency from the primitives module
61
+ - Removing a bank account that is currently designated as the default does not automatically promote another account; the partner has no default until one is explicitly designated
62
+ - Bank accounts are isolated per partner; accounts belonging to one partner are not visible on another
63
+
64
+ ## Reference Links
65
+
66
+ - [SAP Business Partner Bank Details](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/f325a3e3a5514e85aab72db8bab710c8/4b2011bb2d6b3e41e10000000a42189c.html)
67
+ - [Odoo Partner Bank Accounts (res.partner.bank)](https://www.odoo.com/documentation/19.0/applications/accounting/payments/pay.html)
68
+ - [Oracle Supplier Bank Accounts](https://docs.oracle.com/en/cloud/saas/financials/24b/fappp/manage-supplier-bank-accounts.html)
69
+ - [ISO 9362 SWIFT/BIC Standard](https://www.iso.org/standard/60390.html)
70
+ - [ISO 13616 IBAN Standard](https://www.iso.org/standard/81090.html)
@@ -0,0 +1,76 @@
1
+ # Partner Identification
2
+
3
+ ## Overview
4
+
5
+ Partner Identification allows storing official registration numbers — such as tax IDs, VAT numbers, DUNS numbers, and company registry codes — against a business partner. Each identification record captures the type, value, and optional metadata including issuing country and validity period. A single partner can hold multiple identification records of different types, reflecting the reality that organisations are often registered across multiple jurisdictions or recognised by more than one authority.
6
+
7
+ Identifications are child entities of a business partner and can be added at any point in the partner's lifecycle. Uniqueness is enforced on the combination of type and value within a company scope, preventing the same registration number from being attached to duplicate partner records. This scoping is intentionally company-level; cross-company deduplication is out of scope for the initial implementation and may be introduced as a future enhancement if shared-counterparty scenarios arise.
8
+
9
+ ## Business Purpose
10
+
11
+ Accurate partner identification data is required for legal compliance and operational integrity:
12
+
13
+ - **Tax reporting and invoicing**: Tax ID and VAT number must appear on invoices in many jurisdictions. Storing them on the partner record ensures they are available for document generation without manual entry
14
+ - **Know Your Customer (KYC)**: Onboarding processes in regulated industries require verified registration numbers to confirm a partner's legal identity before commencing trade
15
+ - **Duplicate detection**: Enforcing uniqueness on (type, value) within a company scope prevents the same real-world entity from existing as multiple partner records
16
+ - **Cross-border trade**: A partner operating in multiple countries may hold a domestic tax ID, a regional VAT number (e.g., EU VAT), and an international identifier (e.g., DUNS). All can be stored concurrently
17
+ - **Audit trail and compliance**: Validity dates on identification records support time-bounded compliance checks and historical audit requirements
18
+
19
+ ## Process Flow
20
+
21
+ The typical flow for recording and using partner identifications:
22
+
23
+ ```mermaid
24
+ flowchart TD
25
+ A[Select Business Partner] --> B[Add Identification]
26
+ B --> C{Type already present\nwith same value?}
27
+ C -->|Yes - duplicate| D[Reject: uniqueness violation]
28
+ C -->|No| E[Store Identification\ntype + value + metadata]
29
+ E --> F{More IDs to add?}
30
+ F -->|Yes| B
31
+ F -->|No| G[Partner Identifications Complete]
32
+ G --> H[Use in invoicing / tax reporting / KYC]
33
+ ```
34
+
35
+ Identification validity is checked at the point of use:
36
+
37
+ ```mermaid
38
+ flowchart TD
39
+ A[Retrieve Partner Identification] --> B{validFrom / validTo set?}
40
+ B -->|No| C[Identification is always valid]
41
+ B -->|Yes| D{Current date within range?}
42
+ D -->|Yes| E[Identification is valid]
43
+ D -->|No| F[Identification is expired or not yet active]
44
+ ```
45
+
46
+ ## Scenario Patterns
47
+
48
+ - **Domestic tax registration**: A supplier is onboarded for a single country. A `TAX_ID` identification is added with the national tax number and the issuing country set to the supplier's home country
49
+ - **EU VAT number**: A European partner holds both a domestic `TAX_ID` and an EU-wide `VAT` number. Both are stored as separate identification records on the same partner
50
+ - **DUNS for procurement**: A large enterprise uses DUNS numbers in its supplier qualification process. A `DUNS` identification is added and used to cross-reference the partner against third-party credit and risk databases
51
+ - **Company registry reference**: A partner's legal registration number from a national company registry is stored as `COMPANY_REGISTRY`, enabling verification against public registers
52
+ - **National ID for individual partners**: An individual business partner (e.g., a sole trader) has a `NATIONAL_ID` stored as their primary identification
53
+ - **Time-bounded VAT registration**: A partner's VAT registration is valid from a specific date. The `validFrom` field is set so that downstream processes can determine whether the VAT number applies to a given transaction date
54
+ - **Duplicate partner prevention**: An operator attempts to add a `TAX_ID` with a value already recorded on another partner. The system rejects the entry, surfacing the conflict so the operator can merge or review the existing partner record
55
+ - **Other / custom identifiers**: A partner holds an identifier that does not fit any standard type (e.g., an industry-specific accreditation number). It is stored under type `OTHER` with a descriptive value
56
+
57
+ ## Test Cases
58
+
59
+ - An identification requires both `type` and `value`; records missing either field are rejected
60
+ - Supported types are: `TAX_ID`, `VAT`, `DUNS`, `COMPANY_REGISTRY`, `NATIONAL_ID`, `OTHER`
61
+ - The combination of (type, value) must be unique within the company scope (intentionally company-level; cross-company deduplication is not enforced); attempting to create a duplicate within the same company is rejected
62
+ - A single partner can hold multiple identification records with different types
63
+ - Two partners may not share an identification record with the same (type, value) combination
64
+ - `issuingCountry`, `validFrom`, and `validTo` are optional and may be omitted
65
+ - When both `validFrom` and `validTo` are set, `validTo` must be equal to or later than `validFrom`
66
+ - Identifications can be added to partners in any lifecycle state (DRAFT, ACTIVE, INACTIVE)
67
+ - An identification record can be deleted without affecting the parent partner or other identifications
68
+ - `type` is immutable after creation; changing the identification type requires deleting the existing record and creating a new one
69
+ - Updating an identification's value must re-validate the (type, value) uniqueness constraint
70
+
71
+ ## Reference Links
72
+
73
+ - [SAP Business Partner — Tax Numbers and Identification](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/f544846954f24b9183edd4ca52275847/d6a0de9fd00f4ab2843e013d7a8f5380.html)
74
+ - [Odoo Fiscal Information — VAT and Company Registry](https://www.odoo.com/documentation/19.0/applications/accounting/accounting/taxes/taxcloud.html)
75
+ - [Oracle Supplier Tax Registrations](https://docs.oracle.com/en/cloud/saas/financials/24a/fappp/supplier-registration.html)
76
+ - [DUNS Number — Dun & Bradstreet](https://www.dnb.com/duns-number.html)