@tailor-platform/erp-kit 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (817) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +35 -7
  3. package/dist/cli.mjs +783 -272
  4. package/package.json +5 -4
  5. package/skills/erp-kit-app-1-requirements/SKILL.md +39 -12
  6. package/skills/{erp-kit-app-3-plan → erp-kit-app-1-requirements}/references/story-extraction.md +1 -1
  7. package/skills/erp-kit-app-2-requirements-review/SKILL.md +29 -5
  8. package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +4 -0
  9. package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +4 -0
  10. package/skills/erp-kit-app-2-requirements-review/references/story-quality-check.md +67 -0
  11. package/skills/erp-kit-app-3-plan/SKILL.md +51 -50
  12. package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +24 -18
  13. package/skills/erp-kit-app-3-plan/references/screen-extraction.md +18 -2
  14. package/skills/erp-kit-app-4-plan-review/SKILL.md +16 -13
  15. package/skills/erp-kit-app-5-impl-backend/SKILL.md +19 -11
  16. package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -22
  17. package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +0 -1
  18. package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +13 -4
  19. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +16 -0
  20. package/skills/erp-kit-app-6-impl-frontend/references/pages.md +16 -46
  21. package/skills/erp-kit-app-7-impl-review/SKILL.md +29 -23
  22. package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +16 -17
  23. package/skills/erp-kit-module-1-requirements/SKILL.md +6 -12
  24. package/skills/erp-kit-module-2-requirements-review/SKILL.md +29 -5
  25. package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +19 -0
  26. package/skills/erp-kit-module-3-plan/SKILL.md +2 -4
  27. package/skills/erp-kit-module-4-plan-review/SKILL.md +30 -7
  28. package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +15 -0
  29. package/skills/erp-kit-module-6-impl-review/SKILL.md +21 -7
  30. package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +15 -0
  31. package/skills/erp-kit-module-shared/SKILL.md +4 -0
  32. package/skills/erp-kit-module-shared/references/commands.md +1 -1
  33. package/skills/erp-kit-module-shared/references/queries.md +5 -6
  34. package/src/commands/app/index.ts +28 -17
  35. package/src/commands/check.test.ts +1 -1
  36. package/src/commands/check.ts +2 -35
  37. package/src/commands/doc/index.ts +83 -0
  38. package/src/commands/doc/module.test.ts +119 -0
  39. package/src/commands/doc/module.ts +114 -0
  40. package/src/commands/doc/modules.test.ts +103 -0
  41. package/src/commands/doc/modules.ts +98 -0
  42. package/src/commands/doc/search.test.ts +94 -0
  43. package/src/commands/doc/search.ts +111 -0
  44. package/src/commands/generate-doc.ts +17 -10
  45. package/src/commands/index.ts +20 -8
  46. package/src/commands/lib/command-result.ts +30 -0
  47. package/src/commands/lib/discovery.test.ts +74 -0
  48. package/src/commands/lib/discovery.ts +106 -0
  49. package/src/commands/lib/paths.ts +22 -0
  50. package/src/commands/lib/sync-check-source.test.ts +197 -0
  51. package/src/commands/lib/sync-check-source.ts +100 -0
  52. package/src/commands/lib/sync-check-tests.test.ts +178 -0
  53. package/src/commands/lib/sync-check-tests.ts +69 -0
  54. package/src/commands/mock/index.ts +11 -6
  55. package/src/commands/module/generate.ts +13 -8
  56. package/src/commands/module/index.ts +17 -21
  57. package/src/commands/parse-doc-test-cases.ts +13 -2
  58. package/src/commands/sync-check.test.ts +6 -364
  59. package/src/commands/sync-check.ts +7 -251
  60. package/src/generator/generate-app-code.test.ts +121 -0
  61. package/src/generator/generate-app-code.ts +51 -0
  62. package/src/generator/generate-code-boilerplate.test.ts +1 -2
  63. package/src/generator/generate-code.test.ts +43 -12
  64. package/src/generator/generate-code.ts +12 -226
  65. package/src/generator/generate-errors.ts +34 -0
  66. package/src/generator/generate-permissions.ts +12 -0
  67. package/src/generator/generate-shells.ts +28 -0
  68. package/src/generator/generate-stubs.ts +31 -0
  69. package/src/generator/parse-resolver-doc.test.ts +89 -0
  70. package/src/generator/parse-resolver-doc.ts +125 -0
  71. package/src/generator/scaffold.ts +57 -0
  72. package/src/generator/stub-templates.test.ts +55 -0
  73. package/src/generator/stub-templates.ts +145 -0
  74. package/src/module.ts +3 -0
  75. package/src/modules/audit/README.md +46 -0
  76. package/src/modules/audit/command/activateAuditPolicy.generated.ts +6 -0
  77. package/src/modules/audit/command/activateAuditPolicy.test.ts +186 -0
  78. package/src/modules/audit/command/activateAuditPolicy.ts +97 -0
  79. package/src/modules/audit/command/createAuditPolicy.generated.ts +6 -0
  80. package/src/modules/audit/command/createAuditPolicy.test.ts +395 -0
  81. package/src/modules/audit/command/createAuditPolicy.ts +131 -0
  82. package/src/modules/audit/command/deactivateAuditPolicy.generated.ts +6 -0
  83. package/src/modules/audit/command/deactivateAuditPolicy.test.ts +138 -0
  84. package/src/modules/audit/command/deactivateAuditPolicy.ts +58 -0
  85. package/src/modules/audit/command/deleteAuditPolicy.generated.ts +6 -0
  86. package/src/modules/audit/command/deleteAuditPolicy.test.ts +121 -0
  87. package/src/modules/audit/command/deleteAuditPolicy.ts +52 -0
  88. package/src/modules/audit/command/logAuditEvent.generated.ts +6 -0
  89. package/src/modules/audit/command/logAuditEvent.test.ts +991 -0
  90. package/src/modules/audit/command/logAuditEvent.ts +357 -0
  91. package/src/modules/audit/command/reactivateAuditPolicy.generated.ts +6 -0
  92. package/src/modules/audit/command/reactivateAuditPolicy.test.ts +143 -0
  93. package/src/modules/audit/command/reactivateAuditPolicy.ts +79 -0
  94. package/src/modules/audit/command/registerAuditableEntity.generated.ts +6 -0
  95. package/src/modules/audit/command/registerAuditableEntity.test.ts +268 -0
  96. package/src/modules/audit/command/registerAuditableEntity.ts +94 -0
  97. package/src/modules/audit/command/replaceAuditPolicy.generated.ts +6 -0
  98. package/src/modules/audit/command/replaceAuditPolicy.test.ts +242 -0
  99. package/src/modules/audit/command/replaceAuditPolicy.ts +91 -0
  100. package/src/modules/audit/command/updateAuditPolicy.generated.ts +6 -0
  101. package/src/modules/audit/command/updateAuditPolicy.test.ts +284 -0
  102. package/src/modules/audit/command/updateAuditPolicy.ts +151 -0
  103. package/src/modules/audit/db/auditEntry.ts +47 -0
  104. package/src/modules/audit/db/auditPolicy.ts +33 -0
  105. package/src/modules/audit/db/auditableEntity.ts +22 -0
  106. package/src/modules/audit/db/changeDetail.ts +28 -0
  107. package/src/modules/audit/db/policyFieldRule.ts +23 -0
  108. package/src/modules/audit/docs/commands/ActivateAuditPolicy.md +69 -0
  109. package/src/modules/audit/docs/commands/CreateAuditPolicy.md +79 -0
  110. package/src/modules/audit/docs/commands/DeactivateAuditPolicy.md +55 -0
  111. package/src/modules/audit/docs/commands/DeleteAuditPolicy.md +55 -0
  112. package/src/modules/audit/docs/commands/LogAuditEvent.md +137 -0
  113. package/src/modules/audit/docs/commands/ReactivateAuditPolicy.md +58 -0
  114. package/src/modules/audit/docs/commands/RegisterAuditableEntity.md +62 -0
  115. package/src/modules/audit/docs/commands/ReplaceAuditPolicy.md +72 -0
  116. package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +77 -0
  117. package/src/modules/audit/docs/features/audit-event-logging.md +126 -0
  118. package/src/modules/audit/docs/features/audit-policy-configuration.md +135 -0
  119. package/src/modules/audit/docs/features/field-level-change-tracking.md +95 -0
  120. package/src/modules/audit/docs/models/AuditEntry.md +55 -0
  121. package/src/modules/audit/docs/models/AuditPolicy.md +79 -0
  122. package/src/modules/audit/docs/models/AuditableEntity.md +38 -0
  123. package/src/modules/audit/docs/models/ChangeDetail.md +55 -0
  124. package/src/modules/audit/docs/models/PolicyFieldRule.md +45 -0
  125. package/src/modules/audit/docs/queries/GetAuditEntry.md +49 -0
  126. package/src/modules/audit/docs/queries/GetAuditPolicy.md +54 -0
  127. package/src/modules/audit/docs/queries/GetAuditSummary.md +84 -0
  128. package/src/modules/audit/docs/queries/GetChangeDetails.md +56 -0
  129. package/src/modules/audit/docs/queries/ListAuditPolicies.md +58 -0
  130. package/src/modules/audit/docs/queries/SearchAuditEntries.md +91 -0
  131. package/src/modules/audit/generated/kysely-tailordb.ts +92 -0
  132. package/src/modules/audit/index.ts +2 -0
  133. package/src/modules/audit/lib/_db_deps.ts +13 -0
  134. package/src/modules/audit/lib/errors.generated.ts +120 -0
  135. package/src/modules/audit/lib/permissions.generated.ts +14 -0
  136. package/src/modules/audit/lib/types.ts +33 -0
  137. package/src/modules/audit/module.ts +57 -0
  138. package/src/modules/audit/permissions.ts +39 -0
  139. package/src/modules/audit/query/getAuditEntry.generated.ts +5 -0
  140. package/src/modules/audit/query/getAuditEntry.test.ts +123 -0
  141. package/src/modules/audit/query/getAuditEntry.ts +42 -0
  142. package/src/modules/audit/query/getAuditPolicy.generated.ts +5 -0
  143. package/src/modules/audit/query/getAuditPolicy.test.ts +169 -0
  144. package/src/modules/audit/query/getAuditPolicy.ts +48 -0
  145. package/src/modules/audit/query/getAuditSummary.generated.ts +5 -0
  146. package/src/modules/audit/query/getAuditSummary.test.ts +632 -0
  147. package/src/modules/audit/query/getAuditSummary.ts +170 -0
  148. package/src/modules/audit/query/getChangeDetails.generated.ts +5 -0
  149. package/src/modules/audit/query/getChangeDetails.test.ts +195 -0
  150. package/src/modules/audit/query/getChangeDetails.ts +48 -0
  151. package/src/modules/audit/query/listAuditPolicies.generated.ts +5 -0
  152. package/src/modules/audit/query/listAuditPolicies.test.ts +239 -0
  153. package/src/modules/audit/query/listAuditPolicies.ts +100 -0
  154. package/src/modules/audit/query/searchAuditEntries.generated.ts +5 -0
  155. package/src/modules/audit/query/searchAuditEntries.test.ts +424 -0
  156. package/src/modules/audit/query/searchAuditEntries.ts +121 -0
  157. package/src/modules/audit/tailor.config.ts +13 -0
  158. package/src/modules/audit/tailor.d.ts +13 -0
  159. package/src/modules/audit/testing/fixtures.ts +215 -0
  160. package/src/modules/business-partner/README.md +60 -0
  161. package/src/modules/business-partner/command/activatePartner.generated.ts +6 -0
  162. package/src/modules/business-partner/command/activatePartner.test.ts +59 -0
  163. package/src/modules/business-partner/command/activatePartner.ts +45 -0
  164. package/src/modules/business-partner/command/assignRoleToPartner.generated.ts +6 -0
  165. package/src/modules/business-partner/command/assignRoleToPartner.test.ts +113 -0
  166. package/src/modules/business-partner/command/assignRoleToPartner.ts +72 -0
  167. package/src/modules/business-partner/command/createContactPerson.generated.ts +6 -0
  168. package/src/modules/business-partner/command/createContactPerson.test.ts +193 -0
  169. package/src/modules/business-partner/command/createContactPerson.ts +98 -0
  170. package/src/modules/business-partner/command/createPartner.generated.ts +6 -0
  171. package/src/modules/business-partner/command/createPartner.test.ts +179 -0
  172. package/src/modules/business-partner/command/createPartner.ts +82 -0
  173. package/src/modules/business-partner/command/createPartnerAddress.generated.ts +6 -0
  174. package/src/modules/business-partner/command/createPartnerAddress.test.ts +195 -0
  175. package/src/modules/business-partner/command/createPartnerAddress.ts +119 -0
  176. package/src/modules/business-partner/command/createPartnerBankAccount.generated.ts +6 -0
  177. package/src/modules/business-partner/command/createPartnerBankAccount.test.ts +297 -0
  178. package/src/modules/business-partner/command/createPartnerBankAccount.ts +114 -0
  179. package/src/modules/business-partner/command/createPartnerIdentification.generated.ts +6 -0
  180. package/src/modules/business-partner/command/createPartnerIdentification.test.ts +255 -0
  181. package/src/modules/business-partner/command/createPartnerIdentification.ts +97 -0
  182. package/src/modules/business-partner/command/deactivateContactPerson.generated.ts +6 -0
  183. package/src/modules/business-partner/command/deactivateContactPerson.test.ts +70 -0
  184. package/src/modules/business-partner/command/deactivateContactPerson.ts +54 -0
  185. package/src/modules/business-partner/command/deactivatePartner.generated.ts +6 -0
  186. package/src/modules/business-partner/command/deactivatePartner.test.ts +59 -0
  187. package/src/modules/business-partner/command/deactivatePartner.ts +46 -0
  188. package/src/modules/business-partner/command/deleteContactPerson.generated.ts +6 -0
  189. package/src/modules/business-partner/command/deleteContactPerson.test.ts +61 -0
  190. package/src/modules/business-partner/command/deleteContactPerson.ts +48 -0
  191. package/src/modules/business-partner/command/deletePartner.generated.ts +6 -0
  192. package/src/modules/business-partner/command/deletePartner.test.ts +58 -0
  193. package/src/modules/business-partner/command/deletePartner.ts +46 -0
  194. package/src/modules/business-partner/command/deletePartnerAddress.generated.ts +6 -0
  195. package/src/modules/business-partner/command/deletePartnerAddress.test.ts +74 -0
  196. package/src/modules/business-partner/command/deletePartnerAddress.ts +52 -0
  197. package/src/modules/business-partner/command/deletePartnerBankAccount.generated.ts +6 -0
  198. package/src/modules/business-partner/command/deletePartnerBankAccount.test.ts +55 -0
  199. package/src/modules/business-partner/command/deletePartnerBankAccount.ts +36 -0
  200. package/src/modules/business-partner/command/deletePartnerIdentification.generated.ts +6 -0
  201. package/src/modules/business-partner/command/deletePartnerIdentification.test.ts +47 -0
  202. package/src/modules/business-partner/command/deletePartnerIdentification.ts +37 -0
  203. package/src/modules/business-partner/command/reactivateContactPerson.generated.ts +6 -0
  204. package/src/modules/business-partner/command/reactivateContactPerson.test.ts +48 -0
  205. package/src/modules/business-partner/command/reactivateContactPerson.ts +48 -0
  206. package/src/modules/business-partner/command/reactivatePartner.generated.ts +6 -0
  207. package/src/modules/business-partner/command/reactivatePartner.test.ts +59 -0
  208. package/src/modules/business-partner/command/reactivatePartner.ts +46 -0
  209. package/src/modules/business-partner/command/removeRoleFromPartner.generated.ts +6 -0
  210. package/src/modules/business-partner/command/removeRoleFromPartner.test.ts +82 -0
  211. package/src/modules/business-partner/command/removeRoleFromPartner.ts +73 -0
  212. package/src/modules/business-partner/command/setDefaultPartnerAddress.generated.ts +6 -0
  213. package/src/modules/business-partner/command/setDefaultPartnerAddress.test.ts +60 -0
  214. package/src/modules/business-partner/command/setDefaultPartnerAddress.ts +48 -0
  215. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.generated.ts +6 -0
  216. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.test.ts +56 -0
  217. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.ts +51 -0
  218. package/src/modules/business-partner/command/setPrimaryContactPerson.generated.ts +6 -0
  219. package/src/modules/business-partner/command/setPrimaryContactPerson.test.ts +63 -0
  220. package/src/modules/business-partner/command/setPrimaryContactPerson.ts +55 -0
  221. package/src/modules/business-partner/command/updateContactPerson.generated.ts +6 -0
  222. package/src/modules/business-partner/command/updateContactPerson.test.ts +193 -0
  223. package/src/modules/business-partner/command/updateContactPerson.ts +92 -0
  224. package/src/modules/business-partner/command/updatePartner.generated.ts +6 -0
  225. package/src/modules/business-partner/command/updatePartner.test.ts +101 -0
  226. package/src/modules/business-partner/command/updatePartner.ts +76 -0
  227. package/src/modules/business-partner/command/updatePartnerAddress.generated.ts +6 -0
  228. package/src/modules/business-partner/command/updatePartnerAddress.test.ts +148 -0
  229. package/src/modules/business-partner/command/updatePartnerAddress.ts +64 -0
  230. package/src/modules/business-partner/command/updatePartnerBankAccount.generated.ts +6 -0
  231. package/src/modules/business-partner/command/updatePartnerBankAccount.test.ts +249 -0
  232. package/src/modules/business-partner/command/updatePartnerBankAccount.ts +109 -0
  233. package/src/modules/business-partner/command/updatePartnerIdentification.generated.ts +6 -0
  234. package/src/modules/business-partner/command/updatePartnerIdentification.test.ts +162 -0
  235. package/src/modules/business-partner/command/updatePartnerIdentification.ts +105 -0
  236. package/src/modules/business-partner/db/.gitkeep +0 -0
  237. package/src/modules/business-partner/db/businessPartner.ts +59 -0
  238. package/src/modules/business-partner/db/contactPerson.ts +49 -0
  239. package/src/modules/business-partner/db/partnerAddress.ts +45 -0
  240. package/src/modules/business-partner/db/partnerBankAccount.ts +53 -0
  241. package/src/modules/business-partner/db/partnerIdentification.ts +53 -0
  242. package/src/modules/business-partner/db/partnerRole.ts +43 -0
  243. package/src/modules/business-partner/docs/commands/ActivatePartner.md +39 -0
  244. package/src/modules/business-partner/docs/commands/AssignRoleToPartner.md +49 -0
  245. package/src/modules/business-partner/docs/commands/CreateContactPerson.md +59 -0
  246. package/src/modules/business-partner/docs/commands/CreatePartner.md +54 -0
  247. package/src/modules/business-partner/docs/commands/CreatePartnerAddress.md +60 -0
  248. package/src/modules/business-partner/docs/commands/CreatePartnerBankAccount.md +68 -0
  249. package/src/modules/business-partner/docs/commands/CreatePartnerIdentification.md +59 -0
  250. package/src/modules/business-partner/docs/commands/DeactivateContactPerson.md +42 -0
  251. package/src/modules/business-partner/docs/commands/DeactivatePartner.md +39 -0
  252. package/src/modules/business-partner/docs/commands/DeleteContactPerson.md +43 -0
  253. package/src/modules/business-partner/docs/commands/DeletePartner.md +40 -0
  254. package/src/modules/business-partner/docs/commands/DeletePartnerAddress.md +40 -0
  255. package/src/modules/business-partner/docs/commands/DeletePartnerBankAccount.md +35 -0
  256. package/src/modules/business-partner/docs/commands/DeletePartnerIdentification.md +33 -0
  257. package/src/modules/business-partner/docs/commands/ReactivateContactPerson.md +38 -0
  258. package/src/modules/business-partner/docs/commands/ReactivatePartner.md +39 -0
  259. package/src/modules/business-partner/docs/commands/RemoveRoleFromPartner.md +46 -0
  260. package/src/modules/business-partner/docs/commands/SetDefaultPartnerAddress.md +38 -0
  261. package/src/modules/business-partner/docs/commands/SetDefaultPartnerBankAccount.md +38 -0
  262. package/src/modules/business-partner/docs/commands/SetPrimaryContactPerson.md +43 -0
  263. package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +66 -0
  264. package/src/modules/business-partner/docs/commands/UpdatePartner.md +48 -0
  265. package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +46 -0
  266. package/src/modules/business-partner/docs/commands/UpdatePartnerBankAccount.md +64 -0
  267. package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +52 -0
  268. package/src/modules/business-partner/docs/features/contact-person-management.md +70 -0
  269. package/src/modules/business-partner/docs/features/partner-address-management.md +96 -0
  270. package/src/modules/business-partner/docs/features/partner-bank-account.md +70 -0
  271. package/src/modules/business-partner/docs/features/partner-identification.md +76 -0
  272. package/src/modules/business-partner/docs/features/partner-lifecycle.md +59 -0
  273. package/src/modules/business-partner/docs/features/partner-role-classification.md +73 -0
  274. package/src/modules/business-partner/docs/models/BusinessPartner.md +64 -0
  275. package/src/modules/business-partner/docs/models/ContactPerson.md +62 -0
  276. package/src/modules/business-partner/docs/models/PartnerAddress.md +52 -0
  277. package/src/modules/business-partner/docs/models/PartnerBankAccount.md +50 -0
  278. package/src/modules/business-partner/docs/models/PartnerIdentification.md +46 -0
  279. package/src/modules/business-partner/docs/models/PartnerRole.md +42 -0
  280. package/src/modules/business-partner/docs/queries/GetContactPerson.md +34 -0
  281. package/src/modules/business-partner/docs/queries/GetDefaultPartnerAddress.md +40 -0
  282. package/src/modules/business-partner/docs/queries/GetDefaultPartnerBankAccount.md +36 -0
  283. package/src/modules/business-partner/docs/queries/GetPartner.md +35 -0
  284. package/src/modules/business-partner/docs/queries/GetPartnerAddress.md +34 -0
  285. package/src/modules/business-partner/docs/queries/GetPartnerBankAccount.md +34 -0
  286. package/src/modules/business-partner/docs/queries/GetPartnerIdentification.md +34 -0
  287. package/src/modules/business-partner/docs/queries/GetPartnerRole.md +34 -0
  288. package/src/modules/business-partner/docs/queries/GetPrimaryContactPerson.md +36 -0
  289. package/src/modules/business-partner/docs/queries/ListContactPersonsByPartner.md +39 -0
  290. package/src/modules/business-partner/docs/queries/ListPartnerAddressesByPartner.md +41 -0
  291. package/src/modules/business-partner/docs/queries/ListPartnerBankAccountsByPartner.md +39 -0
  292. package/src/modules/business-partner/docs/queries/ListPartnerIdentificationsByPartner.md +41 -0
  293. package/src/modules/business-partner/docs/queries/ListPartnersByRole.md +47 -0
  294. package/src/modules/business-partner/executor/.gitkeep +0 -0
  295. package/src/modules/business-partner/generated/.gitkeep +0 -0
  296. package/src/modules/business-partner/generated/enums.ts +60 -0
  297. package/src/modules/business-partner/generated/kysely-tailordb.ts +114 -0
  298. package/src/modules/business-partner/index.ts +2 -0
  299. package/src/modules/business-partner/lib/_db_deps.ts +17 -0
  300. package/src/modules/business-partner/lib/errors.generated.ts +172 -0
  301. package/src/modules/business-partner/lib/permissions.generated.ts +30 -0
  302. package/src/modules/business-partner/lib/types.ts +58 -0
  303. package/src/modules/business-partner/module.ts +181 -0
  304. package/src/modules/business-partner/permissions.ts +3 -0
  305. package/src/modules/business-partner/query/.gitkeep +0 -0
  306. package/src/modules/business-partner/query/getContactPerson.generated.ts +5 -0
  307. package/src/modules/business-partner/query/getContactPerson.test.ts +31 -0
  308. package/src/modules/business-partner/query/getContactPerson.ts +16 -0
  309. package/src/modules/business-partner/query/getDefaultPartnerAddress.generated.ts +5 -0
  310. package/src/modules/business-partner/query/getDefaultPartnerAddress.test.ts +45 -0
  311. package/src/modules/business-partner/query/getDefaultPartnerAddress.ts +30 -0
  312. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.generated.ts +5 -0
  313. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.test.ts +43 -0
  314. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.ts +17 -0
  315. package/src/modules/business-partner/query/getPartner.generated.ts +5 -0
  316. package/src/modules/business-partner/query/getPartner.test.ts +31 -0
  317. package/src/modules/business-partner/query/getPartner.ts +16 -0
  318. package/src/modules/business-partner/query/getPartnerAddress.generated.ts +5 -0
  319. package/src/modules/business-partner/query/getPartnerAddress.test.ts +31 -0
  320. package/src/modules/business-partner/query/getPartnerAddress.ts +16 -0
  321. package/src/modules/business-partner/query/getPartnerBankAccount.generated.ts +5 -0
  322. package/src/modules/business-partner/query/getPartnerBankAccount.test.ts +31 -0
  323. package/src/modules/business-partner/query/getPartnerBankAccount.ts +16 -0
  324. package/src/modules/business-partner/query/getPartnerIdentification.generated.ts +5 -0
  325. package/src/modules/business-partner/query/getPartnerIdentification.test.ts +31 -0
  326. package/src/modules/business-partner/query/getPartnerIdentification.ts +16 -0
  327. package/src/modules/business-partner/query/getPartnerRole.generated.ts +5 -0
  328. package/src/modules/business-partner/query/getPartnerRole.test.ts +31 -0
  329. package/src/modules/business-partner/query/getPartnerRole.ts +19 -0
  330. package/src/modules/business-partner/query/getPrimaryContactPerson.generated.ts +5 -0
  331. package/src/modules/business-partner/query/getPrimaryContactPerson.test.ts +43 -0
  332. package/src/modules/business-partner/query/getPrimaryContactPerson.ts +17 -0
  333. package/src/modules/business-partner/query/listContactPersonsByPartner.generated.ts +5 -0
  334. package/src/modules/business-partner/query/listContactPersonsByPartner.test.ts +77 -0
  335. package/src/modules/business-partner/query/listContactPersonsByPartner.ts +32 -0
  336. package/src/modules/business-partner/query/listPartnerAddressesByPartner.generated.ts +5 -0
  337. package/src/modules/business-partner/query/listPartnerAddressesByPartner.test.ts +71 -0
  338. package/src/modules/business-partner/query/listPartnerAddressesByPartner.ts +37 -0
  339. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.generated.ts +5 -0
  340. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.test.ts +59 -0
  341. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.ts +32 -0
  342. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.generated.ts +5 -0
  343. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.test.ts +72 -0
  344. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.ts +40 -0
  345. package/src/modules/business-partner/query/listPartnersByRole.generated.ts +5 -0
  346. package/src/modules/business-partner/query/listPartnersByRole.test.ts +103 -0
  347. package/src/modules/business-partner/query/listPartnersByRole.ts +47 -0
  348. package/src/modules/business-partner/tailor.config.ts +13 -0
  349. package/src/modules/business-partner/tailor.d.ts +13 -0
  350. package/src/modules/business-partner/testing/fixtures.ts +204 -0
  351. package/src/modules/coa-management/README.md +61 -0
  352. package/src/modules/coa-management/command/.gitkeep +0 -0
  353. package/src/modules/coa-management/command/activateAccount.generated.ts +6 -0
  354. package/src/modules/coa-management/command/activateAccount.test.ts +125 -0
  355. package/src/modules/coa-management/command/activateAccount.ts +105 -0
  356. package/src/modules/coa-management/command/activateChartOfAccounts.generated.ts +6 -0
  357. package/src/modules/coa-management/command/activateChartOfAccounts.test.ts +113 -0
  358. package/src/modules/coa-management/command/activateChartOfAccounts.ts +104 -0
  359. package/src/modules/coa-management/command/createAccount.generated.ts +6 -0
  360. package/src/modules/coa-management/command/createAccount.test.ts +767 -0
  361. package/src/modules/coa-management/command/createAccount.ts +247 -0
  362. package/src/modules/coa-management/command/createAccountGroup.generated.ts +6 -0
  363. package/src/modules/coa-management/command/createAccountGroup.test.ts +494 -0
  364. package/src/modules/coa-management/command/createAccountGroup.ts +207 -0
  365. package/src/modules/coa-management/command/createChartOfAccounts.generated.ts +6 -0
  366. package/src/modules/coa-management/command/createChartOfAccounts.test.ts +502 -0
  367. package/src/modules/coa-management/command/createChartOfAccounts.ts +267 -0
  368. package/src/modules/coa-management/command/deactivateAccount.generated.ts +6 -0
  369. package/src/modules/coa-management/command/deactivateAccount.test.ts +199 -0
  370. package/src/modules/coa-management/command/deactivateAccount.ts +142 -0
  371. package/src/modules/coa-management/command/deactivateChartOfAccounts.generated.ts +6 -0
  372. package/src/modules/coa-management/command/deactivateChartOfAccounts.test.ts +91 -0
  373. package/src/modules/coa-management/command/deactivateChartOfAccounts.ts +88 -0
  374. package/src/modules/coa-management/command/deleteAccount.generated.ts +6 -0
  375. package/src/modules/coa-management/command/deleteAccount.test.ts +122 -0
  376. package/src/modules/coa-management/command/deleteAccount.ts +103 -0
  377. package/src/modules/coa-management/command/deleteAccountGroup.generated.ts +6 -0
  378. package/src/modules/coa-management/command/deleteAccountGroup.test.ts +120 -0
  379. package/src/modules/coa-management/command/deleteAccountGroup.ts +113 -0
  380. package/src/modules/coa-management/command/deleteChartOfAccounts.generated.ts +6 -0
  381. package/src/modules/coa-management/command/deleteChartOfAccounts.test.ts +154 -0
  382. package/src/modules/coa-management/command/deleteChartOfAccounts.ts +133 -0
  383. package/src/modules/coa-management/command/moveAccountGroup.generated.ts +6 -0
  384. package/src/modules/coa-management/command/moveAccountGroup.test.ts +199 -0
  385. package/src/modules/coa-management/command/moveAccountGroup.ts +145 -0
  386. package/src/modules/coa-management/command/reactivateAccount.generated.ts +6 -0
  387. package/src/modules/coa-management/command/reactivateAccount.test.ts +126 -0
  388. package/src/modules/coa-management/command/reactivateAccount.ts +123 -0
  389. package/src/modules/coa-management/command/updateAccount.generated.ts +6 -0
  390. package/src/modules/coa-management/command/updateAccount.test.ts +669 -0
  391. package/src/modules/coa-management/command/updateAccount.ts +370 -0
  392. package/src/modules/coa-management/command/updateAccountGroup.generated.ts +6 -0
  393. package/src/modules/coa-management/command/updateAccountGroup.test.ts +253 -0
  394. package/src/modules/coa-management/command/updateAccountGroup.ts +191 -0
  395. package/src/modules/coa-management/command/updateChartOfAccounts.generated.ts +6 -0
  396. package/src/modules/coa-management/command/updateChartOfAccounts.test.ts +153 -0
  397. package/src/modules/coa-management/command/updateChartOfAccounts.ts +133 -0
  398. package/src/modules/coa-management/db/.gitkeep +0 -0
  399. package/src/modules/coa-management/db/account.ts +119 -0
  400. package/src/modules/coa-management/db/accountGroup.ts +57 -0
  401. package/src/modules/coa-management/db/chartOfAccounts.ts +55 -0
  402. package/src/modules/coa-management/docs/commands/ActivateAccount.md +49 -0
  403. package/src/modules/coa-management/docs/commands/ActivateChartOfAccounts.md +47 -0
  404. package/src/modules/coa-management/docs/commands/CreateAccount.md +94 -0
  405. package/src/modules/coa-management/docs/commands/CreateAccountGroup.md +70 -0
  406. package/src/modules/coa-management/docs/commands/CreateChartOfAccounts.md +72 -0
  407. package/src/modules/coa-management/docs/commands/DeactivateAccount.md +65 -0
  408. package/src/modules/coa-management/docs/commands/DeactivateChartOfAccounts.md +44 -0
  409. package/src/modules/coa-management/docs/commands/DeleteAccount.md +52 -0
  410. package/src/modules/coa-management/docs/commands/DeleteAccountGroup.md +50 -0
  411. package/src/modules/coa-management/docs/commands/DeleteChartOfAccounts.md +48 -0
  412. package/src/modules/coa-management/docs/commands/MoveAccountGroup.md +57 -0
  413. package/src/modules/coa-management/docs/commands/ReactivateAccount.md +50 -0
  414. package/src/modules/coa-management/docs/commands/UpdateAccount.md +102 -0
  415. package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +62 -0
  416. package/src/modules/coa-management/docs/commands/UpdateChartOfAccounts.md +49 -0
  417. package/src/modules/coa-management/docs/features/account-group-hierarchy.md +81 -0
  418. package/src/modules/coa-management/docs/features/account-lifecycle.md +80 -0
  419. package/src/modules/coa-management/docs/features/account-management.md +114 -0
  420. package/src/modules/coa-management/docs/features/chart-of-accounts-setup.md +86 -0
  421. package/src/modules/coa-management/docs/models/Account.md +84 -0
  422. package/src/modules/coa-management/docs/models/AccountGroup.md +55 -0
  423. package/src/modules/coa-management/docs/models/ChartOfAccounts.md +65 -0
  424. package/src/modules/coa-management/docs/queries/DetectCircularReference.md +52 -0
  425. package/src/modules/coa-management/docs/queries/GetAccount.md +42 -0
  426. package/src/modules/coa-management/docs/queries/GetAccountGroup.md +42 -0
  427. package/src/modules/coa-management/docs/queries/GetChartOfAccounts.md +48 -0
  428. package/src/modules/coa-management/docs/queries/ListAccountGroups.md +42 -0
  429. package/src/modules/coa-management/docs/queries/ListAccounts.md +54 -0
  430. package/src/modules/coa-management/docs/queries/ListUnassignedAccounts.md +40 -0
  431. package/src/modules/coa-management/executor/.gitkeep +0 -0
  432. package/src/modules/coa-management/generated/.gitkeep +0 -0
  433. package/src/modules/coa-management/generated/enums.ts +45 -0
  434. package/src/modules/coa-management/generated/kysely-tailordb.ts +81 -0
  435. package/src/modules/coa-management/index.ts +2 -0
  436. package/src/modules/coa-management/lib/_db_deps.ts +17 -0
  437. package/src/modules/coa-management/lib/errors.generated.ts +162 -0
  438. package/src/modules/coa-management/lib/permissions.generated.ts +20 -0
  439. package/src/modules/coa-management/lib/types.ts +27 -0
  440. package/src/modules/coa-management/module.ts +136 -0
  441. package/src/modules/coa-management/permissions.ts +3 -0
  442. package/src/modules/coa-management/query/.gitkeep +0 -0
  443. package/src/modules/coa-management/query/detectCircularReference.generated.ts +5 -0
  444. package/src/modules/coa-management/query/detectCircularReference.test.ts +88 -0
  445. package/src/modules/coa-management/query/detectCircularReference.ts +46 -0
  446. package/src/modules/coa-management/query/getAccount.generated.ts +5 -0
  447. package/src/modules/coa-management/query/getAccount.test.ts +55 -0
  448. package/src/modules/coa-management/query/getAccount.ts +25 -0
  449. package/src/modules/coa-management/query/getAccountGroup.generated.ts +5 -0
  450. package/src/modules/coa-management/query/getAccountGroup.test.ts +55 -0
  451. package/src/modules/coa-management/query/getAccountGroup.ts +25 -0
  452. package/src/modules/coa-management/query/getChartOfAccounts.generated.ts +5 -0
  453. package/src/modules/coa-management/query/getChartOfAccounts.test.ts +79 -0
  454. package/src/modules/coa-management/query/getChartOfAccounts.ts +28 -0
  455. package/src/modules/coa-management/query/listAccountGroups.generated.ts +5 -0
  456. package/src/modules/coa-management/query/listAccountGroups.test.ts +72 -0
  457. package/src/modules/coa-management/query/listAccountGroups.ts +49 -0
  458. package/src/modules/coa-management/query/listAccounts.generated.ts +5 -0
  459. package/src/modules/coa-management/query/listAccounts.test.ts +136 -0
  460. package/src/modules/coa-management/query/listAccounts.ts +82 -0
  461. package/src/modules/coa-management/query/listUnassignedAccounts.generated.ts +5 -0
  462. package/src/modules/coa-management/query/listUnassignedAccounts.test.ts +96 -0
  463. package/src/modules/coa-management/query/listUnassignedAccounts.ts +39 -0
  464. package/src/modules/coa-management/tailor.config.ts +13 -0
  465. package/src/modules/coa-management/tailor.d.ts +13 -0
  466. package/src/modules/coa-management/testing/fixtures.ts +201 -0
  467. package/src/modules/item-management/README.md +1 -1
  468. package/src/modules/item-management/command/activateItem.generated.ts +1 -1
  469. package/src/modules/item-management/command/activateItem.ts +1 -1
  470. package/src/modules/item-management/command/assignItemToTaxonomy.generated.ts +1 -1
  471. package/src/modules/item-management/command/assignItemToTaxonomy.ts +1 -1
  472. package/src/modules/item-management/command/createItem.generated.ts +1 -1
  473. package/src/modules/item-management/command/createItem.test.ts +1 -1
  474. package/src/modules/item-management/command/createItem.ts +1 -1
  475. package/src/modules/item-management/command/createTaxonomyNode.generated.ts +1 -1
  476. package/src/modules/item-management/command/createTaxonomyNode.test.ts +1 -1
  477. package/src/modules/item-management/command/createTaxonomyNode.ts +1 -1
  478. package/src/modules/item-management/command/deactivateItem.generated.ts +1 -1
  479. package/src/modules/item-management/command/deactivateItem.ts +1 -1
  480. package/src/modules/item-management/command/deleteItem.generated.ts +1 -1
  481. package/src/modules/item-management/command/deleteItem.ts +1 -1
  482. package/src/modules/item-management/command/deleteTaxonomyNode.generated.ts +1 -1
  483. package/src/modules/item-management/command/deleteTaxonomyNode.ts +1 -1
  484. package/src/modules/item-management/command/moveTaxonomyNode.generated.ts +1 -1
  485. package/src/modules/item-management/command/moveTaxonomyNode.test.ts +1 -1
  486. package/src/modules/item-management/command/moveTaxonomyNode.ts +1 -1
  487. package/src/modules/item-management/command/reactivateItem.generated.ts +1 -1
  488. package/src/modules/item-management/command/reactivateItem.ts +1 -1
  489. package/src/modules/item-management/command/removeItemFromTaxonomy.generated.ts +1 -1
  490. package/src/modules/item-management/command/removeItemFromTaxonomy.ts +1 -1
  491. package/src/modules/item-management/command/updateItem.generated.ts +1 -1
  492. package/src/modules/item-management/command/updateItem.test.ts +1 -1
  493. package/src/modules/item-management/command/updateItem.ts +1 -1
  494. package/src/modules/item-management/command/updateTaxonomyNode.generated.ts +1 -1
  495. package/src/modules/item-management/command/updateTaxonomyNode.ts +1 -1
  496. package/src/modules/item-management/lib/errors.generated.ts +1 -1
  497. package/src/modules/item-management/lib/permissions.generated.ts +1 -1
  498. package/src/modules/item-management/lib/types.ts +6 -1
  499. package/src/modules/item-management/module.ts +1 -1
  500. package/src/modules/item-management/query/calculateNodeDepth.generated.ts +1 -1
  501. package/src/modules/item-management/query/calculateNodeDepth.ts +1 -1
  502. package/src/modules/item-management/query/calculateSubtreeDepth.generated.ts +1 -1
  503. package/src/modules/item-management/query/calculateSubtreeDepth.ts +1 -1
  504. package/src/modules/item-management/query/detectCircularReference.generated.ts +1 -1
  505. package/src/modules/item-management/query/detectCircularReference.ts +1 -1
  506. package/src/modules/item-management/query/getItem.generated.ts +1 -1
  507. package/src/modules/item-management/query/getItem.ts +1 -1
  508. package/src/modules/item-management/query/getItemTaxonomyAssignment.generated.ts +1 -1
  509. package/src/modules/item-management/query/getItemTaxonomyAssignment.ts +1 -1
  510. package/src/modules/item-management/query/getTaxonomyNode.generated.ts +1 -1
  511. package/src/modules/item-management/query/getTaxonomyNode.ts +1 -1
  512. package/src/modules/item-management/query/getTaxonomyNodeAssignments.generated.ts +1 -1
  513. package/src/modules/item-management/query/getTaxonomyNodeAssignments.ts +1 -1
  514. package/src/modules/item-management/query/getTaxonomyNodeChildren.generated.ts +1 -1
  515. package/src/modules/item-management/query/getTaxonomyNodeChildren.ts +1 -1
  516. package/src/modules/organization/README.md +57 -0
  517. package/src/modules/organization/command/.gitkeep +0 -0
  518. package/src/modules/organization/command/activateCompany.generated.ts +6 -0
  519. package/src/modules/organization/command/activateCompany.test.ts +184 -0
  520. package/src/modules/organization/command/activateCompany.ts +92 -0
  521. package/src/modules/organization/command/createCompany.generated.ts +6 -0
  522. package/src/modules/organization/command/createCompany.test.ts +156 -0
  523. package/src/modules/organization/command/createCompany.ts +80 -0
  524. package/src/modules/organization/command/createDepartment.generated.ts +6 -0
  525. package/src/modules/organization/command/createDepartment.test.ts +239 -0
  526. package/src/modules/organization/command/createDepartment.ts +98 -0
  527. package/src/modules/organization/command/createSite.generated.ts +6 -0
  528. package/src/modules/organization/command/createSite.test.ts +262 -0
  529. package/src/modules/organization/command/createSite.ts +155 -0
  530. package/src/modules/organization/command/deactivateCompany.generated.ts +6 -0
  531. package/src/modules/organization/command/deactivateCompany.test.ts +58 -0
  532. package/src/modules/organization/command/deactivateCompany.ts +47 -0
  533. package/src/modules/organization/command/deactivateDepartment.generated.ts +6 -0
  534. package/src/modules/organization/command/deactivateDepartment.test.ts +115 -0
  535. package/src/modules/organization/command/deactivateDepartment.ts +63 -0
  536. package/src/modules/organization/command/deactivateSite.generated.ts +6 -0
  537. package/src/modules/organization/command/deactivateSite.test.ts +53 -0
  538. package/src/modules/organization/command/deactivateSite.ts +47 -0
  539. package/src/modules/organization/command/deleteCompany.generated.ts +6 -0
  540. package/src/modules/organization/command/deleteCompany.test.ts +99 -0
  541. package/src/modules/organization/command/deleteCompany.ts +66 -0
  542. package/src/modules/organization/command/reactivateCompany.generated.ts +6 -0
  543. package/src/modules/organization/command/reactivateCompany.test.ts +58 -0
  544. package/src/modules/organization/command/reactivateCompany.ts +47 -0
  545. package/src/modules/organization/command/reactivateDepartment.generated.ts +6 -0
  546. package/src/modules/organization/command/reactivateDepartment.test.ts +59 -0
  547. package/src/modules/organization/command/reactivateDepartment.ts +47 -0
  548. package/src/modules/organization/command/reactivateSite.generated.ts +6 -0
  549. package/src/modules/organization/command/reactivateSite.test.ts +53 -0
  550. package/src/modules/organization/command/reactivateSite.ts +47 -0
  551. package/src/modules/organization/command/updateCompany.generated.ts +6 -0
  552. package/src/modules/organization/command/updateCompany.test.ts +239 -0
  553. package/src/modules/organization/command/updateCompany.ts +127 -0
  554. package/src/modules/organization/command/updateDepartment.generated.ts +6 -0
  555. package/src/modules/organization/command/updateDepartment.test.ts +232 -0
  556. package/src/modules/organization/command/updateDepartment.ts +120 -0
  557. package/src/modules/organization/command/updateSite.generated.ts +6 -0
  558. package/src/modules/organization/command/updateSite.test.ts +274 -0
  559. package/src/modules/organization/command/updateSite.ts +176 -0
  560. package/src/modules/organization/db/.gitkeep +0 -0
  561. package/src/modules/organization/db/company.ts +44 -0
  562. package/src/modules/organization/db/department.ts +46 -0
  563. package/src/modules/organization/db/site.ts +44 -0
  564. package/src/modules/organization/docs/commands/ActivateCompany.md +62 -0
  565. package/src/modules/organization/docs/commands/CreateCompany.md +49 -0
  566. package/src/modules/organization/docs/commands/CreateDepartment.md +62 -0
  567. package/src/modules/organization/docs/commands/CreateSite.md +74 -0
  568. package/src/modules/organization/docs/commands/DeactivateCompany.md +40 -0
  569. package/src/modules/organization/docs/commands/DeactivateDepartment.md +44 -0
  570. package/src/modules/organization/docs/commands/DeactivateSite.md +38 -0
  571. package/src/modules/organization/docs/commands/DeleteCompany.md +50 -0
  572. package/src/modules/organization/docs/commands/ReactivateCompany.md +39 -0
  573. package/src/modules/organization/docs/commands/ReactivateDepartment.md +37 -0
  574. package/src/modules/organization/docs/commands/ReactivateSite.md +37 -0
  575. package/src/modules/organization/docs/commands/UpdateCompany.md +58 -0
  576. package/src/modules/organization/docs/commands/UpdateDepartment.md +64 -0
  577. package/src/modules/organization/docs/commands/UpdateSite.md +80 -0
  578. package/src/modules/organization/docs/features/company-lifecycle.md +76 -0
  579. package/src/modules/organization/docs/features/department-management.md +66 -0
  580. package/src/modules/organization/docs/features/site-management.md +86 -0
  581. package/src/modules/organization/docs/models/Company.md +60 -0
  582. package/src/modules/organization/docs/models/Department.md +57 -0
  583. package/src/modules/organization/docs/models/Site.md +57 -0
  584. package/src/modules/organization/docs/queries/DetectDepartmentCircularReference.md +50 -0
  585. package/src/modules/organization/docs/queries/GetCompany.md +40 -0
  586. package/src/modules/organization/docs/queries/GetDepartment.md +44 -0
  587. package/src/modules/organization/docs/queries/GetDepartmentChildren.md +40 -0
  588. package/src/modules/organization/docs/queries/GetSite.md +37 -0
  589. package/src/modules/organization/docs/queries/ListDepartmentsByCompany.md +54 -0
  590. package/src/modules/organization/docs/queries/ListSitesByCompany.md +54 -0
  591. package/src/modules/organization/executor/.gitkeep +0 -0
  592. package/src/modules/organization/generated/.gitkeep +0 -0
  593. package/src/modules/organization/generated/kysely-tailordb.ts +77 -0
  594. package/src/modules/organization/index.ts +2 -0
  595. package/src/modules/organization/lib/_db_deps.ts +10 -0
  596. package/src/modules/organization/lib/errors.generated.ts +117 -0
  597. package/src/modules/organization/lib/permissions.generated.ts +19 -0
  598. package/src/modules/organization/lib/types.ts +21 -0
  599. package/src/modules/organization/module.ts +89 -0
  600. package/src/modules/organization/permissions.ts +3 -0
  601. package/src/modules/organization/query/.gitkeep +0 -0
  602. package/src/modules/organization/query/detectDepartmentCircularReference.generated.ts +5 -0
  603. package/src/modules/organization/query/detectDepartmentCircularReference.test.ts +102 -0
  604. package/src/modules/organization/query/detectDepartmentCircularReference.ts +27 -0
  605. package/src/modules/organization/query/getCompany.generated.ts +5 -0
  606. package/src/modules/organization/query/getCompany.test.ts +70 -0
  607. package/src/modules/organization/query/getCompany.ts +16 -0
  608. package/src/modules/organization/query/getDepartment.generated.ts +5 -0
  609. package/src/modules/organization/query/getDepartment.test.ts +85 -0
  610. package/src/modules/organization/query/getDepartment.ts +17 -0
  611. package/src/modules/organization/query/getDepartmentChildren.generated.ts +5 -0
  612. package/src/modules/organization/query/getDepartmentChildren.test.ts +75 -0
  613. package/src/modules/organization/query/getDepartmentChildren.ts +21 -0
  614. package/src/modules/organization/query/getSite.generated.ts +5 -0
  615. package/src/modules/organization/query/getSite.test.ts +55 -0
  616. package/src/modules/organization/query/getSite.ts +16 -0
  617. package/src/modules/organization/query/listDepartmentsByCompany.generated.ts +5 -0
  618. package/src/modules/organization/query/listDepartmentsByCompany.test.ts +124 -0
  619. package/src/modules/organization/query/listDepartmentsByCompany.ts +43 -0
  620. package/src/modules/organization/query/listSitesByCompany.generated.ts +5 -0
  621. package/src/modules/organization/query/listSitesByCompany.test.ts +126 -0
  622. package/src/modules/organization/query/listSitesByCompany.ts +41 -0
  623. package/src/modules/organization/tailor.config.ts +13 -0
  624. package/src/modules/organization/tailor.d.ts +13 -0
  625. package/src/modules/organization/testing/fixtures.ts +155 -0
  626. package/src/modules/primitives/README.md +1 -1
  627. package/src/modules/primitives/command/activateCategory.generated.ts +1 -1
  628. package/src/modules/primitives/command/activateCategory.ts +1 -1
  629. package/src/modules/primitives/command/activateCurrency.generated.ts +1 -1
  630. package/src/modules/primitives/command/activateCurrency.ts +1 -1
  631. package/src/modules/primitives/command/activateUnit.generated.ts +1 -1
  632. package/src/modules/primitives/command/activateUnit.ts +1 -1
  633. package/src/modules/primitives/command/createCategory.generated.ts +1 -1
  634. package/src/modules/primitives/command/createCategory.ts +1 -1
  635. package/src/modules/primitives/command/createCurrency.generated.ts +1 -1
  636. package/src/modules/primitives/command/createCurrency.ts +1 -1
  637. package/src/modules/primitives/command/createExchangeRate.generated.ts +1 -1
  638. package/src/modules/primitives/command/createExchangeRate.ts +1 -1
  639. package/src/modules/primitives/command/createUnit.generated.ts +1 -1
  640. package/src/modules/primitives/command/createUnit.ts +1 -1
  641. package/src/modules/primitives/command/deactivateCategory.generated.ts +1 -1
  642. package/src/modules/primitives/command/deactivateCategory.ts +1 -1
  643. package/src/modules/primitives/command/deactivateCurrency.generated.ts +1 -1
  644. package/src/modules/primitives/command/deactivateCurrency.ts +1 -1
  645. package/src/modules/primitives/command/deactivateUnit.generated.ts +1 -1
  646. package/src/modules/primitives/command/deactivateUnit.ts +1 -1
  647. package/src/modules/primitives/command/setBaseCurrency.generated.ts +1 -1
  648. package/src/modules/primitives/command/setBaseCurrency.test.ts +8 -64
  649. package/src/modules/primitives/command/setBaseCurrency.ts +6 -64
  650. package/src/modules/primitives/command/setReferenceUnit.generated.ts +1 -1
  651. package/src/modules/primitives/command/setReferenceUnit.ts +1 -1
  652. package/src/modules/primitives/docs/commands/ActivateCategory.md +1 -1
  653. package/src/modules/primitives/docs/commands/ActivateCurrency.md +1 -1
  654. package/src/modules/primitives/docs/commands/ActivateUnit.md +1 -1
  655. package/src/modules/primitives/docs/commands/CreateExchangeRate.md +2 -2
  656. package/src/modules/primitives/docs/commands/CreateUnit.md +1 -1
  657. package/src/modules/primitives/docs/commands/DeactivateCategory.md +1 -1
  658. package/src/modules/primitives/docs/commands/DeactivateCurrency.md +1 -1
  659. package/src/modules/primitives/docs/commands/DeactivateUnit.md +1 -1
  660. package/src/modules/primitives/docs/commands/SetBaseCurrency.md +13 -23
  661. package/src/modules/primitives/docs/commands/SetReferenceUnit.md +1 -1
  662. package/src/modules/primitives/docs/features/currency-definitions.md +13 -14
  663. package/src/modules/primitives/docs/models/Currency.md +3 -4
  664. package/src/modules/primitives/docs/queries/ConvertAmount.md +2 -2
  665. package/src/modules/primitives/docs/queries/ConvertQuantity.md +2 -2
  666. package/src/modules/primitives/lib/errors.generated.ts +6 -1
  667. package/src/modules/primitives/lib/permissions.generated.ts +1 -1
  668. package/src/modules/primitives/lib/types.ts +6 -1
  669. package/src/modules/primitives/module.ts +1 -1
  670. package/src/modules/primitives/query/convertAmount.generated.ts +1 -1
  671. package/src/modules/primitives/query/convertAmount.test.ts +1 -1
  672. package/src/modules/primitives/query/convertAmount.ts +1 -1
  673. package/src/modules/primitives/query/convertQuantity.generated.ts +1 -1
  674. package/src/modules/primitives/query/convertQuantity.test.ts +1 -1
  675. package/src/modules/primitives/query/convertQuantity.ts +1 -1
  676. package/src/modules/primitives/query/getBaseCurrency.generated.ts +1 -1
  677. package/src/modules/primitives/query/getBaseCurrency.test.ts +1 -1
  678. package/src/modules/primitives/query/getBaseCurrency.ts +1 -1
  679. package/src/modules/primitives/query/getCurrency.generated.ts +1 -1
  680. package/src/modules/primitives/query/getCurrency.ts +1 -1
  681. package/src/modules/primitives/query/getUnit.generated.ts +1 -1
  682. package/src/modules/primitives/query/getUnit.ts +1 -1
  683. package/src/modules/primitives/query/getUoMCategory.generated.ts +1 -1
  684. package/src/modules/primitives/query/getUoMCategory.ts +1 -1
  685. package/src/modules/primitives/query/listUnitsByCategory.generated.ts +1 -1
  686. package/src/modules/primitives/query/listUnitsByCategory.ts +2 -2
  687. package/src/modules/product-management/README.md +1 -1
  688. package/src/modules/product-management/command/activateProduct.generated.ts +1 -1
  689. package/src/modules/product-management/command/activateProduct.ts +1 -1
  690. package/src/modules/product-management/command/assignProductToCategory.generated.ts +1 -1
  691. package/src/modules/product-management/command/assignProductToCategory.ts +1 -1
  692. package/src/modules/product-management/command/createProduct.generated.ts +1 -1
  693. package/src/modules/product-management/command/createProduct.test.ts +1 -1
  694. package/src/modules/product-management/command/createProduct.ts +1 -1
  695. package/src/modules/product-management/command/createProductAttribute.generated.ts +1 -1
  696. package/src/modules/product-management/command/createProductAttribute.ts +1 -1
  697. package/src/modules/product-management/command/createProductAttributeValue.generated.ts +1 -1
  698. package/src/modules/product-management/command/createProductAttributeValue.ts +1 -1
  699. package/src/modules/product-management/command/createProductCategory.generated.ts +1 -1
  700. package/src/modules/product-management/command/createProductCategory.test.ts +1 -1
  701. package/src/modules/product-management/command/createProductCategory.ts +1 -1
  702. package/src/modules/product-management/command/deactivateProduct.generated.ts +1 -1
  703. package/src/modules/product-management/command/deactivateProduct.ts +1 -1
  704. package/src/modules/product-management/command/deleteProduct.generated.ts +1 -1
  705. package/src/modules/product-management/command/deleteProduct.ts +1 -1
  706. package/src/modules/product-management/command/deleteProductAttribute.generated.ts +1 -1
  707. package/src/modules/product-management/command/deleteProductAttribute.ts +1 -1
  708. package/src/modules/product-management/command/deleteProductAttributeValue.generated.ts +1 -1
  709. package/src/modules/product-management/command/deleteProductAttributeValue.ts +1 -1
  710. package/src/modules/product-management/command/deleteProductCategory.generated.ts +1 -1
  711. package/src/modules/product-management/command/deleteProductCategory.ts +1 -1
  712. package/src/modules/product-management/command/generateVariants.generated.ts +1 -1
  713. package/src/modules/product-management/command/generateVariants.test.ts +1 -1
  714. package/src/modules/product-management/command/generateVariants.ts +1 -1
  715. package/src/modules/product-management/command/moveProductCategory.generated.ts +1 -1
  716. package/src/modules/product-management/command/moveProductCategory.test.ts +1 -1
  717. package/src/modules/product-management/command/moveProductCategory.ts +1 -1
  718. package/src/modules/product-management/command/reactivateProduct.generated.ts +1 -1
  719. package/src/modules/product-management/command/reactivateProduct.ts +1 -1
  720. package/src/modules/product-management/command/removeProductFromCategory.generated.ts +1 -1
  721. package/src/modules/product-management/command/removeProductFromCategory.ts +1 -1
  722. package/src/modules/product-management/command/setProductAttributeAssignment.generated.ts +1 -1
  723. package/src/modules/product-management/command/setProductAttributeAssignment.ts +1 -1
  724. package/src/modules/product-management/command/updateProduct.generated.ts +1 -1
  725. package/src/modules/product-management/command/updateProduct.test.ts +1 -1
  726. package/src/modules/product-management/command/updateProduct.ts +1 -1
  727. package/src/modules/product-management/command/updateProductAttribute.generated.ts +1 -1
  728. package/src/modules/product-management/command/updateProductAttribute.ts +1 -1
  729. package/src/modules/product-management/command/updateProductAttributeValue.generated.ts +1 -1
  730. package/src/modules/product-management/command/updateProductAttributeValue.ts +1 -1
  731. package/src/modules/product-management/command/updateProductCategory.generated.ts +1 -1
  732. package/src/modules/product-management/command/updateProductCategory.ts +1 -1
  733. package/src/modules/product-management/lib/errors.generated.ts +1 -1
  734. package/src/modules/product-management/lib/permissions.generated.ts +1 -1
  735. package/src/modules/product-management/lib/types.ts +6 -1
  736. package/src/modules/product-management/module.ts +1 -1
  737. package/src/modules/product-management/query/calculateCategoryDepth.generated.ts +1 -1
  738. package/src/modules/product-management/query/calculateCategoryDepth.ts +1 -1
  739. package/src/modules/product-management/query/detectCategoryCircularReference.generated.ts +1 -1
  740. package/src/modules/product-management/query/detectCategoryCircularReference.ts +1 -1
  741. package/src/modules/product-management/query/getProduct.generated.ts +1 -1
  742. package/src/modules/product-management/query/getProduct.ts +1 -1
  743. package/src/modules/product-management/query/getProductAttribute.generated.ts +1 -1
  744. package/src/modules/product-management/query/getProductAttribute.ts +1 -1
  745. package/src/modules/product-management/query/getProductAttributeAssignment.generated.ts +1 -1
  746. package/src/modules/product-management/query/getProductAttributeAssignment.ts +1 -1
  747. package/src/modules/product-management/query/getProductAttributeValue.generated.ts +1 -1
  748. package/src/modules/product-management/query/getProductAttributeValue.ts +1 -1
  749. package/src/modules/product-management/query/getProductCategory.generated.ts +1 -1
  750. package/src/modules/product-management/query/getProductCategory.ts +1 -1
  751. package/src/modules/product-management/query/getProductCategoryAssignment.generated.ts +1 -1
  752. package/src/modules/product-management/query/getProductCategoryAssignment.ts +1 -1
  753. package/src/modules/product-management/query/getProductVariant.generated.ts +1 -1
  754. package/src/modules/product-management/query/getProductVariant.ts +1 -1
  755. package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.generated.ts +1 -1
  756. package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.ts +1 -1
  757. package/src/modules/product-management/query/listCategoryAssignmentsByProduct.generated.ts +1 -1
  758. package/src/modules/product-management/query/listCategoryAssignmentsByProduct.ts +1 -1
  759. package/src/modules/product-management/query/listProductAttributeAssignments.generated.ts +1 -1
  760. package/src/modules/product-management/query/listProductAttributeAssignments.ts +1 -1
  761. package/src/modules/product-management/query/listProductAttributeValues.generated.ts +1 -1
  762. package/src/modules/product-management/query/listProductAttributeValues.ts +1 -1
  763. package/src/modules/product-management/query/listProductCategoryAssignments.generated.ts +1 -1
  764. package/src/modules/product-management/query/listProductCategoryAssignments.ts +1 -1
  765. package/src/modules/product-management/query/listProductCategoryChildren.generated.ts +1 -1
  766. package/src/modules/product-management/query/listProductCategoryChildren.ts +1 -1
  767. package/src/modules/product-management/query/listProductVariants.generated.ts +1 -1
  768. package/src/modules/product-management/query/listProductVariants.ts +1 -1
  769. package/src/modules/user-management/command/activateUser.generated.ts +1 -1
  770. package/src/modules/user-management/command/activateUser.ts +1 -1
  771. package/src/modules/user-management/command/assignPermissionToRole.generated.ts +1 -1
  772. package/src/modules/user-management/command/assignPermissionToRole.ts +1 -1
  773. package/src/modules/user-management/command/assignRoleToUser.generated.ts +1 -1
  774. package/src/modules/user-management/command/assignRoleToUser.ts +1 -1
  775. package/src/modules/user-management/command/createPermission.generated.ts +1 -1
  776. package/src/modules/user-management/command/createPermission.ts +1 -1
  777. package/src/modules/user-management/command/createRole.generated.ts +1 -1
  778. package/src/modules/user-management/command/createRole.ts +1 -1
  779. package/src/modules/user-management/command/createUser.generated.ts +1 -1
  780. package/src/modules/user-management/command/createUser.ts +1 -1
  781. package/src/modules/user-management/command/deactivateUser.generated.ts +1 -1
  782. package/src/modules/user-management/command/deactivateUser.ts +1 -1
  783. package/src/modules/user-management/command/reactivateUser.generated.ts +1 -1
  784. package/src/modules/user-management/command/reactivateUser.ts +1 -1
  785. package/src/modules/user-management/command/revokePermissionFromRole.generated.ts +1 -1
  786. package/src/modules/user-management/command/revokePermissionFromRole.ts +1 -1
  787. package/src/modules/user-management/command/revokeRoleFromUser.generated.ts +1 -1
  788. package/src/modules/user-management/command/revokeRoleFromUser.ts +1 -1
  789. package/src/modules/user-management/docs/commands/CreatePermission.md +3 -3
  790. package/src/modules/user-management/docs/commands/CreateRole.md +1 -1
  791. package/src/modules/user-management/docs/queries/ListRolePermissionsByRole.md +39 -0
  792. package/src/modules/user-management/docs/queries/ListUserRolesByUser.md +39 -0
  793. package/src/modules/user-management/generated/enums.ts +0 -15
  794. package/src/modules/user-management/generated/kysely-tailordb.ts +0 -11
  795. package/src/modules/user-management/lib/errors.generated.ts +1 -1
  796. package/src/modules/user-management/lib/permissions.generated.ts +1 -1
  797. package/src/modules/user-management/lib/types.ts +6 -1
  798. package/src/modules/user-management/module.ts +1 -1
  799. package/src/shared/createContext.ts +2 -1
  800. package/src/shared/defineQuery.ts +36 -1
  801. package/src/shared/requirePermission.ts +3 -3
  802. package/src/shared/types.ts +3 -0
  803. package/templates/scaffold/app/backend/package.json +4 -3
  804. package/templates/scaffold/app/frontend/eslint.config.js +12 -0
  805. package/templates/scaffold/app/frontend/package.json +10 -7
  806. package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +30 -0
  807. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +3 -2
  808. package/templates/scaffold/app/frontend/vite.config.ts +5 -5
  809. package/templates/scaffold/module/lib/types.ts +6 -1
  810. package/templates/scaffold/module/permissions.ts +1 -1
  811. package/src/commands/module/list.test.ts +0 -57
  812. package/src/commands/module/list.ts +0 -64
  813. package/templates/scaffold/module/lib/errors.ts +0 -1
  814. /package/src/modules/{accounting → audit/db}/.gitkeep +0 -0
  815. /package/src/modules/audit/{.gitkeep → executor/.gitkeep} +0 -0
  816. /package/src/modules/{coa-management → business-partner}/.gitkeep +0 -0
  817. /package/src/modules/{supplier-management → business-partner/command}/.gitkeep +0 -0
@@ -0,0 +1,79 @@
1
+ # CreateAuditPolicy
2
+
3
+ ## Overview
4
+
5
+ CreateAuditPolicy creates a new audit policy in DRAFT status. The command accepts a target entity name, optional company scope, a single operation type, and optional field-level rules with sensitivity modes. Policies are created in DRAFT to allow review before activation. The policy's scope must match the target entity's registered scope.
6
+
7
+ This command requires the `manageAuditPolicies` permission at the appropriate scope.
8
+
9
+ ## Business Rules
10
+
11
+ - Policy is always created in DRAFT status
12
+ - entityName is required and must reference a registered auditable entity
13
+ - companyId is optional; if provided, the target entity must be COMPANY_BOUND; if null, the target entity must be GLOBAL
14
+ - operationType is required and must be one of CREATE, UPDATE, or DELETE; invalid values are rejected
15
+ - Field names in field-level rules must be non-empty strings
16
+ - Field-level rules are optional; each rule specifies a fieldName and optional sensitivityMode
17
+ - Field names in field-level rules must be a subset of the entity's registered auditableFields
18
+ - Duplicate field names within the same policy are rejected
19
+ - sensitivityMode defaults to CAPTURE if not specified
20
+ - Caller must hold `manageAuditPolicies` permission at the appropriate scope
21
+ - A caller with company-scoped `manageAuditPolicies` can only create policies for their assigned companies
22
+ - A caller with global-scoped `manageAuditPolicies` can only create global policies (companyId null)
23
+
24
+ ## Process Flow
25
+
26
+ ```mermaid
27
+ flowchart TD
28
+ A[Receive create request] --> B{Caller has manageAuditPolicies?}
29
+ B -->|No| C[Return error: INSUFFICIENT_PERMISSION]
30
+ B -->|Yes| B2{Caller scope covers requested policy scope?}
31
+ B2 -->|No| B3[Return error: UNAUTHORIZED]
32
+ B2 -->|Yes| D{entityName registered?}
33
+ D -->|No| E[Return error: ENTITY_TYPE_NOT_REGISTERED]
34
+ D -->|Yes| F{Policy scope matches entity scope?}
35
+ F -->|No| G[Return error: SCOPE_MISMATCH]
36
+ F -->|Yes| G2{operationType valid?}
37
+ G2 -->|No| G3[Return error: INVALID_OPERATION_TYPE]
38
+ G2 -->|Yes| H{Validate field rules}
39
+ H -->|Invalid| I[Return validation error]
40
+ H -->|Valid| J[Create AuditPolicy in DRAFT]
41
+ J --> K[Create PolicyFieldRule records]
42
+ K --> L[Return created policy]
43
+ ```
44
+
45
+ ## External Dependencies
46
+
47
+ - None
48
+
49
+ ## Error Scenarios
50
+
51
+ - **INSUFFICIENT_PERMISSION**: Caller lacks the required command permission (shared error from defineCommand)
52
+ - **UNAUTHORIZED**: Caller's permission scope does not cover this policy (e.g., company-scoped caller managing a different company's policy, or global-scoped caller managing a company-scoped policy)
53
+ - **ENTITY_TYPE_NOT_REGISTERED**: entityName does not match any registered auditable entity
54
+ - **SCOPE_MISMATCH**: companyId provided for a global entity, or companyId null for a company-bound entity
55
+ - **INVALID_FIELD_NAME**: A field name in field-level rules is empty or not in the entity's auditableFields
56
+ - **DUPLICATE_FIELD_NAME**: The same field name appears more than once in field-level rules
57
+ - **INVALID_OPERATION_TYPE**: operationType is missing or not one of CREATE, UPDATE, DELETE
58
+ - **INVALID_SENSITIVITY_MODE**: sensitivityMode is not one of CAPTURE, MASK, HASH, EXCLUDE
59
+
60
+ ## Test Cases
61
+
62
+ - creates policy in DRAFT status
63
+ - creates policy with company scope for company-bound entity
64
+ - creates policy with global scope for global entity
65
+ - creates policy with field-level rules and sensitivity modes
66
+ - creates policy without field-level rules (audits all eligible fields)
67
+ - rejects when entityName is not registered
68
+ - rejects company-scoped policy for global entity
69
+ - rejects global policy for company-bound entity
70
+ - rejects duplicate field names in field-level rules
71
+ - rejects field names not in entity's auditableFields
72
+ - rejects invalid sensitivity mode
73
+ - rejects invalid operation type
74
+ - rejects empty field name in field-level rules
75
+ - defaults sensitivityMode to CAPTURE when not specified
76
+ - rejects when caller lacks manageAuditPolicies permission
77
+ - rejects when company-scoped caller creates policy for a different company
78
+ - creates policy with global scope when companyId is explicitly null
79
+ - rejects when global-scoped caller creates company-scoped policy
@@ -0,0 +1,55 @@
1
+ # DeactivateAuditPolicy
2
+
3
+ ## Overview
4
+
5
+ DeactivateAuditPolicy transitions an audit policy from ACTIVE to INACTIVE status, stopping new audit capture for the specified entity, operation type, and scope. Previously recorded audit entries are not affected. Events arriving for this entity + operation combination while no active policy exists will be silently discarded.
6
+
7
+ This command requires the `manageAuditPolicies` permission at the appropriate scope.
8
+
9
+ ## Business Rules
10
+
11
+ - Only policies in ACTIVE status can be deactivated
12
+ - Deactivation stops new audit capture but does not delete previously recorded audit entries
13
+ - Events for the entity + operation + scope combination will be silently discarded while no ACTIVE policy exists
14
+ - Caller must hold `manageAuditPolicies` permission at the appropriate scope
15
+ - A caller with company-scoped `manageAuditPolicies` can only deactivate policies for their assigned companies
16
+ - A caller with global-scoped `manageAuditPolicies` can only deactivate global policies
17
+
18
+ ## Process Flow
19
+
20
+ ```mermaid
21
+ flowchart TD
22
+ A[Receive deactivate request] --> B{Caller has manageAuditPolicies?}
23
+ B -->|No| C[Return error: INSUFFICIENT_PERMISSION]
24
+ B -->|Yes| D{Policy exists?}
25
+ D -->|No| E[Return error: POLICY_NOT_FOUND]
26
+ D -->|Yes| D2{Caller scope covers this policy?}
27
+ D2 -->|No| D3[Return error: UNAUTHORIZED]
28
+ D2 -->|Yes| F{Policy in ACTIVE status?}
29
+ F -->|No| G[Return error: INVALID_STATE]
30
+ F -->|Yes| H[Set status to INACTIVE]
31
+ H --> I[Return deactivated policy]
32
+ ```
33
+
34
+ ## External Dependencies
35
+
36
+ - None
37
+
38
+ ## Error Scenarios
39
+
40
+ - **INSUFFICIENT_PERMISSION**: Caller lacks the required command permission (shared error from defineCommand)
41
+ - **UNAUTHORIZED**: Caller's permission scope does not cover this policy (e.g., company-scoped caller managing a different company's policy, or global-scoped caller managing a company-scoped policy)
42
+ - **POLICY_NOT_FOUND**: Specified policy ID does not exist
43
+ - **INVALID_STATE**: Policy is not in ACTIVE status
44
+
45
+ ## Test Cases
46
+
47
+ - deactivates ACTIVE policy to INACTIVE
48
+ - stops new audit capture after deactivation
49
+ - does not delete previously recorded audit entries
50
+ - rejects deactivation of DRAFT policy
51
+ - rejects deactivation of INACTIVE policy
52
+ - rejects when policy does not exist
53
+ - rejects when caller lacks manageAuditPolicies permission
54
+ - rejects when company-scoped caller deactivates policy for a different company
55
+ - rejects when global-scoped caller deactivates company-scoped policy
@@ -0,0 +1,55 @@
1
+ # DeleteAuditPolicy
2
+
3
+ ## Overview
4
+
5
+ DeleteAuditPolicy permanently removes an audit policy that is in DRAFT status. Only DRAFT policies can be deleted — ACTIVE and INACTIVE policies must be preserved for audit integrity. Deleting a policy does not affect any previously recorded audit entries.
6
+
7
+ This command requires the `manageAuditPolicies` permission at the appropriate scope.
8
+
9
+ ## Business Rules
10
+
11
+ - Only policies in DRAFT status can be deleted
12
+ - ACTIVE and INACTIVE policies cannot be deleted
13
+ - Deleting a policy does not affect previously recorded audit entries
14
+ - Caller must hold `manageAuditPolicies` permission at the appropriate scope
15
+ - A caller with company-scoped `manageAuditPolicies` can only delete policies for their assigned companies
16
+ - A caller with global-scoped `manageAuditPolicies` can only delete global policies
17
+
18
+ ## Process Flow
19
+
20
+ ```mermaid
21
+ flowchart TD
22
+ A[Receive delete request] --> B{Caller has manageAuditPolicies?}
23
+ B -->|No| C[Return error: INSUFFICIENT_PERMISSION]
24
+ B -->|Yes| D{Policy exists?}
25
+ D -->|No| E[Return error: POLICY_NOT_FOUND]
26
+ D -->|Yes| D2{Caller scope covers this policy?}
27
+ D2 -->|No| D3[Return error: UNAUTHORIZED]
28
+ D2 -->|Yes| F{Policy in DRAFT status?}
29
+ F -->|No| G[Return error: INVALID_STATE]
30
+ F -->|Yes| H[Delete AuditPolicy and associated PolicyFieldRules]
31
+ H --> I[Return success]
32
+ ```
33
+
34
+ ## External Dependencies
35
+
36
+ - None
37
+
38
+ ## Error Scenarios
39
+
40
+ - **INSUFFICIENT_PERMISSION**: Caller lacks the required command permission (shared error from defineCommand)
41
+ - **UNAUTHORIZED**: Caller's permission scope does not cover this policy (e.g., company-scoped caller managing a different company's policy, or global-scoped caller managing a company-scoped policy)
42
+ - **POLICY_NOT_FOUND**: Specified policy ID does not exist
43
+ - **INVALID_STATE**: Policy is not in DRAFT status (ACTIVE or INACTIVE policies cannot be deleted)
44
+
45
+ ## Test Cases
46
+
47
+ - deletes DRAFT policy
48
+ - deletes associated PolicyFieldRules when deleting policy
49
+ - does not affect previously recorded audit entries
50
+ - rejects deletion of ACTIVE policy
51
+ - rejects deletion of INACTIVE policy
52
+ - rejects when policy does not exist
53
+ - rejects when caller lacks manageAuditPolicies permission
54
+ - rejects when company-scoped caller deletes policy for a different company
55
+ - rejects when global-scoped caller deletes company-scoped policy
@@ -0,0 +1,137 @@
1
+ # LogAuditEvent
2
+
3
+ ## Overview
4
+
5
+ LogAuditEvent ingests a structured audit event from an emitting module, creating an immutable AuditEntry with linked ChangeDetail records. The command enforces idempotency on eventId — duplicate submissions are silently discarded. Events are validated against registered auditable entities and active audit policies. The timestamp is system-generated and cannot be supplied by the caller.
6
+
7
+ This command is the primary ingestion interface for the audit module and is called by other modules after they commit their own transactions.
8
+
9
+ ## Business Rules
10
+
11
+ - eventId must be a UUID and globally unique; duplicate eventId submissions are silently accepted (no new entry created)
12
+ - actorType is required and must be one of USER, SYSTEM, or SERVICE
13
+ - actorId is required and must be non-empty
14
+ - entityType must reference a registered auditable entity
15
+ - entityId is required and must be non-empty
16
+ - operationType must be one of CREATE, UPDATE, or DELETE
17
+ - companyId is required for company-bound entities and must be null for global entities
18
+ - timestamp is system-generated at ingestion time; caller-supplied timestamps are ignored
19
+ - An active audit policy must exist for the entity + operation + scope combination; events with no matching active policy are silently discarded
20
+ - changes array must contain at least one ChangeDetail for CREATE and DELETE operations
21
+ - For UPDATE operations, only fields that actually changed should be included in changes
22
+ - For UPDATE operations, if the changes array is empty (no fields actually changed), the event is a no-op: no AuditEntry or ChangeDetail records are created, and the command returns success silently — this prevents audit noise from saves that do not modify any field values
23
+ - After policy field-rule filtering and auditable-field filtering, if no processable changes remain:
24
+ - UPDATE: treated as a no-op (same as empty changes array above)
25
+ - CREATE / DELETE: rejected with VALIDATION_ERROR because these operations require at least one auditable change to produce a meaningful entry
26
+ - Field values are normalized by type before sensitivity processing:
27
+ - Scalar fields (string, number, boolean, date, enum) are serialized as strings and stored as-is
28
+ - Rich text / HTML field values are stripped to plain text before storage
29
+ - Collection / array field values are serialized as JSON strings
30
+ - Relation field values capture the foreign key ID as a string
31
+ - File attachment fields capture the reference metadata (file ID, filename, size), not the file content
32
+ - Binary / BLOB fields are excluded from audit capture entirely and are not eligible for policy field rules
33
+ - Computed / derived fields are excluded from audit capture
34
+ - Fields in the changes array that are not listed in the entity's registered auditableFields are silently dropped — no ChangeDetail is created for them and no error is raised
35
+ - Fields in the changes array that are listed in auditableFields but not included in the active policy's field rules (when the policy has explicit field rules) are also silently dropped
36
+ - Field values are processed through the applicable policy's sensitivity modes after normalization
37
+ - Values exceeding 4,000 characters are truncated with a `[truncated]` suffix after sensitivity processing
38
+ - correlationId is optional and groups related events from a single logical operation; if provided, it must be a valid UUID — invalid values are rejected with VALIDATION_ERROR
39
+ - actorMetadata (ipAddress, userAgent, sessionId, requestId) is optional
40
+ - onBehalfOf is optional and records the delegated user's identity
41
+
42
+ ## Process Flow
43
+
44
+ ```mermaid
45
+ flowchart TD
46
+ A[Receive audit event] --> A2{Caller has logAuditEvent permission?}
47
+ A2 -->|No| A3[Return error: INSUFFICIENT_PERMISSION]
48
+ A2 -->|Yes| B{Duplicate eventId?}
49
+ B -->|Yes| C[Return success, no new entry]
50
+ B -->|No| D{entityType registered?}
51
+ D -->|No| E[Return error: ENTITY_TYPE_NOT_REGISTERED]
52
+ D -->|Yes| F{Validate required fields}
53
+ F -->|Invalid| G[Return validation error]
54
+ F -->|Valid| H{Company scope matches entity scope?}
55
+ H -->|No| I[Return error: SCOPE_MISMATCH]
56
+ H -->|Yes| H2{correlationId provided and not valid UUID?}
57
+ H2 -->|Yes| H3[Return error: VALIDATION_ERROR]
58
+ H2 -->|No| J{Active policy exists for entity + operation + scope?}
59
+ J -->|No| K[Silently discard, return success]
60
+ J -->|Yes| J2{UPDATE with empty changes array?}
61
+ J2 -->|Yes| J3[No-op: return success, no entry created]
62
+ J2 -->|No| J4{CREATE or DELETE with empty changes?}
63
+ J4 -->|Yes| J5[Return error: VALIDATION_ERROR]
64
+ J4 -->|No| L[Apply policy field rules and sensitivity modes]
65
+ L --> L2{Any processable changes remain after filtering?}
66
+ L2 -->|No, UPDATE| L3[No-op: return success, no entry created]
67
+ L2 -->|No, CREATE/DELETE| L4[Return error: VALIDATION_ERROR]
68
+ L2 -->|Yes| M[Generate system timestamp]
69
+ M --> N[Create AuditEntry]
70
+ N --> O[Create ChangeDetail records]
71
+ O --> P[Return success]
72
+ ```
73
+
74
+ ## External Dependencies
75
+
76
+ - None (internal module command; emitting modules call this interface)
77
+
78
+ ## Error Scenarios
79
+
80
+ - **INSUFFICIENT_PERMISSION**: Caller lacks the required command permission (shared error from defineCommand)
81
+ - **ENTITY_TYPE_NOT_REGISTERED**: entityType does not match any registered auditable entity
82
+ - **INVALID_ACTOR**: actorType is missing or not one of USER, SYSTEM, SERVICE; or actorId is empty
83
+ - **INVALID_OPERATION_TYPE**: operationType is missing or not one of CREATE, UPDATE, DELETE
84
+ - **SCOPE_MISMATCH**: companyId provided for a global entity, or companyId missing for a company-bound entity
85
+ - **MISSING_ENTITY_ID**: entityId is empty or not provided
86
+ - **MISSING_EVENT_ID**: eventId is empty or not a valid UUID
87
+ - **VALIDATION_ERROR**: CREATE or DELETE operation submitted with an empty changes array; CREATE or DELETE operation where all changes are filtered out by policy field rules or auditable-field filtering (no auditable changes remain); or correlationId provided but not a valid UUID
88
+
89
+ ## Test Cases
90
+
91
+ - creates AuditEntry with all required fields for a CREATE operation
92
+ - creates AuditEntry with all required fields for an UPDATE operation
93
+ - creates AuditEntry with all required fields for a DELETE operation
94
+ - silently skips AuditEntry creation for UPDATE with empty changes array (zero-delta no-op)
95
+ - rejects CREATE with empty changes array
96
+ - rejects DELETE with empty changes array
97
+ - silently discards duplicate eventId without creating a new entry
98
+ - rejects event with unregistered entityType
99
+ - rejects event with missing actorType
100
+ - rejects event with invalid actorType
101
+ - rejects event with empty actorId
102
+ - rejects event with invalid operationType
103
+ - rejects event with companyId on a global entity
104
+ - rejects event with null companyId on a company-bound entity
105
+ - silently discards event when no active policy matches entity + operation + scope
106
+ - generates system timestamp and ignores caller-supplied timestamp
107
+ - creates ChangeDetail records linked to the parent AuditEntry
108
+ - applies MASK sensitivity mode to field values
109
+ - applies HASH sensitivity mode to field values
110
+ - applies EXCLUDE sensitivity mode storing null for both oldValue and newValue
111
+ - serializes scalar field values as strings
112
+ - strips rich text / HTML values to plain text before storage
113
+ - serializes collection / array field values as JSON strings
114
+ - captures relation field values as foreign key ID strings
115
+ - captures file attachment fields as reference metadata only (file ID, filename, size)
116
+ - excludes binary / BLOB fields from audit capture
117
+ - excludes computed / derived fields from audit capture
118
+ - silently drops fields from changes array that are not in entity's registered auditableFields
119
+ - silently drops fields from changes array that are not in the active policy's field rules when policy has explicit rules
120
+ - truncates values exceeding 4,000 characters with [truncated] suffix
121
+ - stores correlationId when provided
122
+ - stores actorMetadata (ipAddress, userAgent, sessionId, requestId) when provided
123
+ - stores onBehalfOf when provided
124
+ - creates ChangeDetail with null oldValue for CREATE operations
125
+ - creates ChangeDetail with null newValue for DELETE operations
126
+ - filters out unchanged fields for UPDATE operations
127
+ - returns no-op when all UPDATE changes are unchanged after normalization
128
+ - enforces oldValue=null for CREATE even if caller provides oldValue
129
+ - enforces newValue=null for DELETE even if caller provides newValue
130
+ - rejects event with empty entityId
131
+ - rejects event with empty eventId
132
+ - rejects event with non-UUID eventId
133
+ - rejects event with non-UUID correlationId
134
+ - rejects CREATE when all changes are filtered out by policy rules
135
+ - rejects DELETE when all changes are filtered out by policy rules
136
+ - returns no-op for UPDATE when all changes are filtered out by policy rules
137
+ - rejects caller without logAuditEvent permission
@@ -0,0 +1,58 @@
1
+ # ReactivateAuditPolicy
2
+
3
+ ## Overview
4
+
5
+ ReactivateAuditPolicy transitions an audit policy from INACTIVE back to ACTIVE status, resuming audit capture. Reactivation is rejected if a conflicting ACTIVE policy already exists for the same (entityName, companyId, operationType) combination.
6
+
7
+ This command requires the `manageAuditPolicies` permission at the appropriate scope.
8
+
9
+ ## Business Rules
10
+
11
+ - Only policies in INACTIVE status can be reactivated
12
+ - At most one ACTIVE policy can exist for a given (entityName, companyId, operationType) combination
13
+ - If a conflicting ACTIVE policy exists, reactivation is rejected
14
+ - Caller must hold `manageAuditPolicies` permission at the appropriate scope
15
+ - A caller with company-scoped `manageAuditPolicies` can only reactivate policies for their assigned companies
16
+ - A caller with global-scoped `manageAuditPolicies` can only reactivate global policies
17
+
18
+ ## Process Flow
19
+
20
+ ```mermaid
21
+ flowchart TD
22
+ A[Receive reactivate request] --> B{Caller has manageAuditPolicies?}
23
+ B -->|No| C[Return error: INSUFFICIENT_PERMISSION]
24
+ B -->|Yes| D{Policy exists?}
25
+ D -->|No| E[Return error: POLICY_NOT_FOUND]
26
+ D -->|Yes| D2{Caller scope covers this policy?}
27
+ D2 -->|No| D3[Return error: UNAUTHORIZED]
28
+ D2 -->|Yes| F{Policy in INACTIVE status?}
29
+ F -->|No| G[Return error: INVALID_STATE]
30
+ F -->|Yes| H{Conflicting ACTIVE policy exists?}
31
+ H -->|Yes| I[Return error: CONFLICTING_ACTIVE_POLICY]
32
+ H -->|No| J[Set status to ACTIVE]
33
+ J --> K[Return reactivated policy]
34
+ ```
35
+
36
+ ## External Dependencies
37
+
38
+ - None
39
+
40
+ ## Error Scenarios
41
+
42
+ - **INSUFFICIENT_PERMISSION**: Caller lacks the required command permission (shared error from defineCommand)
43
+ - **UNAUTHORIZED**: Caller's permission scope does not cover this policy (e.g., company-scoped caller managing a different company's policy, or global-scoped caller managing a company-scoped policy)
44
+ - **POLICY_NOT_FOUND**: Specified policy ID does not exist
45
+ - **INVALID_STATE**: Policy is not in INACTIVE status
46
+ - **CONFLICTING_ACTIVE_POLICY**: An ACTIVE policy already exists for the same (entityName, companyId, operationType)
47
+
48
+ ## Test Cases
49
+
50
+ - reactivates INACTIVE policy to ACTIVE
51
+ - resumes audit capture after reactivation
52
+ - rejects reactivation of DRAFT policy
53
+ - rejects reactivation of ACTIVE policy
54
+ - rejects reactivation when conflicting ACTIVE policy exists
55
+ - rejects when policy does not exist
56
+ - rejects when caller lacks manageAuditPolicies permission
57
+ - rejects when company-scoped caller reactivates policy for a different company
58
+ - rejects when global-scoped caller reactivates company-scoped policy
@@ -0,0 +1,62 @@
1
+ # RegisterAuditableEntity
2
+
3
+ ## Overview
4
+
5
+ RegisterAuditableEntity registers an entity for audit tracking within the audit module. Other modules call this command at initialization time to declare which of their entities are eligible for auditing, specifying the entity name, scope (COMPANY_BOUND or GLOBAL), and the list of auditable fields. Each field can be specified as a plain string (field name only) or as an object `{ fieldName, fieldType? }` where fieldType must be one of the eligible types: scalar, richtext, array, relation, or file. Any other fieldType is rejected as ineligible. Once registered, entity scope is immutable.
6
+
7
+ ## Business Rules
8
+
9
+ - entityName is required, must be non-empty, and must be unique across all registrations
10
+ - entityScope is required and must be one of COMPANY_BOUND or GLOBAL
11
+ - auditableFields is required and must contain at least one entry
12
+ - Each entry in auditableFields is either a non-empty string or an object with a non-empty `fieldName` and an optional `fieldType`
13
+ - Only the following fieldType values are eligible: `scalar`, `richtext`, `array`, `relation`, `file`. Any other fieldType (e.g. `binary`, `computed`) is rejected with INVALID_AUDITABLE_FIELDS
14
+ - If an entity with the same name is already registered, the command is rejected
15
+ - Entity scope is immutable once registered — it cannot be changed after initial registration
16
+
17
+ ## Process Flow
18
+
19
+ ```mermaid
20
+ flowchart TD
21
+ A[Receive registration request] --> A2{Caller has registerAuditableEntity permission?}
22
+ A2 -->|No| A3[Return error: INSUFFICIENT_PERMISSION]
23
+ A2 -->|Yes| B{entityName non-empty?}
24
+ B -->|No| C[Return error: INVALID_ENTITY_NAME]
25
+ B -->|Yes| D{entityScope valid?}
26
+ D -->|No| G[Return error: INVALID_ENTITY_SCOPE]
27
+ D -->|Yes| E{auditableFields non-empty?}
28
+ E -->|No| I[Return error: INVALID_AUDITABLE_FIELDS]
29
+ E -->|Yes| F{All field names non-empty and fieldTypes eligible?}
30
+ F -->|No| I2[Return error: INVALID_AUDITABLE_FIELDS]
31
+ F -->|Yes| H{entityName already registered?}
32
+ H -->|Yes| J[Return error: DUPLICATE_ENTITY_NAME]
33
+ H -->|No| K[Create AuditableEntity record]
34
+ K --> L[Return success]
35
+ ```
36
+
37
+ ## External Dependencies
38
+
39
+ - None
40
+
41
+ ## Error Scenarios
42
+
43
+ - **INSUFFICIENT_PERMISSION**: Caller lacks the required command permission (shared error from defineCommand)
44
+ - **INVALID_ENTITY_NAME**: entityName is empty or not provided
45
+ - **DUPLICATE_ENTITY_NAME**: An entity with the same name is already registered
46
+ - **INVALID_ENTITY_SCOPE**: entityScope is missing or not one of COMPANY_BOUND, GLOBAL
47
+ - **INVALID_AUDITABLE_FIELDS**: auditableFields is empty, contains an empty field name, or contains a field with an ineligible fieldType (any type outside scalar, richtext, array, relation, file)
48
+
49
+ ## Test Cases
50
+
51
+ - registers entity with COMPANY_BOUND scope
52
+ - registers entity with GLOBAL scope
53
+ - accepts mixed string and object field definitions in auditableFields
54
+ - rejects registration with empty entityName
55
+ - rejects registration with duplicate entityName
56
+ - rejects registration with invalid entityScope
57
+ - rejects registration with empty auditableFields
58
+ - rejects registration with empty field name in auditableFields
59
+ - rejects registration with binary field type in auditableFields
60
+ - rejects registration with computed field type in auditableFields
61
+ - rejects registration with unknown field type in auditableFields
62
+ - rejects caller without registerAuditableEntity permission
@@ -0,0 +1,72 @@
1
+ # ReplaceAuditPolicy
2
+
3
+ ## Overview
4
+
5
+ ReplaceAuditPolicy atomically deactivates the current ACTIVE policy and activates a replacement DRAFT policy for the same (entityName, companyId, operationType) combination in a single transaction. This ensures no gap in audit coverage during policy updates. The replacement policy must be in DRAFT status and target the same entity, operation, and scope as the existing ACTIVE policy.
6
+
7
+ This command requires the `manageAuditPolicies` permission at the appropriate scope.
8
+
9
+ ## Business Rules
10
+
11
+ - The replacement policy must be in DRAFT status
12
+ - An existing ACTIVE policy must exist for the same entityName; if none exists, the operation is rejected (use activateAuditPolicy instead)
13
+ - The existing ACTIVE policy must match the replacement policy's companyId and operationType; a mismatch is rejected as TARGET_MISMATCH
14
+ - The operation is atomic — either both the deactivation and activation succeed, or neither takes effect
15
+ - After completion, the previously ACTIVE policy is INACTIVE and the replacement is ACTIVE
16
+ - Caller must hold `manageAuditPolicies` permission at the appropriate scope
17
+ - A caller with company-scoped `manageAuditPolicies` can only replace policies for their assigned companies
18
+ - A caller with global-scoped `manageAuditPolicies` can only replace global policies
19
+
20
+ ## Process Flow
21
+
22
+ ```mermaid
23
+ flowchart TD
24
+ A[Receive replace request] --> B{Caller has manageAuditPolicies?}
25
+ B -->|No| C[Return error: INSUFFICIENT_PERMISSION]
26
+ B -->|Yes| D{Replacement policy exists?}
27
+ D -->|No| E[Return error: POLICY_NOT_FOUND]
28
+ D -->|Yes| D2{Caller scope covers this policy?}
29
+ D2 -->|No| D3[Return error: UNAUTHORIZED]
30
+ D2 -->|Yes| F{Replacement in DRAFT status?}
31
+ F -->|No| G[Return error: INVALID_STATE]
32
+ F -->|Yes| H{Any ACTIVE policy exists for this entity?}
33
+ H -->|No| I[Return error: NO_ACTIVE_POLICY_TO_REPLACE]
34
+ H -->|Yes| H2{ACTIVE policy matches replacement's operation + scope?}
35
+ H2 -->|No| H3[Return error: TARGET_MISMATCH]
36
+ H2 -->|Yes| J[Begin transaction]
37
+ J --> K[Set existing ACTIVE policy to INACTIVE]
38
+ K --> L[Set replacement DRAFT policy to ACTIVE]
39
+ L --> M[Commit transaction]
40
+ M --> N[Return both updated policies]
41
+ ```
42
+
43
+ ## External Dependencies
44
+
45
+ - None
46
+
47
+ ## Error Scenarios
48
+
49
+ - **INSUFFICIENT_PERMISSION**: Caller lacks the required command permission (shared error from defineCommand)
50
+ - **UNAUTHORIZED**: Caller's permission scope does not cover this policy (e.g., company-scoped caller managing a different company's policy, or global-scoped caller managing a company-scoped policy)
51
+ - **POLICY_NOT_FOUND**: Specified replacement policy ID does not exist
52
+ - **INVALID_STATE**: Replacement policy is not in DRAFT status
53
+ - **NO_ACTIVE_POLICY_TO_REPLACE**: No ACTIVE policy exists for the same entityName; use activateAuditPolicy instead
54
+ - **TARGET_MISMATCH**: The existing ACTIVE policy does not match the replacement's companyId or operationType
55
+
56
+ ## Test Cases
57
+
58
+ - atomically deactivates existing ACTIVE policy and activates DRAFT replacement
59
+ - existing policy is INACTIVE after replacement
60
+ - replacement policy is ACTIVE after replacement
61
+ - no gap in audit coverage during replacement
62
+ - rejects when replacement policy is not in DRAFT status
63
+ - rejects when replacement policy is ACTIVE
64
+ - rejects when replacement policy is INACTIVE
65
+ - rejects when no existing ACTIVE policy for the same entity
66
+ - rejects when replacement targets different operationType than existing ACTIVE policy
67
+ - rejects when replacement targets different companyId than existing ACTIVE policy
68
+ - selects correct ACTIVE policy when multiple ACTIVE policies exist for the same entity
69
+ - rejects when replacement policy does not exist
70
+ - rejects when caller lacks manageAuditPolicies permission
71
+ - rejects when company-scoped caller replaces policy for a different company
72
+ - rejects when global-scoped caller replaces company-scoped policy
@@ -0,0 +1,77 @@
1
+ # UpdateAuditPolicy
2
+
3
+ ## Overview
4
+
5
+ UpdateAuditPolicy modifies the configuration of an existing audit policy that is in DRAFT status. The command allows updating the operation type, field-level rules, and sensitivity modes. Only DRAFT policies can be updated — ACTIVE and INACTIVE policies are immutable.
6
+
7
+ This command requires the `manageAuditPolicies` permission at the appropriate scope.
8
+
9
+ ## Business Rules
10
+
11
+ - Only policies in DRAFT status can be updated
12
+ - entityName and companyId cannot be changed after creation
13
+ - Operation type can be updated; must be one of CREATE, UPDATE, or DELETE
14
+ - Field names in field-level rules must be non-empty strings
15
+ - Field-level rules can be added, modified, or removed
16
+ - When adding or modifying field-level rules, sensitivityMode defaults to CAPTURE if not specified
17
+ - Field names in field-level rules must be a subset of the entity's registered auditableFields
18
+ - Duplicate field names within the same policy are rejected
19
+ - Caller must hold `manageAuditPolicies` permission at the appropriate scope
20
+ - A caller with company-scoped `manageAuditPolicies` can only update policies for their assigned companies
21
+ - A caller with global-scoped `manageAuditPolicies` can only update global policies
22
+
23
+ ## Process Flow
24
+
25
+ ```mermaid
26
+ flowchart TD
27
+ A[Receive update request] --> B{Caller has manageAuditPolicies?}
28
+ B -->|No| C[Return error: INSUFFICIENT_PERMISSION]
29
+ B -->|Yes| D{Policy exists?}
30
+ D -->|No| E[Return error: POLICY_NOT_FOUND]
31
+ D -->|Yes| D2{Caller scope covers this policy?}
32
+ D2 -->|No| D3[Return error: UNAUTHORIZED]
33
+ D2 -->|Yes| F{Policy in DRAFT status?}
34
+ F -->|No| G[Return error: INVALID_STATE]
35
+ F -->|Yes| G2{operationType valid?}
36
+ G2 -->|No| G3[Return error: INVALID_OPERATION_TYPE]
37
+ G2 -->|Yes| H{Validate field rules}
38
+ H -->|Invalid| I[Return validation error]
39
+ H -->|Valid| J[Update AuditPolicy fields]
40
+ J --> K[Update PolicyFieldRule records]
41
+ K --> L[Return updated policy]
42
+ ```
43
+
44
+ ## External Dependencies
45
+
46
+ - None
47
+
48
+ ## Error Scenarios
49
+
50
+ - **INSUFFICIENT_PERMISSION**: Caller lacks the required command permission (shared error from defineCommand)
51
+ - **UNAUTHORIZED**: Caller's permission scope does not cover this policy (e.g., company-scoped caller managing a different company's policy, or global-scoped caller managing a company-scoped policy)
52
+ - **POLICY_NOT_FOUND**: Specified policy ID does not exist
53
+ - **INVALID_STATE**: Policy is not in DRAFT status
54
+ - **INVALID_OPERATION_TYPE**: operationType is not one of CREATE, UPDATE, DELETE
55
+ - **INVALID_FIELD_NAME**: A field name in field-level rules is empty or not in the entity's auditableFields
56
+ - **DUPLICATE_FIELD_NAME**: The same field name appears more than once in field-level rules
57
+ - **INVALID_SENSITIVITY_MODE**: sensitivityMode is not one of CAPTURE, MASK, HASH, EXCLUDE
58
+
59
+ ## Test Cases
60
+
61
+ - updates operation type on DRAFT policy
62
+ - updates field-level rules on DRAFT policy
63
+ - updates sensitivity modes on field-level rules
64
+ - adds new field-level rules to DRAFT policy
65
+ - removes field-level rules from DRAFT policy
66
+ - defaults sensitivityMode to CAPTURE when adding a field-level rule without explicit sensitivityMode
67
+ - defaults sensitivityMode to CAPTURE when modifying a field-level rule and sensitivityMode is omitted
68
+ - rejects update on ACTIVE policy
69
+ - rejects update on INACTIVE policy
70
+ - rejects when policy does not exist
71
+ - rejects duplicate field names
72
+ - rejects field names not in entity's auditableFields
73
+ - rejects invalid operation type
74
+ - rejects invalid sensitivity mode
75
+ - rejects when caller lacks manageAuditPolicies permission
76
+ - rejects when company-scoped caller updates policy for a different company
77
+ - rejects when global-scoped caller updates company-scoped policy