@tailor-platform/erp-kit 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +35 -7
  3. package/dist/cli.mjs +779 -268
  4. package/package.json +5 -4
  5. package/skills/erp-kit-app-1-requirements/SKILL.md +8 -9
  6. package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +4 -0
  7. package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +4 -0
  8. package/skills/erp-kit-app-3-plan/SKILL.md +27 -27
  9. package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +21 -17
  10. package/skills/erp-kit-app-3-plan/references/screen-extraction.md +15 -1
  11. package/skills/erp-kit-app-3-plan/references/story-extraction.md +8 -2
  12. package/skills/erp-kit-app-5-impl-backend/SKILL.md +9 -11
  13. package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -22
  14. package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +0 -1
  15. package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +13 -4
  16. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +5 -0
  17. package/skills/erp-kit-app-6-impl-frontend/references/pages.md +16 -46
  18. package/skills/erp-kit-app-7-impl-review/SKILL.md +13 -11
  19. package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +16 -17
  20. package/skills/erp-kit-module-1-requirements/SKILL.md +6 -12
  21. package/skills/erp-kit-module-2-requirements-review/SKILL.md +21 -5
  22. package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +19 -0
  23. package/skills/erp-kit-module-3-plan/SKILL.md +2 -4
  24. package/skills/erp-kit-module-4-plan-review/SKILL.md +21 -5
  25. package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +15 -0
  26. package/skills/erp-kit-module-6-impl-review/SKILL.md +21 -7
  27. package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +15 -0
  28. package/skills/erp-kit-module-shared/SKILL.md +4 -0
  29. package/src/commands/app/index.ts +28 -17
  30. package/src/commands/check.test.ts +1 -1
  31. package/src/commands/check.ts +2 -35
  32. package/src/commands/doc/index.ts +83 -0
  33. package/src/commands/doc/module.test.ts +119 -0
  34. package/src/commands/doc/module.ts +114 -0
  35. package/src/commands/doc/modules.test.ts +103 -0
  36. package/src/commands/doc/modules.ts +98 -0
  37. package/src/commands/doc/search.test.ts +94 -0
  38. package/src/commands/doc/search.ts +111 -0
  39. package/src/commands/generate-doc.ts +17 -10
  40. package/src/commands/index.ts +20 -8
  41. package/src/commands/lib/command-result.ts +30 -0
  42. package/src/commands/lib/discovery.test.ts +74 -0
  43. package/src/commands/lib/discovery.ts +106 -0
  44. package/src/commands/lib/paths.ts +22 -0
  45. package/src/commands/lib/sync-check-source.test.ts +197 -0
  46. package/src/commands/lib/sync-check-source.ts +100 -0
  47. package/src/commands/lib/sync-check-tests.test.ts +178 -0
  48. package/src/commands/lib/sync-check-tests.ts +69 -0
  49. package/src/commands/mock/index.ts +11 -6
  50. package/src/commands/module/generate.ts +13 -8
  51. package/src/commands/module/index.ts +17 -21
  52. package/src/commands/parse-doc-test-cases.ts +13 -2
  53. package/src/commands/sync-check.test.ts +6 -364
  54. package/src/commands/sync-check.ts +7 -251
  55. package/src/generator/generate-app-code.test.ts +121 -0
  56. package/src/generator/generate-app-code.ts +51 -0
  57. package/src/generator/generate-code-boilerplate.test.ts +1 -1
  58. package/src/generator/generate-code.test.ts +33 -6
  59. package/src/generator/generate-code.ts +12 -226
  60. package/src/generator/generate-errors.ts +34 -0
  61. package/src/generator/generate-permissions.ts +12 -0
  62. package/src/generator/generate-shells.ts +28 -0
  63. package/src/generator/generate-stubs.ts +31 -0
  64. package/src/generator/parse-resolver-doc.test.ts +89 -0
  65. package/src/generator/parse-resolver-doc.ts +125 -0
  66. package/src/generator/scaffold.ts +57 -0
  67. package/src/generator/stub-templates.test.ts +55 -0
  68. package/src/generator/stub-templates.ts +145 -0
  69. package/src/modules/audit/README.md +46 -0
  70. package/src/modules/audit/command/activateAuditPolicy.generated.ts +6 -0
  71. package/src/modules/audit/command/activateAuditPolicy.test.ts +186 -0
  72. package/src/modules/audit/command/activateAuditPolicy.ts +97 -0
  73. package/src/modules/audit/command/createAuditPolicy.generated.ts +6 -0
  74. package/src/modules/audit/command/createAuditPolicy.test.ts +395 -0
  75. package/src/modules/audit/command/createAuditPolicy.ts +131 -0
  76. package/src/modules/audit/command/deactivateAuditPolicy.generated.ts +6 -0
  77. package/src/modules/audit/command/deactivateAuditPolicy.test.ts +138 -0
  78. package/src/modules/audit/command/deactivateAuditPolicy.ts +58 -0
  79. package/src/modules/audit/command/deleteAuditPolicy.generated.ts +6 -0
  80. package/src/modules/audit/command/deleteAuditPolicy.test.ts +121 -0
  81. package/src/modules/audit/command/deleteAuditPolicy.ts +52 -0
  82. package/src/modules/audit/command/logAuditEvent.generated.ts +6 -0
  83. package/src/modules/audit/command/logAuditEvent.test.ts +991 -0
  84. package/src/modules/audit/command/logAuditEvent.ts +357 -0
  85. package/src/modules/audit/command/reactivateAuditPolicy.generated.ts +6 -0
  86. package/src/modules/audit/command/reactivateAuditPolicy.test.ts +143 -0
  87. package/src/modules/audit/command/reactivateAuditPolicy.ts +79 -0
  88. package/src/modules/audit/command/registerAuditableEntity.generated.ts +6 -0
  89. package/src/modules/audit/command/registerAuditableEntity.test.ts +268 -0
  90. package/src/modules/audit/command/registerAuditableEntity.ts +94 -0
  91. package/src/modules/audit/command/replaceAuditPolicy.generated.ts +6 -0
  92. package/src/modules/audit/command/replaceAuditPolicy.test.ts +242 -0
  93. package/src/modules/audit/command/replaceAuditPolicy.ts +91 -0
  94. package/src/modules/audit/command/updateAuditPolicy.generated.ts +6 -0
  95. package/src/modules/audit/command/updateAuditPolicy.test.ts +284 -0
  96. package/src/modules/audit/command/updateAuditPolicy.ts +151 -0
  97. package/src/modules/audit/db/auditEntry.ts +47 -0
  98. package/src/modules/audit/db/auditPolicy.ts +33 -0
  99. package/src/modules/audit/db/auditableEntity.ts +22 -0
  100. package/src/modules/audit/db/changeDetail.ts +28 -0
  101. package/src/modules/audit/db/policyFieldRule.ts +23 -0
  102. package/src/modules/audit/docs/commands/ActivateAuditPolicy.md +69 -0
  103. package/src/modules/audit/docs/commands/CreateAuditPolicy.md +79 -0
  104. package/src/modules/audit/docs/commands/DeactivateAuditPolicy.md +55 -0
  105. package/src/modules/audit/docs/commands/DeleteAuditPolicy.md +55 -0
  106. package/src/modules/audit/docs/commands/LogAuditEvent.md +137 -0
  107. package/src/modules/audit/docs/commands/ReactivateAuditPolicy.md +58 -0
  108. package/src/modules/audit/docs/commands/RegisterAuditableEntity.md +62 -0
  109. package/src/modules/audit/docs/commands/ReplaceAuditPolicy.md +72 -0
  110. package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +77 -0
  111. package/src/modules/audit/docs/features/audit-event-logging.md +126 -0
  112. package/src/modules/audit/docs/features/audit-policy-configuration.md +135 -0
  113. package/src/modules/audit/docs/features/field-level-change-tracking.md +95 -0
  114. package/src/modules/audit/docs/models/AuditEntry.md +55 -0
  115. package/src/modules/audit/docs/models/AuditPolicy.md +79 -0
  116. package/src/modules/audit/docs/models/AuditableEntity.md +38 -0
  117. package/src/modules/audit/docs/models/ChangeDetail.md +55 -0
  118. package/src/modules/audit/docs/models/PolicyFieldRule.md +45 -0
  119. package/src/modules/audit/docs/queries/GetAuditEntry.md +49 -0
  120. package/src/modules/audit/docs/queries/GetAuditPolicy.md +54 -0
  121. package/src/modules/audit/docs/queries/GetAuditSummary.md +84 -0
  122. package/src/modules/audit/docs/queries/GetChangeDetails.md +56 -0
  123. package/src/modules/audit/docs/queries/ListAuditPolicies.md +58 -0
  124. package/src/modules/audit/docs/queries/SearchAuditEntries.md +91 -0
  125. package/src/modules/audit/generated/kysely-tailordb.ts +92 -0
  126. package/src/modules/audit/index.ts +2 -0
  127. package/src/modules/audit/lib/_db_deps.ts +13 -0
  128. package/src/modules/audit/lib/errors.generated.ts +120 -0
  129. package/src/modules/audit/lib/permissions.generated.ts +14 -0
  130. package/src/modules/audit/lib/types.ts +28 -0
  131. package/src/modules/audit/module.ts +57 -0
  132. package/src/modules/audit/permissions.ts +39 -0
  133. package/src/modules/audit/query/getAuditEntry.generated.ts +5 -0
  134. package/src/modules/audit/query/getAuditEntry.test.ts +123 -0
  135. package/src/modules/audit/query/getAuditEntry.ts +36 -0
  136. package/src/modules/audit/query/getAuditPolicy.generated.ts +5 -0
  137. package/src/modules/audit/query/getAuditPolicy.test.ts +169 -0
  138. package/src/modules/audit/query/getAuditPolicy.ts +42 -0
  139. package/src/modules/audit/query/getAuditSummary.generated.ts +5 -0
  140. package/src/modules/audit/query/getAuditSummary.test.ts +632 -0
  141. package/src/modules/audit/query/getAuditSummary.ts +164 -0
  142. package/src/modules/audit/query/getChangeDetails.generated.ts +5 -0
  143. package/src/modules/audit/query/getChangeDetails.test.ts +195 -0
  144. package/src/modules/audit/query/getChangeDetails.ts +42 -0
  145. package/src/modules/audit/query/listAuditPolicies.generated.ts +5 -0
  146. package/src/modules/audit/query/listAuditPolicies.test.ts +239 -0
  147. package/src/modules/audit/query/listAuditPolicies.ts +100 -0
  148. package/src/modules/audit/query/searchAuditEntries.generated.ts +5 -0
  149. package/src/modules/audit/query/searchAuditEntries.test.ts +424 -0
  150. package/src/modules/audit/query/searchAuditEntries.ts +121 -0
  151. package/src/modules/audit/tailor.config.ts +13 -0
  152. package/src/modules/audit/tailor.d.ts +13 -0
  153. package/src/modules/audit/testing/fixtures.ts +215 -0
  154. package/src/modules/business-partner/README.md +60 -0
  155. package/src/modules/business-partner/command/.gitkeep +0 -0
  156. package/src/modules/business-partner/command/activatePartner.generated.ts +6 -0
  157. package/src/modules/business-partner/command/activatePartner.test.ts +59 -0
  158. package/src/modules/business-partner/command/activatePartner.ts +45 -0
  159. package/src/modules/business-partner/command/assignRoleToPartner.generated.ts +6 -0
  160. package/src/modules/business-partner/command/assignRoleToPartner.test.ts +113 -0
  161. package/src/modules/business-partner/command/assignRoleToPartner.ts +72 -0
  162. package/src/modules/business-partner/command/createContactPerson.generated.ts +6 -0
  163. package/src/modules/business-partner/command/createContactPerson.test.ts +193 -0
  164. package/src/modules/business-partner/command/createContactPerson.ts +98 -0
  165. package/src/modules/business-partner/command/createPartner.generated.ts +6 -0
  166. package/src/modules/business-partner/command/createPartner.test.ts +179 -0
  167. package/src/modules/business-partner/command/createPartner.ts +83 -0
  168. package/src/modules/business-partner/command/createPartnerAddress.generated.ts +6 -0
  169. package/src/modules/business-partner/command/createPartnerAddress.test.ts +195 -0
  170. package/src/modules/business-partner/command/createPartnerAddress.ts +119 -0
  171. package/src/modules/business-partner/command/createPartnerBankAccount.generated.ts +6 -0
  172. package/src/modules/business-partner/command/createPartnerBankAccount.test.ts +297 -0
  173. package/src/modules/business-partner/command/createPartnerBankAccount.ts +114 -0
  174. package/src/modules/business-partner/command/createPartnerIdentification.generated.ts +6 -0
  175. package/src/modules/business-partner/command/createPartnerIdentification.test.ts +255 -0
  176. package/src/modules/business-partner/command/createPartnerIdentification.ts +97 -0
  177. package/src/modules/business-partner/command/deactivateContactPerson.generated.ts +6 -0
  178. package/src/modules/business-partner/command/deactivateContactPerson.test.ts +70 -0
  179. package/src/modules/business-partner/command/deactivateContactPerson.ts +54 -0
  180. package/src/modules/business-partner/command/deactivatePartner.generated.ts +6 -0
  181. package/src/modules/business-partner/command/deactivatePartner.test.ts +59 -0
  182. package/src/modules/business-partner/command/deactivatePartner.ts +46 -0
  183. package/src/modules/business-partner/command/deleteContactPerson.generated.ts +6 -0
  184. package/src/modules/business-partner/command/deleteContactPerson.test.ts +61 -0
  185. package/src/modules/business-partner/command/deleteContactPerson.ts +48 -0
  186. package/src/modules/business-partner/command/deletePartner.generated.ts +6 -0
  187. package/src/modules/business-partner/command/deletePartner.test.ts +58 -0
  188. package/src/modules/business-partner/command/deletePartner.ts +46 -0
  189. package/src/modules/business-partner/command/deletePartnerAddress.generated.ts +6 -0
  190. package/src/modules/business-partner/command/deletePartnerAddress.test.ts +74 -0
  191. package/src/modules/business-partner/command/deletePartnerAddress.ts +52 -0
  192. package/src/modules/business-partner/command/deletePartnerBankAccount.generated.ts +6 -0
  193. package/src/modules/business-partner/command/deletePartnerBankAccount.test.ts +55 -0
  194. package/src/modules/business-partner/command/deletePartnerBankAccount.ts +36 -0
  195. package/src/modules/business-partner/command/deletePartnerIdentification.generated.ts +6 -0
  196. package/src/modules/business-partner/command/deletePartnerIdentification.test.ts +47 -0
  197. package/src/modules/business-partner/command/deletePartnerIdentification.ts +37 -0
  198. package/src/modules/business-partner/command/reactivateContactPerson.generated.ts +6 -0
  199. package/src/modules/business-partner/command/reactivateContactPerson.test.ts +48 -0
  200. package/src/modules/business-partner/command/reactivateContactPerson.ts +48 -0
  201. package/src/modules/business-partner/command/reactivatePartner.generated.ts +6 -0
  202. package/src/modules/business-partner/command/reactivatePartner.test.ts +59 -0
  203. package/src/modules/business-partner/command/reactivatePartner.ts +46 -0
  204. package/src/modules/business-partner/command/removeRoleFromPartner.generated.ts +6 -0
  205. package/src/modules/business-partner/command/removeRoleFromPartner.test.ts +82 -0
  206. package/src/modules/business-partner/command/removeRoleFromPartner.ts +73 -0
  207. package/src/modules/business-partner/command/setDefaultPartnerAddress.generated.ts +6 -0
  208. package/src/modules/business-partner/command/setDefaultPartnerAddress.test.ts +60 -0
  209. package/src/modules/business-partner/command/setDefaultPartnerAddress.ts +48 -0
  210. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.generated.ts +6 -0
  211. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.test.ts +56 -0
  212. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.ts +51 -0
  213. package/src/modules/business-partner/command/setPrimaryContactPerson.generated.ts +6 -0
  214. package/src/modules/business-partner/command/setPrimaryContactPerson.test.ts +63 -0
  215. package/src/modules/business-partner/command/setPrimaryContactPerson.ts +55 -0
  216. package/src/modules/business-partner/command/updateContactPerson.generated.ts +6 -0
  217. package/src/modules/business-partner/command/updateContactPerson.test.ts +193 -0
  218. package/src/modules/business-partner/command/updateContactPerson.ts +92 -0
  219. package/src/modules/business-partner/command/updatePartner.generated.ts +6 -0
  220. package/src/modules/business-partner/command/updatePartner.test.ts +101 -0
  221. package/src/modules/business-partner/command/updatePartner.ts +76 -0
  222. package/src/modules/business-partner/command/updatePartnerAddress.generated.ts +6 -0
  223. package/src/modules/business-partner/command/updatePartnerAddress.test.ts +148 -0
  224. package/src/modules/business-partner/command/updatePartnerAddress.ts +64 -0
  225. package/src/modules/business-partner/command/updatePartnerBankAccount.generated.ts +6 -0
  226. package/src/modules/business-partner/command/updatePartnerBankAccount.test.ts +249 -0
  227. package/src/modules/business-partner/command/updatePartnerBankAccount.ts +109 -0
  228. package/src/modules/business-partner/command/updatePartnerIdentification.generated.ts +6 -0
  229. package/src/modules/business-partner/command/updatePartnerIdentification.test.ts +162 -0
  230. package/src/modules/business-partner/command/updatePartnerIdentification.ts +105 -0
  231. package/src/modules/business-partner/db/.gitkeep +0 -0
  232. package/src/modules/business-partner/db/businessPartner.ts +59 -0
  233. package/src/modules/business-partner/db/contactPerson.ts +49 -0
  234. package/src/modules/business-partner/db/partnerAddress.ts +45 -0
  235. package/src/modules/business-partner/db/partnerBankAccount.ts +53 -0
  236. package/src/modules/business-partner/db/partnerIdentification.ts +53 -0
  237. package/src/modules/business-partner/db/partnerRole.ts +43 -0
  238. package/src/modules/business-partner/docs/commands/ActivatePartner.md +39 -0
  239. package/src/modules/business-partner/docs/commands/AssignRoleToPartner.md +49 -0
  240. package/src/modules/business-partner/docs/commands/CreateContactPerson.md +59 -0
  241. package/src/modules/business-partner/docs/commands/CreatePartner.md +54 -0
  242. package/src/modules/business-partner/docs/commands/CreatePartnerAddress.md +60 -0
  243. package/src/modules/business-partner/docs/commands/CreatePartnerBankAccount.md +68 -0
  244. package/src/modules/business-partner/docs/commands/CreatePartnerIdentification.md +59 -0
  245. package/src/modules/business-partner/docs/commands/DeactivateContactPerson.md +42 -0
  246. package/src/modules/business-partner/docs/commands/DeactivatePartner.md +39 -0
  247. package/src/modules/business-partner/docs/commands/DeleteContactPerson.md +43 -0
  248. package/src/modules/business-partner/docs/commands/DeletePartner.md +40 -0
  249. package/src/modules/business-partner/docs/commands/DeletePartnerAddress.md +40 -0
  250. package/src/modules/business-partner/docs/commands/DeletePartnerBankAccount.md +35 -0
  251. package/src/modules/business-partner/docs/commands/DeletePartnerIdentification.md +33 -0
  252. package/src/modules/business-partner/docs/commands/ReactivateContactPerson.md +38 -0
  253. package/src/modules/business-partner/docs/commands/ReactivatePartner.md +39 -0
  254. package/src/modules/business-partner/docs/commands/RemoveRoleFromPartner.md +46 -0
  255. package/src/modules/business-partner/docs/commands/SetDefaultPartnerAddress.md +38 -0
  256. package/src/modules/business-partner/docs/commands/SetDefaultPartnerBankAccount.md +38 -0
  257. package/src/modules/business-partner/docs/commands/SetPrimaryContactPerson.md +43 -0
  258. package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +66 -0
  259. package/src/modules/business-partner/docs/commands/UpdatePartner.md +48 -0
  260. package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +46 -0
  261. package/src/modules/business-partner/docs/commands/UpdatePartnerBankAccount.md +64 -0
  262. package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +52 -0
  263. package/src/modules/business-partner/docs/features/contact-person-management.md +70 -0
  264. package/src/modules/business-partner/docs/features/partner-address-management.md +96 -0
  265. package/src/modules/business-partner/docs/features/partner-bank-account.md +70 -0
  266. package/src/modules/business-partner/docs/features/partner-identification.md +76 -0
  267. package/src/modules/business-partner/docs/features/partner-lifecycle.md +59 -0
  268. package/src/modules/business-partner/docs/features/partner-role-classification.md +73 -0
  269. package/src/modules/business-partner/docs/models/BusinessPartner.md +64 -0
  270. package/src/modules/business-partner/docs/models/ContactPerson.md +62 -0
  271. package/src/modules/business-partner/docs/models/PartnerAddress.md +52 -0
  272. package/src/modules/business-partner/docs/models/PartnerBankAccount.md +50 -0
  273. package/src/modules/business-partner/docs/models/PartnerIdentification.md +46 -0
  274. package/src/modules/business-partner/docs/models/PartnerRole.md +42 -0
  275. package/src/modules/business-partner/docs/queries/GetContactPerson.md +34 -0
  276. package/src/modules/business-partner/docs/queries/GetDefaultPartnerAddress.md +40 -0
  277. package/src/modules/business-partner/docs/queries/GetDefaultPartnerBankAccount.md +36 -0
  278. package/src/modules/business-partner/docs/queries/GetPartner.md +35 -0
  279. package/src/modules/business-partner/docs/queries/GetPartnerAddress.md +34 -0
  280. package/src/modules/business-partner/docs/queries/GetPartnerBankAccount.md +34 -0
  281. package/src/modules/business-partner/docs/queries/GetPartnerIdentification.md +34 -0
  282. package/src/modules/business-partner/docs/queries/GetPartnerRole.md +34 -0
  283. package/src/modules/business-partner/docs/queries/GetPrimaryContactPerson.md +36 -0
  284. package/src/modules/business-partner/docs/queries/ListContactPersonsByPartner.md +39 -0
  285. package/src/modules/business-partner/docs/queries/ListPartnerAddressesByPartner.md +41 -0
  286. package/src/modules/business-partner/docs/queries/ListPartnerBankAccountsByPartner.md +39 -0
  287. package/src/modules/business-partner/docs/queries/ListPartnerIdentificationsByPartner.md +41 -0
  288. package/src/modules/business-partner/docs/queries/ListPartnersByRole.md +47 -0
  289. package/src/modules/business-partner/executor/.gitkeep +0 -0
  290. package/src/modules/business-partner/generated/.gitkeep +0 -0
  291. package/src/modules/business-partner/generated/enums.ts +60 -0
  292. package/src/modules/business-partner/generated/kysely-tailordb.ts +114 -0
  293. package/src/modules/business-partner/index.ts +2 -0
  294. package/src/modules/business-partner/lib/_db_deps.ts +17 -0
  295. package/src/modules/business-partner/lib/errors.generated.ts +172 -0
  296. package/src/modules/business-partner/lib/errors.ts +2 -0
  297. package/src/modules/business-partner/lib/permissions.generated.ts +30 -0
  298. package/src/modules/business-partner/lib/types.ts +53 -0
  299. package/src/modules/business-partner/module.ts +181 -0
  300. package/src/modules/business-partner/permissions.ts +3 -0
  301. package/src/modules/business-partner/query/.gitkeep +0 -0
  302. package/src/modules/business-partner/query/getContactPerson.generated.ts +5 -0
  303. package/src/modules/business-partner/query/getContactPerson.test.ts +31 -0
  304. package/src/modules/business-partner/query/getContactPerson.ts +16 -0
  305. package/src/modules/business-partner/query/getDefaultPartnerAddress.generated.ts +5 -0
  306. package/src/modules/business-partner/query/getDefaultPartnerAddress.test.ts +45 -0
  307. package/src/modules/business-partner/query/getDefaultPartnerAddress.ts +30 -0
  308. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.generated.ts +5 -0
  309. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.test.ts +43 -0
  310. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.ts +17 -0
  311. package/src/modules/business-partner/query/getPartner.generated.ts +5 -0
  312. package/src/modules/business-partner/query/getPartner.test.ts +31 -0
  313. package/src/modules/business-partner/query/getPartner.ts +16 -0
  314. package/src/modules/business-partner/query/getPartnerAddress.generated.ts +5 -0
  315. package/src/modules/business-partner/query/getPartnerAddress.test.ts +31 -0
  316. package/src/modules/business-partner/query/getPartnerAddress.ts +16 -0
  317. package/src/modules/business-partner/query/getPartnerBankAccount.generated.ts +5 -0
  318. package/src/modules/business-partner/query/getPartnerBankAccount.test.ts +31 -0
  319. package/src/modules/business-partner/query/getPartnerBankAccount.ts +16 -0
  320. package/src/modules/business-partner/query/getPartnerIdentification.generated.ts +5 -0
  321. package/src/modules/business-partner/query/getPartnerIdentification.test.ts +31 -0
  322. package/src/modules/business-partner/query/getPartnerIdentification.ts +16 -0
  323. package/src/modules/business-partner/query/getPartnerRole.generated.ts +5 -0
  324. package/src/modules/business-partner/query/getPartnerRole.test.ts +31 -0
  325. package/src/modules/business-partner/query/getPartnerRole.ts +19 -0
  326. package/src/modules/business-partner/query/getPrimaryContactPerson.generated.ts +5 -0
  327. package/src/modules/business-partner/query/getPrimaryContactPerson.test.ts +43 -0
  328. package/src/modules/business-partner/query/getPrimaryContactPerson.ts +17 -0
  329. package/src/modules/business-partner/query/listContactPersonsByPartner.generated.ts +5 -0
  330. package/src/modules/business-partner/query/listContactPersonsByPartner.test.ts +77 -0
  331. package/src/modules/business-partner/query/listContactPersonsByPartner.ts +32 -0
  332. package/src/modules/business-partner/query/listPartnerAddressesByPartner.generated.ts +5 -0
  333. package/src/modules/business-partner/query/listPartnerAddressesByPartner.test.ts +71 -0
  334. package/src/modules/business-partner/query/listPartnerAddressesByPartner.ts +37 -0
  335. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.generated.ts +5 -0
  336. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.test.ts +59 -0
  337. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.ts +32 -0
  338. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.generated.ts +5 -0
  339. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.test.ts +72 -0
  340. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.ts +40 -0
  341. package/src/modules/business-partner/query/listPartnersByRole.generated.ts +5 -0
  342. package/src/modules/business-partner/query/listPartnersByRole.test.ts +103 -0
  343. package/src/modules/business-partner/query/listPartnersByRole.ts +47 -0
  344. package/src/modules/business-partner/tailor.config.ts +13 -0
  345. package/src/modules/business-partner/tailor.d.ts +13 -0
  346. package/src/modules/business-partner/testing/fixtures.ts +204 -0
  347. package/src/modules/coa-management/README.md +61 -0
  348. package/src/modules/coa-management/command/.gitkeep +0 -0
  349. package/src/modules/coa-management/command/activateAccount.generated.ts +6 -0
  350. package/src/modules/coa-management/command/activateAccount.test.ts +125 -0
  351. package/src/modules/coa-management/command/activateAccount.ts +105 -0
  352. package/src/modules/coa-management/command/activateChartOfAccounts.generated.ts +6 -0
  353. package/src/modules/coa-management/command/activateChartOfAccounts.test.ts +113 -0
  354. package/src/modules/coa-management/command/activateChartOfAccounts.ts +104 -0
  355. package/src/modules/coa-management/command/createAccount.generated.ts +6 -0
  356. package/src/modules/coa-management/command/createAccount.test.ts +767 -0
  357. package/src/modules/coa-management/command/createAccount.ts +247 -0
  358. package/src/modules/coa-management/command/createAccountGroup.generated.ts +6 -0
  359. package/src/modules/coa-management/command/createAccountGroup.test.ts +494 -0
  360. package/src/modules/coa-management/command/createAccountGroup.ts +207 -0
  361. package/src/modules/coa-management/command/createChartOfAccounts.generated.ts +6 -0
  362. package/src/modules/coa-management/command/createChartOfAccounts.test.ts +502 -0
  363. package/src/modules/coa-management/command/createChartOfAccounts.ts +267 -0
  364. package/src/modules/coa-management/command/deactivateAccount.generated.ts +6 -0
  365. package/src/modules/coa-management/command/deactivateAccount.test.ts +199 -0
  366. package/src/modules/coa-management/command/deactivateAccount.ts +142 -0
  367. package/src/modules/coa-management/command/deactivateChartOfAccounts.generated.ts +6 -0
  368. package/src/modules/coa-management/command/deactivateChartOfAccounts.test.ts +91 -0
  369. package/src/modules/coa-management/command/deactivateChartOfAccounts.ts +88 -0
  370. package/src/modules/coa-management/command/deleteAccount.generated.ts +6 -0
  371. package/src/modules/coa-management/command/deleteAccount.test.ts +122 -0
  372. package/src/modules/coa-management/command/deleteAccount.ts +103 -0
  373. package/src/modules/coa-management/command/deleteAccountGroup.generated.ts +6 -0
  374. package/src/modules/coa-management/command/deleteAccountGroup.test.ts +120 -0
  375. package/src/modules/coa-management/command/deleteAccountGroup.ts +113 -0
  376. package/src/modules/coa-management/command/deleteChartOfAccounts.generated.ts +6 -0
  377. package/src/modules/coa-management/command/deleteChartOfAccounts.test.ts +154 -0
  378. package/src/modules/coa-management/command/deleteChartOfAccounts.ts +133 -0
  379. package/src/modules/coa-management/command/moveAccountGroup.generated.ts +6 -0
  380. package/src/modules/coa-management/command/moveAccountGroup.test.ts +199 -0
  381. package/src/modules/coa-management/command/moveAccountGroup.ts +145 -0
  382. package/src/modules/coa-management/command/reactivateAccount.generated.ts +6 -0
  383. package/src/modules/coa-management/command/reactivateAccount.test.ts +126 -0
  384. package/src/modules/coa-management/command/reactivateAccount.ts +123 -0
  385. package/src/modules/coa-management/command/updateAccount.generated.ts +6 -0
  386. package/src/modules/coa-management/command/updateAccount.test.ts +669 -0
  387. package/src/modules/coa-management/command/updateAccount.ts +370 -0
  388. package/src/modules/coa-management/command/updateAccountGroup.generated.ts +6 -0
  389. package/src/modules/coa-management/command/updateAccountGroup.test.ts +253 -0
  390. package/src/modules/coa-management/command/updateAccountGroup.ts +191 -0
  391. package/src/modules/coa-management/command/updateChartOfAccounts.generated.ts +6 -0
  392. package/src/modules/coa-management/command/updateChartOfAccounts.test.ts +153 -0
  393. package/src/modules/coa-management/command/updateChartOfAccounts.ts +133 -0
  394. package/src/modules/coa-management/db/.gitkeep +0 -0
  395. package/src/modules/coa-management/db/account.ts +119 -0
  396. package/src/modules/coa-management/db/accountGroup.ts +57 -0
  397. package/src/modules/coa-management/db/chartOfAccounts.ts +55 -0
  398. package/src/modules/coa-management/docs/commands/ActivateAccount.md +49 -0
  399. package/src/modules/coa-management/docs/commands/ActivateChartOfAccounts.md +47 -0
  400. package/src/modules/coa-management/docs/commands/CreateAccount.md +94 -0
  401. package/src/modules/coa-management/docs/commands/CreateAccountGroup.md +70 -0
  402. package/src/modules/coa-management/docs/commands/CreateChartOfAccounts.md +72 -0
  403. package/src/modules/coa-management/docs/commands/DeactivateAccount.md +65 -0
  404. package/src/modules/coa-management/docs/commands/DeactivateChartOfAccounts.md +44 -0
  405. package/src/modules/coa-management/docs/commands/DeleteAccount.md +52 -0
  406. package/src/modules/coa-management/docs/commands/DeleteAccountGroup.md +50 -0
  407. package/src/modules/coa-management/docs/commands/DeleteChartOfAccounts.md +48 -0
  408. package/src/modules/coa-management/docs/commands/MoveAccountGroup.md +57 -0
  409. package/src/modules/coa-management/docs/commands/ReactivateAccount.md +50 -0
  410. package/src/modules/coa-management/docs/commands/UpdateAccount.md +102 -0
  411. package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +62 -0
  412. package/src/modules/coa-management/docs/commands/UpdateChartOfAccounts.md +49 -0
  413. package/src/modules/coa-management/docs/features/account-group-hierarchy.md +81 -0
  414. package/src/modules/coa-management/docs/features/account-lifecycle.md +80 -0
  415. package/src/modules/coa-management/docs/features/account-management.md +114 -0
  416. package/src/modules/coa-management/docs/features/chart-of-accounts-setup.md +86 -0
  417. package/src/modules/coa-management/docs/models/Account.md +84 -0
  418. package/src/modules/coa-management/docs/models/AccountGroup.md +55 -0
  419. package/src/modules/coa-management/docs/models/ChartOfAccounts.md +65 -0
  420. package/src/modules/coa-management/docs/queries/DetectCircularReference.md +52 -0
  421. package/src/modules/coa-management/docs/queries/GetAccount.md +42 -0
  422. package/src/modules/coa-management/docs/queries/GetAccountGroup.md +42 -0
  423. package/src/modules/coa-management/docs/queries/GetChartOfAccounts.md +48 -0
  424. package/src/modules/coa-management/docs/queries/ListAccountGroups.md +42 -0
  425. package/src/modules/coa-management/docs/queries/ListAccounts.md +54 -0
  426. package/src/modules/coa-management/docs/queries/ListUnassignedAccounts.md +40 -0
  427. package/src/modules/coa-management/executor/.gitkeep +0 -0
  428. package/src/modules/coa-management/generated/.gitkeep +0 -0
  429. package/src/modules/coa-management/generated/enums.ts +45 -0
  430. package/src/modules/coa-management/generated/kysely-tailordb.ts +81 -0
  431. package/src/modules/coa-management/index.ts +2 -0
  432. package/src/modules/coa-management/lib/_db_deps.ts +17 -0
  433. package/src/modules/coa-management/lib/errors.generated.ts +162 -0
  434. package/src/modules/coa-management/lib/errors.ts +0 -0
  435. package/src/modules/coa-management/lib/permissions.generated.ts +20 -0
  436. package/src/modules/coa-management/lib/types.ts +22 -0
  437. package/src/modules/coa-management/module.ts +136 -0
  438. package/src/modules/coa-management/permissions.ts +3 -0
  439. package/src/modules/coa-management/query/.gitkeep +0 -0
  440. package/src/modules/coa-management/query/detectCircularReference.generated.ts +5 -0
  441. package/src/modules/coa-management/query/detectCircularReference.test.ts +88 -0
  442. package/src/modules/coa-management/query/detectCircularReference.ts +46 -0
  443. package/src/modules/coa-management/query/getAccount.generated.ts +5 -0
  444. package/src/modules/coa-management/query/getAccount.test.ts +55 -0
  445. package/src/modules/coa-management/query/getAccount.ts +25 -0
  446. package/src/modules/coa-management/query/getAccountGroup.generated.ts +5 -0
  447. package/src/modules/coa-management/query/getAccountGroup.test.ts +55 -0
  448. package/src/modules/coa-management/query/getAccountGroup.ts +25 -0
  449. package/src/modules/coa-management/query/getChartOfAccounts.generated.ts +5 -0
  450. package/src/modules/coa-management/query/getChartOfAccounts.test.ts +79 -0
  451. package/src/modules/coa-management/query/getChartOfAccounts.ts +28 -0
  452. package/src/modules/coa-management/query/listAccountGroups.generated.ts +5 -0
  453. package/src/modules/coa-management/query/listAccountGroups.test.ts +72 -0
  454. package/src/modules/coa-management/query/listAccountGroups.ts +49 -0
  455. package/src/modules/coa-management/query/listAccounts.generated.ts +5 -0
  456. package/src/modules/coa-management/query/listAccounts.test.ts +136 -0
  457. package/src/modules/coa-management/query/listAccounts.ts +82 -0
  458. package/src/modules/coa-management/query/listUnassignedAccounts.generated.ts +5 -0
  459. package/src/modules/coa-management/query/listUnassignedAccounts.test.ts +96 -0
  460. package/src/modules/coa-management/query/listUnassignedAccounts.ts +39 -0
  461. package/src/modules/coa-management/tailor.config.ts +13 -0
  462. package/src/modules/coa-management/tailor.d.ts +13 -0
  463. package/src/modules/coa-management/testing/fixtures.ts +201 -0
  464. package/src/modules/item-management/README.md +1 -1
  465. package/src/modules/organization/README.md +57 -0
  466. package/src/modules/organization/command/.gitkeep +0 -0
  467. package/src/modules/organization/command/activateCompany.generated.ts +6 -0
  468. package/src/modules/organization/command/activateCompany.test.ts +184 -0
  469. package/src/modules/organization/command/activateCompany.ts +92 -0
  470. package/src/modules/organization/command/createCompany.generated.ts +6 -0
  471. package/src/modules/organization/command/createCompany.test.ts +156 -0
  472. package/src/modules/organization/command/createCompany.ts +80 -0
  473. package/src/modules/organization/command/createDepartment.generated.ts +6 -0
  474. package/src/modules/organization/command/createDepartment.test.ts +239 -0
  475. package/src/modules/organization/command/createDepartment.ts +98 -0
  476. package/src/modules/organization/command/createSite.generated.ts +6 -0
  477. package/src/modules/organization/command/createSite.test.ts +262 -0
  478. package/src/modules/organization/command/createSite.ts +155 -0
  479. package/src/modules/organization/command/deactivateCompany.generated.ts +6 -0
  480. package/src/modules/organization/command/deactivateCompany.test.ts +58 -0
  481. package/src/modules/organization/command/deactivateCompany.ts +47 -0
  482. package/src/modules/organization/command/deactivateDepartment.generated.ts +6 -0
  483. package/src/modules/organization/command/deactivateDepartment.test.ts +115 -0
  484. package/src/modules/organization/command/deactivateDepartment.ts +63 -0
  485. package/src/modules/organization/command/deactivateSite.generated.ts +6 -0
  486. package/src/modules/organization/command/deactivateSite.test.ts +53 -0
  487. package/src/modules/organization/command/deactivateSite.ts +47 -0
  488. package/src/modules/organization/command/deleteCompany.generated.ts +6 -0
  489. package/src/modules/organization/command/deleteCompany.test.ts +99 -0
  490. package/src/modules/organization/command/deleteCompany.ts +66 -0
  491. package/src/modules/organization/command/reactivateCompany.generated.ts +6 -0
  492. package/src/modules/organization/command/reactivateCompany.test.ts +58 -0
  493. package/src/modules/organization/command/reactivateCompany.ts +47 -0
  494. package/src/modules/organization/command/reactivateDepartment.generated.ts +6 -0
  495. package/src/modules/organization/command/reactivateDepartment.test.ts +59 -0
  496. package/src/modules/organization/command/reactivateDepartment.ts +47 -0
  497. package/src/modules/organization/command/reactivateSite.generated.ts +6 -0
  498. package/src/modules/organization/command/reactivateSite.test.ts +53 -0
  499. package/src/modules/organization/command/reactivateSite.ts +47 -0
  500. package/src/modules/organization/command/updateCompany.generated.ts +6 -0
  501. package/src/modules/organization/command/updateCompany.test.ts +239 -0
  502. package/src/modules/organization/command/updateCompany.ts +127 -0
  503. package/src/modules/organization/command/updateDepartment.generated.ts +6 -0
  504. package/src/modules/organization/command/updateDepartment.test.ts +232 -0
  505. package/src/modules/organization/command/updateDepartment.ts +120 -0
  506. package/src/modules/organization/command/updateSite.generated.ts +6 -0
  507. package/src/modules/organization/command/updateSite.test.ts +274 -0
  508. package/src/modules/organization/command/updateSite.ts +176 -0
  509. package/src/modules/organization/db/.gitkeep +0 -0
  510. package/src/modules/organization/db/company.ts +44 -0
  511. package/src/modules/organization/db/department.ts +46 -0
  512. package/src/modules/organization/db/site.ts +44 -0
  513. package/src/modules/organization/docs/commands/ActivateCompany.md +62 -0
  514. package/src/modules/organization/docs/commands/CreateCompany.md +49 -0
  515. package/src/modules/organization/docs/commands/CreateDepartment.md +62 -0
  516. package/src/modules/organization/docs/commands/CreateSite.md +74 -0
  517. package/src/modules/organization/docs/commands/DeactivateCompany.md +40 -0
  518. package/src/modules/organization/docs/commands/DeactivateDepartment.md +44 -0
  519. package/src/modules/organization/docs/commands/DeactivateSite.md +38 -0
  520. package/src/modules/organization/docs/commands/DeleteCompany.md +50 -0
  521. package/src/modules/organization/docs/commands/ReactivateCompany.md +39 -0
  522. package/src/modules/organization/docs/commands/ReactivateDepartment.md +37 -0
  523. package/src/modules/organization/docs/commands/ReactivateSite.md +37 -0
  524. package/src/modules/organization/docs/commands/UpdateCompany.md +58 -0
  525. package/src/modules/organization/docs/commands/UpdateDepartment.md +64 -0
  526. package/src/modules/organization/docs/commands/UpdateSite.md +80 -0
  527. package/src/modules/organization/docs/features/company-lifecycle.md +76 -0
  528. package/src/modules/organization/docs/features/department-management.md +66 -0
  529. package/src/modules/organization/docs/features/site-management.md +86 -0
  530. package/src/modules/organization/docs/models/Company.md +60 -0
  531. package/src/modules/organization/docs/models/Department.md +57 -0
  532. package/src/modules/organization/docs/models/Site.md +57 -0
  533. package/src/modules/organization/docs/queries/DetectDepartmentCircularReference.md +50 -0
  534. package/src/modules/organization/docs/queries/GetCompany.md +40 -0
  535. package/src/modules/organization/docs/queries/GetDepartment.md +44 -0
  536. package/src/modules/organization/docs/queries/GetDepartmentChildren.md +40 -0
  537. package/src/modules/organization/docs/queries/GetSite.md +37 -0
  538. package/src/modules/organization/docs/queries/ListDepartmentsByCompany.md +54 -0
  539. package/src/modules/organization/docs/queries/ListSitesByCompany.md +54 -0
  540. package/src/modules/organization/executor/.gitkeep +0 -0
  541. package/src/modules/organization/generated/.gitkeep +0 -0
  542. package/src/modules/organization/generated/kysely-tailordb.ts +77 -0
  543. package/src/modules/organization/index.ts +2 -0
  544. package/src/modules/organization/lib/_db_deps.ts +10 -0
  545. package/src/modules/organization/lib/errors.generated.ts +117 -0
  546. package/src/modules/organization/lib/errors.ts +1 -0
  547. package/src/modules/organization/lib/permissions.generated.ts +19 -0
  548. package/src/modules/organization/lib/types.ts +16 -0
  549. package/src/modules/organization/module.ts +89 -0
  550. package/src/modules/organization/permissions.ts +3 -0
  551. package/src/modules/organization/query/.gitkeep +0 -0
  552. package/src/modules/organization/query/detectDepartmentCircularReference.generated.ts +5 -0
  553. package/src/modules/organization/query/detectDepartmentCircularReference.test.ts +102 -0
  554. package/src/modules/organization/query/detectDepartmentCircularReference.ts +27 -0
  555. package/src/modules/organization/query/getCompany.generated.ts +5 -0
  556. package/src/modules/organization/query/getCompany.test.ts +70 -0
  557. package/src/modules/organization/query/getCompany.ts +16 -0
  558. package/src/modules/organization/query/getDepartment.generated.ts +5 -0
  559. package/src/modules/organization/query/getDepartment.test.ts +85 -0
  560. package/src/modules/organization/query/getDepartment.ts +17 -0
  561. package/src/modules/organization/query/getDepartmentChildren.generated.ts +5 -0
  562. package/src/modules/organization/query/getDepartmentChildren.test.ts +75 -0
  563. package/src/modules/organization/query/getDepartmentChildren.ts +21 -0
  564. package/src/modules/organization/query/getSite.generated.ts +5 -0
  565. package/src/modules/organization/query/getSite.test.ts +55 -0
  566. package/src/modules/organization/query/getSite.ts +16 -0
  567. package/src/modules/organization/query/listDepartmentsByCompany.generated.ts +5 -0
  568. package/src/modules/organization/query/listDepartmentsByCompany.test.ts +124 -0
  569. package/src/modules/organization/query/listDepartmentsByCompany.ts +43 -0
  570. package/src/modules/organization/query/listSitesByCompany.generated.ts +5 -0
  571. package/src/modules/organization/query/listSitesByCompany.test.ts +126 -0
  572. package/src/modules/organization/query/listSitesByCompany.ts +41 -0
  573. package/src/modules/organization/tailor.config.ts +13 -0
  574. package/src/modules/organization/tailor.d.ts +13 -0
  575. package/src/modules/organization/testing/fixtures.ts +155 -0
  576. package/src/modules/primitives/README.md +1 -1
  577. package/src/modules/primitives/command/setBaseCurrency.test.ts +8 -64
  578. package/src/modules/primitives/command/setBaseCurrency.ts +6 -64
  579. package/src/modules/primitives/docs/commands/ActivateCategory.md +1 -1
  580. package/src/modules/primitives/docs/commands/ActivateCurrency.md +1 -1
  581. package/src/modules/primitives/docs/commands/ActivateUnit.md +1 -1
  582. package/src/modules/primitives/docs/commands/CreateExchangeRate.md +2 -2
  583. package/src/modules/primitives/docs/commands/CreateUnit.md +1 -1
  584. package/src/modules/primitives/docs/commands/DeactivateCategory.md +1 -1
  585. package/src/modules/primitives/docs/commands/DeactivateCurrency.md +1 -1
  586. package/src/modules/primitives/docs/commands/DeactivateUnit.md +1 -1
  587. package/src/modules/primitives/docs/commands/SetBaseCurrency.md +13 -23
  588. package/src/modules/primitives/docs/commands/SetReferenceUnit.md +1 -1
  589. package/src/modules/primitives/docs/features/currency-definitions.md +13 -14
  590. package/src/modules/primitives/docs/models/Currency.md +3 -4
  591. package/src/modules/primitives/docs/queries/ConvertAmount.md +2 -2
  592. package/src/modules/primitives/docs/queries/ConvertQuantity.md +2 -2
  593. package/src/modules/primitives/lib/errors.generated.ts +5 -0
  594. package/src/modules/product-management/README.md +1 -1
  595. package/src/modules/user-management/docs/commands/CreatePermission.md +3 -3
  596. package/src/modules/user-management/docs/commands/CreateRole.md +1 -1
  597. package/src/modules/user-management/docs/queries/ListRolePermissionsByRole.md +39 -0
  598. package/src/modules/user-management/docs/queries/ListUserRolesByUser.md +39 -0
  599. package/src/modules/user-management/generated/enums.ts +0 -15
  600. package/src/modules/user-management/generated/kysely-tailordb.ts +0 -11
  601. package/src/shared/createContext.ts +2 -1
  602. package/src/shared/defineQuery.ts +36 -1
  603. package/src/shared/requirePermission.ts +3 -3
  604. package/src/shared/types.ts +3 -0
  605. package/templates/scaffold/app/backend/package.json +4 -3
  606. package/templates/scaffold/app/frontend/eslint.config.js +12 -0
  607. package/templates/scaffold/app/frontend/package.json +10 -7
  608. package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +30 -0
  609. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +3 -2
  610. package/templates/scaffold/app/frontend/vite.config.ts +5 -5
  611. package/src/commands/module/list.test.ts +0 -57
  612. package/src/commands/module/list.ts +0 -64
  613. /package/src/modules/{accounting → audit/db}/.gitkeep +0 -0
  614. /package/src/modules/audit/{.gitkeep → executor/.gitkeep} +0 -0
  615. /package/src/modules/{coa-management/.gitkeep → audit/lib/errors.ts} +0 -0
  616. /package/src/modules/{supplier-management → business-partner}/.gitkeep +0 -0
@@ -0,0 +1,96 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import type { DB } from "../generated/kysely-tailordb";
4
+ import { baseActiveAccount, baseDraftAccount } from "../testing/fixtures";
5
+ import { run } from "./listUnassignedAccounts";
6
+
7
+ describe("listUnassignedAccounts", () => {
8
+ it("returns unassigned active accounts in a CoA", async () => {
9
+ const unassignedAccount = { ...baseActiveAccount, accountGroupId: null };
10
+ const { db, spies } = createMockDb<DB>();
11
+ spies.select.mockReturnValue([unassignedAccount]);
12
+
13
+ const result = await run(db, { chartOfAccountsId: "coa-2" });
14
+
15
+ expect(result.ok).toBe(true);
16
+ if (result.ok) {
17
+ expect(result.value.items).toEqual([unassignedAccount]);
18
+ }
19
+ });
20
+
21
+ it("excludes accounts that are assigned to a group", async () => {
22
+ const { db, spies } = createMockDb<DB>();
23
+ // Only unassigned accounts returned by the query
24
+ spies.select.mockReturnValue([]);
25
+
26
+ const result = await run(db, { chartOfAccountsId: "coa-2" });
27
+
28
+ expect(result.ok).toBe(true);
29
+ if (result.ok) {
30
+ expect(result.value.items).toEqual([]);
31
+ }
32
+ });
33
+
34
+ it("excludes DRAFT accounts", async () => {
35
+ const { db, spies } = createMockDb<DB>();
36
+ // Query filters status = ACTIVE, so DRAFT accounts excluded
37
+ spies.select.mockReturnValue([]);
38
+
39
+ const result = await run(db, { chartOfAccountsId: "coa-2" });
40
+
41
+ expect(result.ok).toBe(true);
42
+ if (result.ok) {
43
+ expect(result.value.items).toEqual([]);
44
+ }
45
+ });
46
+
47
+ it("excludes INACTIVE accounts", async () => {
48
+ const { db, spies } = createMockDb<DB>();
49
+ spies.select.mockReturnValue([]);
50
+
51
+ const result = await run(db, { chartOfAccountsId: "coa-2" });
52
+
53
+ expect(result.ok).toBe(true);
54
+ if (result.ok) {
55
+ expect(result.value.items).toEqual([]);
56
+ }
57
+ });
58
+
59
+ it("returns accounts sorted by code ascending", async () => {
60
+ const account1 = {
61
+ ...baseDraftAccount,
62
+ status: "ACTIVE" as const,
63
+ accountGroupId: null,
64
+ code: "1100",
65
+ };
66
+ const account2 = {
67
+ ...baseDraftAccount,
68
+ id: "account-6",
69
+ status: "ACTIVE" as const,
70
+ accountGroupId: null,
71
+ code: "1200",
72
+ };
73
+ const { db, spies } = createMockDb<DB>();
74
+ spies.select.mockReturnValue([account1, account2]);
75
+
76
+ const result = await run(db, { chartOfAccountsId: "coa-2" });
77
+
78
+ expect(result.ok).toBe(true);
79
+ if (result.ok) {
80
+ expect(result.value.items).toEqual([account1, account2]);
81
+ }
82
+ });
83
+
84
+ it("returns empty list when all active accounts are assigned", async () => {
85
+ const { db, spies } = createMockDb<DB>();
86
+ spies.select.mockReturnValue([]);
87
+
88
+ const result = await run(db, { chartOfAccountsId: "coa-2" });
89
+
90
+ expect(result.ok).toBe(true);
91
+ if (result.ok) {
92
+ expect(result.value.items).toEqual([]);
93
+ expect(result.value.hasNextPage).toBe(false);
94
+ }
95
+ });
96
+ });
@@ -0,0 +1,39 @@
1
+ import {
2
+ ok,
3
+ type ReadonlyDB,
4
+ type PaginationInput,
5
+ buildPaginatedResult,
6
+ DEFAULT_PAGE_SIZE,
7
+ } from "../../../shared";
8
+ import type { DB } from "../generated/kysely-tailordb";
9
+
10
+ type UnassignedAccountOrderByField = "code" | "name" | "createdAt";
11
+
12
+ export interface ListUnassignedAccountsInput extends PaginationInput<UnassignedAccountOrderByField> {
13
+ chartOfAccountsId: string;
14
+ }
15
+
16
+ /**
17
+ * Function: listUnassignedAccounts
18
+ *
19
+ * Lists active accounts within a CoA that are not assigned to any account group.
20
+ */
21
+ export async function run(db: ReadonlyDB<DB>, input: ListUnassignedAccountsInput) {
22
+ const limit = input.limit ?? DEFAULT_PAGE_SIZE;
23
+ const offset = input.offset ?? 0;
24
+ const orderBy = input.orderBy ?? "code";
25
+ const orderDirection = input.orderDirection ?? "asc";
26
+
27
+ const accounts = await db
28
+ .selectFrom("Account")
29
+ .selectAll()
30
+ .where("chartOfAccountsId", "=", input.chartOfAccountsId)
31
+ .where("accountGroupId", "is", null)
32
+ .where("status", "=", "ACTIVE")
33
+ .orderBy(orderBy, orderDirection)
34
+ .limit(limit + 1)
35
+ .offset(offset)
36
+ .execute();
37
+
38
+ return ok(buildPaginatedResult(accounts, limit));
39
+ }
@@ -0,0 +1,13 @@
1
+ import { defineConfig, definePlugins } from "@tailor-platform/sdk";
2
+ import { kyselyTypePlugin } from "@tailor-platform/sdk/plugin/kysely-type";
3
+ import { enumConstantsPlugin } from "@tailor-platform/sdk/plugin/enum-constants";
4
+
5
+ export default defineConfig({
6
+ name: "coa-management",
7
+ db: { "main-db": { files: [`./db/*.ts`, `./lib/_db_deps.ts`] } },
8
+ });
9
+
10
+ export const plugins = definePlugins(
11
+ kyselyTypePlugin({ distPath: `./generated/kysely-tailordb.ts` }),
12
+ enumConstantsPlugin({ distPath: "./generated/enums.ts" }),
13
+ );
@@ -0,0 +1,13 @@
1
+ // This file is auto-generated by @tailor-platform/sdk
2
+ // Do not edit this file manually
3
+ // Regenerated automatically when running 'tailor-sdk apply' or 'tailor-sdk generate'
4
+
5
+ declare module "@tailor-platform/sdk" {
6
+ interface AttributeMap {}
7
+ interface AttributeList {
8
+ __tuple?: [];
9
+ }
10
+ interface Env {}
11
+ }
12
+
13
+ export {};
@@ -0,0 +1,201 @@
1
+ import type { ChartOfAccounts, AccountGroup, Account, Schema } from "../lib/types";
2
+
3
+ // ChartOfAccounts fixtures
4
+ export const baseDraftCoa = {
5
+ id: "coa-1",
6
+ name: "Standard CoA",
7
+ description: "Standard chart of accounts",
8
+ companyId: "company-1",
9
+ baseCurrencyId: "currency-usd",
10
+ status: "DRAFT",
11
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
12
+ updatedAt: null,
13
+ } as const satisfies ChartOfAccounts<Schema>;
14
+
15
+ export const baseActiveCoa = {
16
+ id: "coa-2",
17
+ name: "Active CoA",
18
+ description: "Active chart of accounts",
19
+ companyId: "company-1",
20
+ baseCurrencyId: "currency-usd",
21
+ status: "ACTIVE",
22
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
23
+ updatedAt: null,
24
+ } as const satisfies ChartOfAccounts<Schema>;
25
+
26
+ export const baseArchivedCoa = {
27
+ id: "coa-3",
28
+ name: "Archived CoA",
29
+ description: "Archived chart of accounts",
30
+ companyId: "company-1",
31
+ baseCurrencyId: "currency-usd",
32
+ status: "ARCHIVED",
33
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
34
+ updatedAt: null,
35
+ } as const satisfies ChartOfAccounts<Schema>;
36
+
37
+ // AccountGroup fixtures
38
+ export const baseRootGroup = {
39
+ id: "group-1",
40
+ code: "1000",
41
+ name: "Assets",
42
+ chartOfAccountsId: "coa-2",
43
+ parentAccountGroupId: null,
44
+ sortOrder: 1,
45
+ numberRangeStart: 1000,
46
+ numberRangeEnd: 1999,
47
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
48
+ updatedAt: null,
49
+ } as const satisfies AccountGroup<Schema>;
50
+
51
+ export const baseChildGroup = {
52
+ id: "group-2",
53
+ code: "1100",
54
+ name: "Current Assets",
55
+ chartOfAccountsId: "coa-2",
56
+ parentAccountGroupId: "group-1",
57
+ sortOrder: 1,
58
+ numberRangeStart: 1100,
59
+ numberRangeEnd: 1199,
60
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
61
+ updatedAt: null,
62
+ } as const satisfies AccountGroup<Schema>;
63
+
64
+ export const baseGrandchildGroup = {
65
+ id: "group-3",
66
+ code: "1110",
67
+ name: "Cash and Equivalents",
68
+ chartOfAccountsId: "coa-2",
69
+ parentAccountGroupId: "group-2",
70
+ sortOrder: 1,
71
+ numberRangeStart: 1110,
72
+ numberRangeEnd: 1119,
73
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
74
+ updatedAt: null,
75
+ } as const satisfies AccountGroup<Schema>;
76
+
77
+ export const baseGroupNoRange = {
78
+ id: "group-4",
79
+ code: "2000",
80
+ name: "Liabilities",
81
+ chartOfAccountsId: "coa-2",
82
+ parentAccountGroupId: null,
83
+ sortOrder: 2,
84
+ numberRangeStart: null,
85
+ numberRangeEnd: null,
86
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
87
+ updatedAt: null,
88
+ } as const satisfies AccountGroup<Schema>;
89
+
90
+ // Account fixtures
91
+ export const baseDraftAccount = {
92
+ id: "account-1",
93
+ code: "1100",
94
+ name: "Cash",
95
+ accountType: "ASSET",
96
+ classification: "REGULAR",
97
+ chartOfAccountsId: "coa-2",
98
+ accountGroupId: null,
99
+ currencyRestriction: null,
100
+ reconciliation: false,
101
+ defaultTaxCode: null,
102
+ tags: null,
103
+ successorAccountId: null,
104
+ hasPostedTransactions: false,
105
+ status: "DRAFT",
106
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
107
+ updatedAt: null,
108
+ } as const satisfies Account<Schema>;
109
+
110
+ export const baseActiveAccount = {
111
+ id: "account-2",
112
+ code: "1200",
113
+ name: "Accounts Receivable",
114
+ accountType: "ASSET",
115
+ classification: "RECEIVABLE",
116
+ chartOfAccountsId: "coa-2",
117
+ accountGroupId: "group-2",
118
+ currencyRestriction: null,
119
+ reconciliation: true,
120
+ defaultTaxCode: null,
121
+ tags: null,
122
+ successorAccountId: null,
123
+ hasPostedTransactions: false,
124
+ status: "ACTIVE",
125
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
126
+ updatedAt: null,
127
+ } as const satisfies Account<Schema>;
128
+
129
+ export const baseInactiveAccount = {
130
+ id: "account-3",
131
+ code: "1300",
132
+ name: "Old Bank Account",
133
+ accountType: "ASSET",
134
+ classification: "BANK_CASH",
135
+ chartOfAccountsId: "coa-2",
136
+ accountGroupId: null,
137
+ currencyRestriction: null,
138
+ reconciliation: true,
139
+ defaultTaxCode: null,
140
+ tags: null,
141
+ successorAccountId: "account-2",
142
+ hasPostedTransactions: true,
143
+ status: "INACTIVE",
144
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
145
+ updatedAt: null,
146
+ } as const satisfies Account<Schema>;
147
+
148
+ export const baseAccountWithPostedTransactions = {
149
+ id: "account-4",
150
+ code: "1400",
151
+ name: "Main Bank",
152
+ accountType: "ASSET",
153
+ classification: "BANK_CASH",
154
+ chartOfAccountsId: "coa-2",
155
+ accountGroupId: null,
156
+ currencyRestriction: null,
157
+ reconciliation: true,
158
+ defaultTaxCode: null,
159
+ tags: null,
160
+ successorAccountId: null,
161
+ hasPostedTransactions: true,
162
+ status: "ACTIVE",
163
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
164
+ updatedAt: null,
165
+ } as const satisfies Account<Schema>;
166
+
167
+ export const baseRetainedEarningsAccount = {
168
+ id: "account-5",
169
+ code: "3100",
170
+ name: "Retained Earnings",
171
+ accountType: "EQUITY",
172
+ classification: "RETAINED_EARNINGS",
173
+ chartOfAccountsId: "coa-2",
174
+ accountGroupId: null,
175
+ currencyRestriction: null,
176
+ reconciliation: false,
177
+ defaultTaxCode: null,
178
+ tags: null,
179
+ successorAccountId: null,
180
+ hasPostedTransactions: false,
181
+ status: "ACTIVE",
182
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
183
+ updatedAt: null,
184
+ } as const satisfies Account<Schema>;
185
+
186
+ // Company fixture (for cross-module validation)
187
+ export const baseActiveCompany = {
188
+ id: "company-1",
189
+ legalName: "Test Corp",
190
+ baseCurrencyId: "currency-usd",
191
+ status: "ACTIVE",
192
+ taxId: null,
193
+ registrationNumber: null,
194
+ street: "123 Main St",
195
+ city: "New York",
196
+ state: "NY",
197
+ postalCode: "10001",
198
+ country: "US",
199
+ createdAt: new Date("2024-01-01T00:00:00.000Z"),
200
+ updatedAt: null,
201
+ };
@@ -29,7 +29,7 @@ Each item has its own lifecycle (DRAFT → ACTIVE ↔ INACTIVE), unique SKU iden
29
29
  - Sales price list and pricing rule management (pricing module)
30
30
  - Inventory tracking and stock levels (inventory module)
31
31
  - Lot and serial number management (inventory module)
32
- - Vendor/supplier management (supplier-management module)
32
+ - Vendor/supplier management (business-partner module)
33
33
  - Bill of Materials (manufacturing module)
34
34
  - Product images and digital asset management
35
35
 
@@ -0,0 +1,57 @@
1
+ # README
2
+
3
+ ## Overview
4
+
5
+ The Organization module manages the foundational organizational structure of the ERP system — legal entities (companies), departments, and physical sites. It defines "who we are" and "where we operate" as the structural backbone that all transactional modules reference for scoping and context.
6
+
7
+ Each company represents a legal entity with its own tax identity, registered address, and base currency assignment. Departments model the internal functional structure within a company, while sites represent the physical facilities (offices, warehouses, stores) where operations take place. Together, these entities provide the multi-company, multi-site foundation that downstream modules (accounting, sales, purchasing, inventory) depend on.
8
+
9
+ ## Key Features
10
+
11
+ - **[Company Lifecycle](docs/features/company-lifecycle.md)**: Create and manage legal entities with lifecycle state machine (DRAFT → ACTIVE ↔ INACTIVE). Companies store legal name, tax ID, registration number, registered address, and base currency assignment. Fiscal calendar is owned by accounting
12
+ - **[Department Management](docs/features/department-management.md)**: Create and manage departments within a company with self-referential hierarchy (parent department), unique code per company, and lifecycle state (ACTIVE/INACTIVE). Manager assignment is deferred to future HR/employee module
13
+ - **[Site Management](docs/features/site-management.md)**: Manage physical sites/facilities owned by a company — offices, warehouses, stores, factories. Each site has a structured address, type classification, country, timezone, and lifecycle state. Warehouse storage layout (zones, bins, aisles) is owned by warehouse modules using separate `Warehouse`/`StorageLocation` entities
14
+
15
+ ## Module Scope
16
+
17
+ ### In Scope
18
+
19
+ - Company/legal entity master data management (create, update, delete, status transitions)
20
+ - Company lifecycle state machine (DRAFT → ACTIVE ↔ INACTIVE)
21
+ - Tax identification number and registration number storage per company
22
+ - Base currency assignment per company (currency master data owned by primitives module; organization stores only the company→currency reference)
23
+ - Department CRUD with hierarchical parent-child structure
24
+ - Department code uniqueness enforcement per company
25
+ - Physical site management with structured addresses
26
+ - Site type classification (office, warehouse, store, factory)
27
+ - Site country and timezone assignment
28
+
29
+ ### Out of Scope
30
+
31
+ - User account management and authentication (user-management module)
32
+ - Employee profiles, HR attributes, and employment records (future HR/employee module)
33
+ - Department manager assignment — requires employee/worker reference, not user ID (future HR/employee module)
34
+ - Company-to-user membership and role mapping (future organization-membership or HR module)
35
+ - Organizational hierarchy with multiple purposes and effective dates (future enhancement)
36
+ - Business unit and division management for financial reporting (future accounting module)
37
+ - Cost center and profit center management (future accounting module)
38
+ - Fiscal calendar management — fiscal year, periods, cutoff dates (future accounting module)
39
+ - Inter-company transaction configuration (future enhancement)
40
+ - Warehouse storage layout — `Warehouse`/`StorageLocation` with zones, bins, aisles (future warehouse module; references organization `Site`)
41
+ - Business partner addresses — billing, shipping (future business-partner module)
42
+
43
+ ### Scope Decision Rationale
44
+
45
+ Organization is strictly scoped to **structural identity** — the legal, functional, and physical structure of the business. It answers "which legal entity?", "which department?", and "which site?" without owning any transactional or operational data.
46
+
47
+ Company/legal entity is the root scoping entity. Nearly every transactional record in the ERP will carry a `companyId` referencing this module. This makes organization a foundational module that should remain stable and simple.
48
+
49
+ Departments are included because they represent the internal functional structure that many modules reference (cost allocation, approval workflows, reporting). The self-referential hierarchy is sufficient for initial needs; a more flexible multi-purpose hierarchy system can be added later if required.
50
+
51
+ Sites are included because physical facilities are referenced by inventory (stock holding), sales (ship-from), purchasing (delivery destination), and tax (jurisdiction). Organization owns the site identity and address; warehouse modules own the operational storage layout (`Warehouse`/`StorageLocation`) within a site.
52
+
53
+ Employee/HR data is excluded because an employee is a business domain entity with its own lifecycle (hiring, termination, leave) that differs from organizational structure. A user account (user-management) is a login identity, an employee is an HR record, and a department membership is a structural assignment — these three concepts must remain separate. Consequently, department manager and company-to-user membership are also deferred: the manager of a department is an employee/worker, not a login identity, and membership requires an employee concept that this module does not own.
54
+
55
+ ## Module Dependencies
56
+
57
+ - [primitives](../primitives/README.md) — Currency definitions for company base currency assignment
File without changes
@@ -0,0 +1,6 @@
1
+ // @generated — do not edit
2
+ import { defineCommand } from "../../../shared";
3
+ import { permissions } from "../lib/permissions.generated";
4
+ import { run } from "./activateCompany";
5
+
6
+ export const activateCompany = defineCommand(permissions.activateCompany, run);
@@ -0,0 +1,184 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import type { CommandContext } from "../../../shared";
4
+ import type { Transaction } from "../generated/kysely-tailordb";
5
+ import {
6
+ CompanyNotFoundError,
7
+ InvalidStateError,
8
+ MissingRequiredFieldsError,
9
+ InvalidBaseCurrencyError,
10
+ } from "../lib/errors.generated";
11
+ import {
12
+ draftCompany,
13
+ activeCompany,
14
+ inactiveCompany,
15
+ draftCompanyNoCurrency,
16
+ } from "../testing/fixtures";
17
+ import { getCurrency } from "../../primitives/query/getCurrency.generated";
18
+ import { run } from "./activateCompany";
19
+
20
+ const ctx: CommandContext = {
21
+ actorId: "test-actor",
22
+ permissions: ["organization:activateCompany"],
23
+ };
24
+
25
+ const deps = { getCurrency };
26
+
27
+ describe("activateCompany", () => {
28
+ it("activates DRAFT company with all required fields", async () => {
29
+ const { db, spies } = createMockDb<Transaction>();
30
+ const activatedCompany = { ...draftCompany, status: "ACTIVE" };
31
+ spies.select
32
+ .mockReturnValueOnce(draftCompany) // company lookup
33
+ .mockReturnValueOnce({ id: "currency-usd", isActive: true }); // getCurrency
34
+ spies.update.mockReturnValue(activatedCompany);
35
+
36
+ const result = await run(db, { companyId: draftCompany.id }, ctx, deps);
37
+
38
+ expect(result.ok).toBe(true);
39
+ if (result.ok) {
40
+ expect(result.value.company.status).toBe("ACTIVE");
41
+ }
42
+ });
43
+
44
+ it("throws when company does not exist", async () => {
45
+ const { db, spies } = createMockDb<Transaction>();
46
+ spies.select.mockReturnValueOnce(undefined);
47
+
48
+ const result = await run(db, { companyId: "nonexistent" }, ctx, deps);
49
+
50
+ expect(result.ok).toBe(false);
51
+ if (!result.ok) {
52
+ expect(result.error).toBeInstanceOf(CompanyNotFoundError);
53
+ }
54
+ });
55
+
56
+ it("throws when company is already ACTIVE", async () => {
57
+ const { db, spies } = createMockDb<Transaction>();
58
+ spies.select.mockReturnValueOnce(activeCompany);
59
+
60
+ const result = await run(db, { companyId: activeCompany.id }, ctx, deps);
61
+
62
+ expect(result.ok).toBe(false);
63
+ if (!result.ok) {
64
+ expect(result.error).toBeInstanceOf(InvalidStateError);
65
+ }
66
+ });
67
+
68
+ it("throws when company is INACTIVE", async () => {
69
+ const { db, spies } = createMockDb<Transaction>();
70
+ spies.select.mockReturnValueOnce(inactiveCompany);
71
+
72
+ const result = await run(db, { companyId: inactiveCompany.id }, ctx, deps);
73
+
74
+ expect(result.ok).toBe(false);
75
+ if (!result.ok) {
76
+ expect(result.error).toBeInstanceOf(InvalidStateError);
77
+ }
78
+ });
79
+
80
+ it("throws when legal name is missing", async () => {
81
+ const { db, spies } = createMockDb<Transaction>();
82
+ const companyNoLegalName = { ...draftCompany, legalName: "" };
83
+ spies.select.mockReturnValueOnce(companyNoLegalName);
84
+
85
+ const result = await run(db, { companyId: companyNoLegalName.id }, ctx, deps);
86
+
87
+ expect(result.ok).toBe(false);
88
+ if (!result.ok) {
89
+ expect(result.error).toBeInstanceOf(MissingRequiredFieldsError);
90
+ }
91
+ });
92
+
93
+ it("throws when base currency is not assigned", async () => {
94
+ const { db, spies } = createMockDb<Transaction>();
95
+ spies.select.mockReturnValueOnce(draftCompanyNoCurrency);
96
+
97
+ const result = await run(db, { companyId: draftCompanyNoCurrency.id }, ctx, deps);
98
+
99
+ expect(result.ok).toBe(false);
100
+ if (!result.ok) {
101
+ expect(result.error).toBeInstanceOf(MissingRequiredFieldsError);
102
+ }
103
+ });
104
+
105
+ it("throws when base currency references a non-existent Currency", async () => {
106
+ const { db, spies } = createMockDb<Transaction>();
107
+ spies.select
108
+ .mockReturnValueOnce(draftCompany) // company lookup
109
+ .mockReturnValueOnce(undefined); // getCurrency returns null
110
+
111
+ const result = await run(db, { companyId: draftCompany.id }, ctx, deps);
112
+
113
+ expect(result.ok).toBe(false);
114
+ if (!result.ok) {
115
+ expect(result.error).toBeInstanceOf(InvalidBaseCurrencyError);
116
+ }
117
+ });
118
+
119
+ it("throws when base currency references an inactive Currency", async () => {
120
+ const { db, spies } = createMockDb<Transaction>();
121
+ spies.select
122
+ .mockReturnValueOnce(draftCompany) // company lookup
123
+ .mockReturnValueOnce({ id: "currency-usd", isActive: false }); // getCurrency inactive
124
+
125
+ const result = await run(db, { companyId: draftCompany.id }, ctx, deps);
126
+
127
+ expect(result.ok).toBe(false);
128
+ if (!result.ok) {
129
+ expect(result.error).toBeInstanceOf(InvalidBaseCurrencyError);
130
+ }
131
+ });
132
+
133
+ it("throws when address street is missing", async () => {
134
+ const { db, spies } = createMockDb<Transaction>();
135
+ const companyNoStreet = { ...draftCompany, street: null };
136
+ spies.select.mockReturnValueOnce(companyNoStreet);
137
+
138
+ const result = await run(db, { companyId: companyNoStreet.id }, ctx, deps);
139
+
140
+ expect(result.ok).toBe(false);
141
+ if (!result.ok) {
142
+ expect(result.error).toBeInstanceOf(MissingRequiredFieldsError);
143
+ }
144
+ });
145
+
146
+ it("throws when address city is missing", async () => {
147
+ const { db, spies } = createMockDb<Transaction>();
148
+ const companyNoCity = { ...draftCompany, city: null };
149
+ spies.select.mockReturnValueOnce(companyNoCity);
150
+
151
+ const result = await run(db, { companyId: companyNoCity.id }, ctx, deps);
152
+
153
+ expect(result.ok).toBe(false);
154
+ if (!result.ok) {
155
+ expect(result.error).toBeInstanceOf(MissingRequiredFieldsError);
156
+ }
157
+ });
158
+
159
+ it("throws when address postalCode is missing", async () => {
160
+ const { db, spies } = createMockDb<Transaction>();
161
+ const companyNoPostalCode = { ...draftCompany, postalCode: null };
162
+ spies.select.mockReturnValueOnce(companyNoPostalCode);
163
+
164
+ const result = await run(db, { companyId: companyNoPostalCode.id }, ctx, deps);
165
+
166
+ expect(result.ok).toBe(false);
167
+ if (!result.ok) {
168
+ expect(result.error).toBeInstanceOf(MissingRequiredFieldsError);
169
+ }
170
+ });
171
+
172
+ it("throws when address country is missing", async () => {
173
+ const { db, spies } = createMockDb<Transaction>();
174
+ const companyNoCountry = { ...draftCompany, country: null };
175
+ spies.select.mockReturnValueOnce(companyNoCountry);
176
+
177
+ const result = await run(db, { companyId: companyNoCountry.id }, ctx, deps);
178
+
179
+ expect(result.ok).toBe(false);
180
+ if (!result.ok) {
181
+ expect(result.error).toBeInstanceOf(MissingRequiredFieldsError);
182
+ }
183
+ });
184
+ });