@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,105 @@
1
+ import { ok, err, type CommandContext } from "../../../shared";
2
+ import type { Transaction } from "../generated/kysely-tailordb";
3
+ import {
4
+ IdentificationNotFoundError,
5
+ InvalidValueError,
6
+ DuplicateIdentificationError,
7
+ InvalidValidityPeriodError,
8
+ } from "../lib/errors.generated";
9
+
10
+ export interface UpdatePartnerIdentificationInput {
11
+ id: string;
12
+ value?: string;
13
+ issuingCountry?: string;
14
+ validFrom?: Date;
15
+ validTo?: Date;
16
+ }
17
+
18
+ /**
19
+ * Function: updatePartnerIdentification
20
+ *
21
+ * Updates an existing partner identification record.
22
+ * Type is immutable. Re-validates (type, value) uniqueness if value changes.
23
+ * Validates validity period using merged result with existing data.
24
+ */
25
+ export async function run<CF extends Record<string, unknown>>(
26
+ db: Transaction,
27
+ input: UpdatePartnerIdentificationInput & CF,
28
+ _ctx: CommandContext,
29
+ ) {
30
+ const { id, value, issuingCountry, validFrom, validTo, ...customFields } = input;
31
+
32
+ // 1. Check identification exists
33
+ const existing = await db
34
+ .selectFrom("PartnerIdentification")
35
+ .selectAll()
36
+ .where("id", "=", id)
37
+ .forUpdate()
38
+ .executeTakeFirst();
39
+
40
+ if (!existing) {
41
+ return err(new IdentificationNotFoundError(id));
42
+ }
43
+
44
+ // 2. Validate value is non-empty if provided
45
+ if (value !== undefined && (!value || value.trim() === "")) {
46
+ return err(new InvalidValueError(value ?? ""));
47
+ }
48
+
49
+ // 3. If value changed, re-validate (type, value) uniqueness within company scope
50
+ if (value !== undefined && value !== existing.value) {
51
+ // Get the partner to find companyId
52
+ const partner = await db
53
+ .selectFrom("BusinessPartner")
54
+ .selectAll()
55
+ .where("id", "=", existing.partnerId)
56
+ .executeTakeFirst();
57
+
58
+ const duplicate = await db
59
+ .selectFrom("PartnerIdentification")
60
+ .innerJoin("BusinessPartner", "BusinessPartner.id", "PartnerIdentification.partnerId")
61
+ .selectAll("PartnerIdentification")
62
+ .where("BusinessPartner.companyId", "=", partner!.companyId)
63
+ .where("PartnerIdentification.type", "=", existing.type)
64
+ .where("PartnerIdentification.value", "=", value)
65
+ .executeTakeFirst();
66
+
67
+ if (duplicate) {
68
+ return err(new DuplicateIdentificationError(`${existing.type}:${value}`));
69
+ }
70
+ }
71
+
72
+ // 4. Validate validity period (merge with existing)
73
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- null means "clear the field", distinct from undefined (not provided)
74
+ const effectiveFrom = validFrom !== undefined ? validFrom : existing.validFrom;
75
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
76
+ const effectiveTo = validTo !== undefined ? validTo : existing.validTo;
77
+
78
+ if (effectiveFrom && effectiveTo && effectiveTo < effectiveFrom) {
79
+ return err(
80
+ new InvalidValidityPeriodError(
81
+ `${effectiveFrom instanceof Date ? effectiveFrom.toISOString() : effectiveFrom} - ${effectiveTo instanceof Date ? effectiveTo.toISOString() : effectiveTo}`,
82
+ ),
83
+ );
84
+ }
85
+
86
+ // 5. Build update set
87
+ const updateSet: Record<string, unknown> = {
88
+ ...customFields,
89
+ updatedAt: new Date(),
90
+ };
91
+ if (value !== undefined) updateSet.value = value;
92
+ if (issuingCountry !== undefined) updateSet.issuingCountry = issuingCountry;
93
+ if (validFrom !== undefined) updateSet.validFrom = validFrom;
94
+ if (validTo !== undefined) updateSet.validTo = validTo;
95
+
96
+ // 6. Update record
97
+ const identification = await db
98
+ .updateTable("PartnerIdentification")
99
+ .set(updateSet)
100
+ .where("id", "=", id)
101
+ .returningAll()
102
+ .executeTakeFirstOrThrow();
103
+
104
+ return ok({ identification });
105
+ }
File without changes
@@ -0,0 +1,59 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ type TailorAnyDBType,
5
+ unsafeAllowAllGqlPermission,
6
+ unsafeAllowAllTypePermission,
7
+ } from "@tailor-platform/sdk";
8
+ import { company as companyStub, currency as currencyStub } from "../lib/_db_deps";
9
+
10
+ export const BASE_PARTNER_STATUSES = ["DRAFT", "ACTIVE", "INACTIVE"] as const;
11
+
12
+ export const PARTNER_TYPES = ["ORGANIZATION", "INDIVIDUAL"] as const;
13
+
14
+ export interface CreateBusinessPartnerTypeParams<F extends Record<string, TailorAnyDBField>> {
15
+ fields?: F;
16
+ additionalStatuses?: string[];
17
+ companyType?: TailorAnyDBType;
18
+ currencyType?: TailorAnyDBType;
19
+ }
20
+
21
+ export function createBusinessPartnerType<const F extends Record<string, TailorAnyDBField>>(
22
+ params: CreateBusinessPartnerTypeParams<F>,
23
+ ) {
24
+ const statuses = [...BASE_PARTNER_STATUSES, ...(params.additionalStatuses ?? [])] as [
25
+ string,
26
+ ...string[],
27
+ ];
28
+
29
+ return db
30
+ .type("BusinessPartner", {
31
+ name: db.string().description("Business partner display name"),
32
+ type: db
33
+ .enum(["ORGANIZATION", "INDIVIDUAL"])
34
+ .description("Partner type: ORGANIZATION or INDIVIDUAL"),
35
+ companyId: db
36
+ .uuid()
37
+ .relation({
38
+ type: "n-1",
39
+ toward: { type: params.companyType ?? companyStub },
40
+ backward: "businessPartners",
41
+ })
42
+ .description("Foreign key to Company from organization module"),
43
+ preferredCurrencyId: db
44
+ .uuid({ optional: true })
45
+ .relation({
46
+ type: "n-1",
47
+ toward: { type: params.currencyType ?? currencyStub },
48
+ backward: "businessPartners",
49
+ })
50
+ .description("Optional preferred transaction currency"),
51
+ status: db.enum(statuses).description("Lifecycle status: DRAFT, ACTIVE, INACTIVE"),
52
+ ...((params.fields ?? {}) as F),
53
+ ...db.fields.timestamps(),
54
+ })
55
+ .permission(unsafeAllowAllTypePermission)
56
+ .gqlPermission(unsafeAllowAllGqlPermission);
57
+ }
58
+
59
+ export const businessPartner = createBusinessPartnerType({});
@@ -0,0 +1,49 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ unsafeAllowAllGqlPermission,
5
+ unsafeAllowAllTypePermission,
6
+ } from "@tailor-platform/sdk";
7
+ import { businessPartner } from "./businessPartner";
8
+
9
+ export const BASE_CONTACT_STATUSES = ["ACTIVE", "INACTIVE"] as const;
10
+
11
+ export interface CreateContactPersonTypeParams<F extends Record<string, TailorAnyDBField>> {
12
+ fields?: F;
13
+ additionalStatuses?: string[];
14
+ }
15
+
16
+ export function createContactPersonType<const F extends Record<string, TailorAnyDBField>>(
17
+ params: CreateContactPersonTypeParams<F>,
18
+ ) {
19
+ const statuses = [...BASE_CONTACT_STATUSES, ...(params.additionalStatuses ?? [])] as [
20
+ string,
21
+ ...string[],
22
+ ];
23
+
24
+ return db
25
+ .type("ContactPerson", {
26
+ partnerId: db
27
+ .uuid()
28
+ .relation({
29
+ type: "n-1",
30
+ toward: { type: businessPartner },
31
+ backward: "contactPersons",
32
+ })
33
+ .description("Foreign key to ORGANIZATION-type BusinessPartner"),
34
+ firstName: db.string().description("Contact person first name"),
35
+ lastName: db.string().description("Contact person last name"),
36
+ email: db.string({ optional: true }).description("Contact person email address"),
37
+ phone: db.string({ optional: true }).description("Contact person phone number"),
38
+ jobTitle: db.string({ optional: true }).description("Contact person job title"),
39
+ department: db.string({ optional: true }).description("Contact person department"),
40
+ isPrimary: db.bool().description("Whether this is the primary contact for the organization"),
41
+ status: db.enum(statuses).description("Contact person status: ACTIVE or INACTIVE"),
42
+ ...((params.fields ?? {}) as F),
43
+ ...db.fields.timestamps(),
44
+ })
45
+ .permission(unsafeAllowAllTypePermission)
46
+ .gqlPermission(unsafeAllowAllGqlPermission);
47
+ }
48
+
49
+ export const contactPerson = createContactPersonType({});
@@ -0,0 +1,45 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ unsafeAllowAllGqlPermission,
5
+ unsafeAllowAllTypePermission,
6
+ } from "@tailor-platform/sdk";
7
+ import { businessPartner } from "./businessPartner";
8
+
9
+ export const ADDRESS_TYPES = ["BILLING", "SHIPPING", "REGISTERED", "OTHER"] as const;
10
+
11
+ export interface CreatePartnerAddressTypeParams<F extends Record<string, TailorAnyDBField>> {
12
+ fields?: F;
13
+ }
14
+
15
+ export function createPartnerAddressType<const F extends Record<string, TailorAnyDBField>>(
16
+ params: CreatePartnerAddressTypeParams<F>,
17
+ ) {
18
+ return db
19
+ .type("PartnerAddress", {
20
+ partnerId: db
21
+ .uuid()
22
+ .relation({
23
+ type: "n-1",
24
+ toward: { type: businessPartner },
25
+ backward: "partnerAddresses",
26
+ })
27
+ .description("Foreign key to BusinessPartner"),
28
+ addressType: db
29
+ .enum(["BILLING", "SHIPPING", "REGISTERED", "OTHER"])
30
+ .description("Address purpose: BILLING, SHIPPING, REGISTERED, OTHER"),
31
+ line1: db.string().description("Address line 1"),
32
+ line2: db.string({ optional: true }).description("Address line 2"),
33
+ city: db.string().description("City"),
34
+ state: db.string({ optional: true }).description("State or province"),
35
+ postalCode: db.string().description("Postal code"),
36
+ country: db.string().description("ISO 3166-1 alpha-2 country code"),
37
+ isDefault: db.bool().description("Whether this is the default address for its type"),
38
+ ...((params.fields ?? {}) as F),
39
+ ...db.fields.timestamps(),
40
+ })
41
+ .permission(unsafeAllowAllTypePermission)
42
+ .gqlPermission(unsafeAllowAllGqlPermission);
43
+ }
44
+
45
+ export const partnerAddress = createPartnerAddressType({});
@@ -0,0 +1,53 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ type TailorAnyDBType,
5
+ unsafeAllowAllGqlPermission,
6
+ unsafeAllowAllTypePermission,
7
+ } from "@tailor-platform/sdk";
8
+ import { currency as currencyStub } from "../lib/_db_deps";
9
+ import { businessPartner } from "./businessPartner";
10
+
11
+ export interface CreatePartnerBankAccountTypeParams<F extends Record<string, TailorAnyDBField>> {
12
+ fields?: F;
13
+ currencyType?: TailorAnyDBType;
14
+ }
15
+
16
+ export function createPartnerBankAccountType<const F extends Record<string, TailorAnyDBField>>(
17
+ params: CreatePartnerBankAccountTypeParams<F>,
18
+ ) {
19
+ return db
20
+ .type("PartnerBankAccount", {
21
+ partnerId: db
22
+ .uuid()
23
+ .relation({
24
+ type: "n-1",
25
+ toward: { type: businessPartner },
26
+ backward: "partnerBankAccounts",
27
+ })
28
+ .description("Foreign key to BusinessPartner"),
29
+ bankName: db.string().description("Name of the bank"),
30
+ accountHolderName: db.string().description("Name of the account holder"),
31
+ accountNumber: db.string({ optional: true }).description("Bank account number"),
32
+ routingNumber: db.string({ optional: true }).description("Domestic routing number"),
33
+ iban: db.string({ optional: true }).description("International Bank Account Number"),
34
+ swiftBic: db
35
+ .string({ optional: true })
36
+ .description("SWIFT/BIC code for international transfers"),
37
+ currencyId: db
38
+ .uuid()
39
+ .relation({
40
+ type: "n-1",
41
+ toward: { type: params.currencyType ?? currencyStub },
42
+ backward: "partnerBankAccounts",
43
+ })
44
+ .description("Foreign key to Currency from primitives module"),
45
+ isDefault: db.bool().description("Whether this is the default bank account for the partner"),
46
+ ...((params.fields ?? {}) as F),
47
+ ...db.fields.timestamps(),
48
+ })
49
+ .permission(unsafeAllowAllTypePermission)
50
+ .gqlPermission(unsafeAllowAllGqlPermission);
51
+ }
52
+
53
+ export const partnerBankAccount = createPartnerBankAccountType({});
@@ -0,0 +1,53 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ unsafeAllowAllGqlPermission,
5
+ unsafeAllowAllTypePermission,
6
+ } from "@tailor-platform/sdk";
7
+ import { businessPartner } from "./businessPartner";
8
+
9
+ export const IDENTIFICATION_TYPES = [
10
+ "TAX_ID",
11
+ "VAT",
12
+ "DUNS",
13
+ "COMPANY_REGISTRY",
14
+ "NATIONAL_ID",
15
+ "OTHER",
16
+ ] as const;
17
+
18
+ export interface CreatePartnerIdentificationTypeParams<F extends Record<string, TailorAnyDBField>> {
19
+ fields?: F;
20
+ }
21
+
22
+ export function createPartnerIdentificationType<const F extends Record<string, TailorAnyDBField>>(
23
+ params: CreatePartnerIdentificationTypeParams<F>,
24
+ ) {
25
+ return db
26
+ .type("PartnerIdentification", {
27
+ partnerId: db
28
+ .uuid()
29
+ .relation({
30
+ type: "n-1",
31
+ toward: { type: businessPartner },
32
+ backward: "partnerIdentifications",
33
+ })
34
+ .description("Foreign key to BusinessPartner"),
35
+ type: db
36
+ .enum(["TAX_ID", "VAT", "DUNS", "COMPANY_REGISTRY", "NATIONAL_ID", "OTHER"])
37
+ .description(
38
+ "Identification type: TAX_ID, VAT, DUNS, COMPANY_REGISTRY, NATIONAL_ID, OTHER",
39
+ ),
40
+ value: db.string().description("Identification value (e.g., tax number, VAT number)"),
41
+ issuingCountry: db
42
+ .string({ optional: true })
43
+ .description("ISO 3166-1 alpha-2 country code of the issuing authority"),
44
+ validFrom: db.date({ optional: true }).description("Start date of validity period"),
45
+ validTo: db.date({ optional: true }).description("End date of validity period"),
46
+ ...((params.fields ?? {}) as F),
47
+ ...db.fields.timestamps(),
48
+ })
49
+ .permission(unsafeAllowAllTypePermission)
50
+ .gqlPermission(unsafeAllowAllGqlPermission);
51
+ }
52
+
53
+ export const partnerIdentification = createPartnerIdentificationType({});
@@ -0,0 +1,43 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ unsafeAllowAllGqlPermission,
5
+ unsafeAllowAllTypePermission,
6
+ } from "@tailor-platform/sdk";
7
+ import { businessPartner } from "./businessPartner";
8
+
9
+ export const PARTNER_ROLES = ["CUSTOMER", "SUPPLIER"] as const;
10
+
11
+ export interface CreatePartnerRoleTypeParams<F extends Record<string, TailorAnyDBField>> {
12
+ fields?: F;
13
+ }
14
+
15
+ export function createPartnerRoleType<const F extends Record<string, TailorAnyDBField>>(
16
+ params: CreatePartnerRoleTypeParams<F>,
17
+ ) {
18
+ return db
19
+ .type("PartnerRole", {
20
+ partnerId: db
21
+ .uuid()
22
+ .relation({
23
+ type: "n-1",
24
+ toward: { type: businessPartner },
25
+ backward: "partnerRoles",
26
+ })
27
+ .description("Foreign key to BusinessPartner"),
28
+ role: db
29
+ .enum(["CUSTOMER", "SUPPLIER"])
30
+ .description("Role classification: CUSTOMER or SUPPLIER"),
31
+ ...((params.fields ?? {}) as F),
32
+ ...db.fields.timestamps(),
33
+ })
34
+ .indexes({
35
+ fields: ["partnerId", "role"],
36
+ unique: true,
37
+ name: "partner_role_unique_idx",
38
+ })
39
+ .permission(unsafeAllowAllTypePermission)
40
+ .gqlPermission(unsafeAllowAllGqlPermission);
41
+ }
42
+
43
+ export const partnerRole = createPartnerRoleType({});
@@ -0,0 +1,39 @@
1
+ # ActivatePartner
2
+
3
+ ## Overview
4
+
5
+ activatePartner transitions a business partner from DRAFT to ACTIVE status, making the partner eligible for role assignments, transactions, and other downstream operations. Only partners in DRAFT status can be activated.
6
+
7
+ ## Business Rules
8
+
9
+ - Partner must exist in the system
10
+ - Partner must be in DRAFT status
11
+ - After activation, the partner can be assigned roles and participate in transactions
12
+
13
+ ## Process Flow
14
+
15
+ ```mermaid
16
+ flowchart TD
17
+ A[Receive activate request] --> B{Partner exists?}
18
+ B -->|No| C[Return error: not found]
19
+ B -->|Yes| D{Status is DRAFT?}
20
+ D -->|No| E[Return error: invalid state transition]
21
+ D -->|Yes| F[Update status to ACTIVE]
22
+ F --> G[Return activated partner]
23
+ ```
24
+
25
+ ## External Dependencies
26
+
27
+ - None
28
+
29
+ ## Error Scenarios
30
+
31
+ - **PARTNER_NOT_FOUND**: Specified partner ID does not exist
32
+ - **INVALID_STATE_TRANSITION**: The required state transition is not valid for the current status
33
+
34
+ ## Test Cases
35
+
36
+ - activates a DRAFT partner
37
+ - returns error when partner not found
38
+ - returns error when partner is ACTIVE
39
+ - returns error when partner is INACTIVE
@@ -0,0 +1,49 @@
1
+ # AssignRoleToPartner
2
+
3
+ ## Overview
4
+
5
+ assignRoleToPartner assigns a business role (CUSTOMER or SUPPLIER) to an active partner. Roles determine which business processes a partner can participate in. A partner can hold multiple roles simultaneously (e.g., both CUSTOMER and SUPPLIER). The operation is idempotent — assigning a role that is already present does not produce an error.
6
+
7
+ ## Business Rules
8
+
9
+ - Partner must exist in the system
10
+ - Partner must be in ACTIVE status
11
+ - Role must be a valid value (CUSTOMER or SUPPLIER)
12
+ - A partner can hold multiple roles simultaneously
13
+ - Assignment is idempotent — re-assigning an existing role succeeds without error
14
+
15
+ ## Process Flow
16
+
17
+ ```mermaid
18
+ flowchart TD
19
+ A[Receive assign role request] --> B{Partner exists?}
20
+ B -->|No| C[Return error: partner not found]
21
+ B -->|Yes| D{Partner is ACTIVE?}
22
+ D -->|No| E[Return error: partner not active]
23
+ D -->|Yes| F{Role valid?}
24
+ F -->|No| G[Return error: invalid role]
25
+ F -->|Yes| H{Role already assigned?}
26
+ H -->|Yes| I[Return success - idempotent]
27
+ H -->|No| J[Assign role to partner]
28
+ J --> K[Return updated partner]
29
+ ```
30
+
31
+ ## External Dependencies
32
+
33
+ - None
34
+
35
+ ## Error Scenarios
36
+
37
+ - **PARTNER_NOT_FOUND**: Specified partner ID does not exist
38
+ - **PARTNER_NOT_ACTIVE**: Partner is not in ACTIVE status
39
+ - **INVALID_ROLE**: Role is not CUSTOMER or SUPPLIER
40
+
41
+ ## Test Cases
42
+
43
+ - assigns CUSTOMER to partner with no roles
44
+ - assigns SUPPLIER to partner that already holds CUSTOMER
45
+ - idempotent when role already assigned
46
+ - returns error when partner not found
47
+ - returns error when partner is INACTIVE
48
+ - returns error when partner is DRAFT
49
+ - returns error when role is invalid
@@ -0,0 +1,59 @@
1
+ # CreateContactPerson
2
+
3
+ ## Overview
4
+
5
+ createContactPerson adds a contact person to an organization-type business partner. Contact persons represent individuals within an organization who serve as points of contact for business communications. At least one communication channel (email or phone) is required. Contact persons are created in ACTIVE status.
6
+
7
+ ## Business Rules
8
+
9
+ - Partner must exist in the system
10
+ - Partner must be of type ORGANIZATION — contact persons cannot be added to INDIVIDUAL partners
11
+ - First name and last name are required and must be non-empty
12
+ - At least one of email or phone must be provided
13
+ - Email, if provided, must be in a valid format
14
+ - Contact person is created in ACTIVE status
15
+
16
+ ## Process Flow
17
+
18
+ ```mermaid
19
+ flowchart TD
20
+ A[Receive create request] --> B{Partner exists?}
21
+ B -->|No| C[Return error: partner not found]
22
+ B -->|Yes| D{Partner is ORGANIZATION?}
23
+ D -->|No| E[Return error: partner not organization]
24
+ D -->|Yes| F1{firstName and lastName non-empty?}
25
+ F1 -->|No| F2[Return error: invalid name]
26
+ F1 -->|Yes| F{Email or phone provided?}
27
+ F -->|No| G[Return error: missing communication channel]
28
+ F -->|Yes| H{Email provided?}
29
+ H -->|Yes| I{Email format valid?}
30
+ I -->|No| J[Return error: invalid email format]
31
+ I -->|Yes| K[Create contact person in ACTIVE status]
32
+ H -->|No| K
33
+ K --> L[Return created contact person]
34
+ ```
35
+
36
+ ## External Dependencies
37
+
38
+ - None
39
+
40
+ ## Error Scenarios
41
+
42
+ - **PARTNER_NOT_FOUND**: Specified partner ID does not exist
43
+ - **PARTNER_NOT_ORGANIZATION**: Partner is of type INDIVIDUAL, not ORGANIZATION
44
+ - **INVALID_FIRST_NAME**: First name is empty or not provided
45
+ - **INVALID_LAST_NAME**: Last name is empty or not provided
46
+ - **MISSING_COMMUNICATION_CHANNEL**: Neither email nor phone was provided
47
+ - **INVALID_EMAIL_FORMAT**: Provided email is not in a valid format
48
+
49
+ ## Test Cases
50
+
51
+ - creates contact person
52
+ - returns error when partner not found
53
+ - returns error when partner is INDIVIDUAL
54
+ - returns error when firstName is empty
55
+ - returns error when lastName is empty
56
+ - returns error when neither email nor phone provided
57
+ - returns error for invalid email format
58
+ - returns error when whitespace-only channels provided as only communication
59
+ - creates with ACTIVE status
@@ -0,0 +1,54 @@
1
+ # CreatePartner
2
+
3
+ ## Overview
4
+
5
+ createPartner establishes a new business partner in the system. Partners represent external entities (organizations or individuals) with which the company conducts business. Every partner is created in DRAFT status, allowing review and enrichment before activation. The partner type (ORGANIZATION or INDIVIDUAL) is set at creation and cannot be changed afterward.
6
+
7
+ ## Business Rules
8
+
9
+ - Name is required and must be non-empty
10
+ - Type is required and must be one of ORGANIZATION or INDIVIDUAL
11
+ - Type is immutable after creation — it cannot be changed once assigned
12
+ - Partner is always created in DRAFT status regardless of input
13
+ - Preferred currency, if provided, must reference an existing Currency in the primitives module
14
+ - Company ID must reference an existing Company in the organization module
15
+
16
+ ## Process Flow
17
+
18
+ ```mermaid
19
+ flowchart TD
20
+ A[Receive create request] --> B{Company exists?}
21
+ B -->|No| C[Return error: company not found]
22
+ B -->|Yes| D{Name non-empty?}
23
+ D -->|No| E[Return error: invalid name]
24
+ D -->|Yes| F{Type valid?}
25
+ F -->|No| G[Return error: invalid partner type]
26
+ F -->|Yes| H{Currency provided?}
27
+ H -->|Yes| I{Currency exists?}
28
+ I -->|No| J[Return error: currency not found]
29
+ I -->|Yes| K[Create partner in DRAFT status]
30
+ H -->|No| K
31
+ K --> L[Return created partner]
32
+ ```
33
+
34
+ ## External Dependencies
35
+
36
+ - [organization::Company](../../../organization/docs/models/Company.md) - Validates that the referenced company exists
37
+ - [primitives::Currency](../../../primitives/docs/models/Currency.md) - Validates that the referenced preferred currency exists (when provided)
38
+
39
+ ## Error Scenarios
40
+
41
+ - **COMPANY_NOT_FOUND**: Specified company ID does not exist
42
+ - **INVALID_NAME**: Name is empty or not provided
43
+ - **INVALID_PARTNER_TYPE**: Type is not ORGANIZATION or INDIVIDUAL
44
+ - **CURRENCY_NOT_FOUND**: Referenced preferred currency does not exist
45
+
46
+ ## Test Cases
47
+
48
+ - creates partner in DRAFT status
49
+ - returns error when company not found
50
+ - returns error when type is invalid
51
+ - returns error when name is empty
52
+ - creates partner without preferred currency
53
+ - creates partner with preferred currency
54
+ - returns error when currency not found
@@ -0,0 +1,60 @@
1
+ # CreatePartnerAddress
2
+
3
+ ## Overview
4
+
5
+ createPartnerAddress adds a physical or mailing address to a business partner. Addresses are categorized by type and can be designated as default for their type. Partners in DRAFT or ACTIVE status can have addresses added, but INACTIVE partners cannot receive new addresses. When an address is set as default, any previous default of the same type for that partner is automatically unset.
6
+
7
+ ## Business Rules
8
+
9
+ - Partner must exist in the system
10
+ - Partner must be in DRAFT or ACTIVE status (not INACTIVE)
11
+ - Address type must be a valid enum value
12
+ - Line1, city, postal code, and country are required
13
+ - Country must be a valid ISO 3166-1 alpha-2 code
14
+ - If isDefault is true, the previous default address of the same type for the partner is unset
15
+
16
+ ## Process Flow
17
+
18
+ ```mermaid
19
+ flowchart TD
20
+ A[Receive create request] --> B{Partner exists?}
21
+ B -->|No| C[Return error: partner not found]
22
+ B -->|Yes| D{Partner is INACTIVE?}
23
+ D -->|Yes| E[Return error: partner inactive]
24
+ D -->|No| F{Address type valid?}
25
+ F -->|No| G[Return error: invalid address type]
26
+ F -->|Yes| H1{line1, city, postalCode non-empty?}
27
+ H1 -->|No| H2[Return error: missing required address field]
28
+ H1 -->|Yes| H{Country code valid?}
29
+ H -->|No| I[Return error: invalid country code]
30
+ H -->|Yes| J{isDefault true?}
31
+ J -->|Yes| K[Unset previous default of same type]
32
+ K --> L[Create address as default]
33
+ J -->|No| L[Create address record]
34
+ L --> M[Return created address]
35
+ ```
36
+
37
+ ## External Dependencies
38
+
39
+ - None
40
+
41
+ ## Error Scenarios
42
+
43
+ - **PARTNER_NOT_FOUND**: Specified partner ID does not exist
44
+ - **PARTNER_INACTIVE**: Partner is in INACTIVE status
45
+ - **INVALID_ADDRESS_TYPE**: Address type is not a valid enum value
46
+ - **MISSING_REQUIRED_ADDRESS_FIELD**: One or more required fields (line1, city, postalCode) are empty or not provided
47
+ - **INVALID_COUNTRY_CODE**: Country is not a valid ISO 3166-1 alpha-2 code
48
+
49
+ ## Test Cases
50
+
51
+ - creates address for active partner
52
+ - creates address for draft partner
53
+ - returns error when partner not found
54
+ - returns error when partner is inactive
55
+ - returns error when address type is invalid
56
+ - returns error when required fields missing
57
+ - returns error when country code is invalid
58
+ - returns error when country code is lowercase
59
+ - creates non-default address
60
+ - unsets previous default when creating with isDefault true