@tailor-platform/erp-kit 0.2.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/README.md +193 -69
- package/dist/cli.mjs +1038 -398
- package/package.json +7 -5
- package/skills/erp-kit-app-1-requirements/SKILL.md +27 -17
- package/skills/erp-kit-app-2-requirements-review/SKILL.md +5 -4
- package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +10 -1
- package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +10 -1
- package/skills/erp-kit-app-3-plan/SKILL.md +31 -34
- package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +22 -36
- package/skills/erp-kit-app-3-plan/references/screen-extraction.md +15 -1
- package/skills/erp-kit-app-3-plan/references/story-extraction.md +8 -2
- package/skills/erp-kit-app-4-plan-review/SKILL.md +1 -10
- package/skills/erp-kit-app-5-impl-backend/SKILL.md +10 -19
- package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -22
- package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +0 -1
- package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +13 -4
- package/skills/erp-kit-app-6-impl-frontend/SKILL.md +5 -0
- package/skills/erp-kit-app-6-impl-frontend/references/pages.md +16 -46
- package/skills/erp-kit-app-7-impl-review/SKILL.md +13 -11
- package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +16 -17
- package/skills/erp-kit-app-shared/SKILL.md +15 -0
- package/skills/erp-kit-app-shared/references/link-format-reference.md +13 -0
- package/skills/erp-kit-app-shared/references/naming-conventions.md +21 -0
- package/skills/erp-kit-app-shared/references/resolver-classification.md +23 -0
- package/skills/erp-kit-app-shared/references/schema-constraints.md +25 -0
- package/skills/erp-kit-module-1-requirements/SKILL.md +7 -13
- package/skills/erp-kit-module-1-requirements/references/feature-doc.md +1 -1
- package/skills/erp-kit-module-2-requirements-review/SKILL.md +21 -5
- package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +19 -0
- package/skills/erp-kit-module-3-plan/SKILL.md +6 -8
- package/skills/erp-kit-module-3-plan/references/naming.md +15 -1
- package/skills/erp-kit-module-4-plan-review/SKILL.md +21 -5
- package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +15 -0
- package/skills/erp-kit-module-5-impl/SKILL.md +12 -10
- package/skills/erp-kit-module-5-impl/references/generated-code.md +2 -2
- package/skills/erp-kit-module-6-impl-review/SKILL.md +21 -7
- package/skills/erp-kit-module-6-impl-review/references/error-implementation-parity.md +1 -1
- package/skills/erp-kit-module-6-impl-review/references/errors.md +1 -1
- package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +15 -0
- package/skills/erp-kit-module-shared/SKILL.md +4 -0
- package/skills/erp-kit-module-shared/references/errors.md +1 -1
- package/skills/erp-kit-module-shared/references/queries.md +1 -1
- package/skills/erp-kit-module-shared/references/structure.md +1 -1
- package/skills/erp-kit-update/SKILL.md +2 -2
- package/src/commands/app/index.ts +75 -31
- package/src/commands/check.test.ts +1 -1
- package/src/commands/check.ts +2 -35
- package/src/commands/doc/index.ts +83 -0
- package/src/commands/doc/module.test.ts +119 -0
- package/src/commands/doc/module.ts +114 -0
- package/src/commands/doc/modules.test.ts +103 -0
- package/src/commands/doc/modules.ts +98 -0
- package/src/commands/doc/search.test.ts +94 -0
- package/src/commands/doc/search.ts +111 -0
- package/src/commands/generate-doc.test.ts +63 -0
- package/src/commands/generate-doc.ts +105 -0
- package/src/commands/index.ts +20 -8
- package/src/commands/init-module.test.ts +43 -0
- package/src/commands/init-module.ts +74 -0
- package/src/commands/lib/command-result.ts +30 -0
- package/src/commands/lib/discovery.test.ts +74 -0
- package/src/commands/lib/discovery.ts +106 -0
- package/src/commands/lib/paths.ts +22 -0
- package/src/commands/lib/sync-check-source.test.ts +197 -0
- package/src/commands/lib/sync-check-source.ts +100 -0
- package/src/commands/lib/sync-check-tests.test.ts +178 -0
- package/src/commands/lib/sync-check-tests.ts +69 -0
- package/src/commands/mock/index.ts +11 -6
- package/src/commands/module/generate.ts +39 -14
- package/src/commands/module/index.ts +31 -45
- package/src/commands/parse-doc-test-cases.ts +13 -2
- package/src/commands/sync-check.test.ts +6 -364
- package/src/commands/sync-check.ts +7 -251
- package/src/generator/generate-app-code.test.ts +121 -0
- package/src/generator/generate-app-code.ts +51 -0
- package/src/{commands/scaffold.test.ts → generator/generate-code-boilerplate.test.ts} +19 -89
- package/src/generator/generate-code.test.ts +57 -6
- package/src/generator/generate-code.ts +40 -157
- package/src/generator/generate-errors.ts +34 -0
- package/src/generator/generate-permissions.ts +12 -0
- package/src/generator/generate-shells.ts +28 -0
- package/src/generator/generate-stubs.ts +31 -0
- package/src/generator/parse-resolver-doc.test.ts +89 -0
- package/src/generator/parse-resolver-doc.ts +125 -0
- package/src/generator/scaffold.ts +57 -0
- package/src/generator/stub-templates.test.ts +55 -0
- package/src/generator/stub-templates.ts +145 -0
- package/src/integration.test.ts +2 -2
- package/src/modules/audit/README.md +46 -0
- package/src/modules/audit/command/activateAuditPolicy.generated.ts +6 -0
- package/src/modules/audit/command/activateAuditPolicy.test.ts +186 -0
- package/src/modules/audit/command/activateAuditPolicy.ts +97 -0
- package/src/modules/audit/command/createAuditPolicy.generated.ts +6 -0
- package/src/modules/audit/command/createAuditPolicy.test.ts +395 -0
- package/src/modules/audit/command/createAuditPolicy.ts +131 -0
- package/src/modules/audit/command/deactivateAuditPolicy.generated.ts +6 -0
- package/src/modules/audit/command/deactivateAuditPolicy.test.ts +138 -0
- package/src/modules/audit/command/deactivateAuditPolicy.ts +58 -0
- package/src/modules/audit/command/deleteAuditPolicy.generated.ts +6 -0
- package/src/modules/audit/command/deleteAuditPolicy.test.ts +121 -0
- package/src/modules/audit/command/deleteAuditPolicy.ts +52 -0
- package/src/modules/audit/command/logAuditEvent.generated.ts +6 -0
- package/src/modules/audit/command/logAuditEvent.test.ts +991 -0
- package/src/modules/audit/command/logAuditEvent.ts +357 -0
- package/src/modules/audit/command/reactivateAuditPolicy.generated.ts +6 -0
- package/src/modules/audit/command/reactivateAuditPolicy.test.ts +143 -0
- package/src/modules/audit/command/reactivateAuditPolicy.ts +79 -0
- package/src/modules/audit/command/registerAuditableEntity.generated.ts +6 -0
- package/src/modules/audit/command/registerAuditableEntity.test.ts +268 -0
- package/src/modules/audit/command/registerAuditableEntity.ts +94 -0
- package/src/modules/audit/command/replaceAuditPolicy.generated.ts +6 -0
- package/src/modules/audit/command/replaceAuditPolicy.test.ts +242 -0
- package/src/modules/audit/command/replaceAuditPolicy.ts +91 -0
- package/src/modules/audit/command/updateAuditPolicy.generated.ts +6 -0
- package/src/modules/audit/command/updateAuditPolicy.test.ts +284 -0
- package/src/modules/audit/command/updateAuditPolicy.ts +151 -0
- package/src/modules/audit/db/auditEntry.ts +47 -0
- package/src/modules/audit/db/auditPolicy.ts +33 -0
- package/src/modules/audit/db/auditableEntity.ts +22 -0
- package/src/modules/audit/db/changeDetail.ts +28 -0
- package/src/modules/audit/db/policyFieldRule.ts +23 -0
- package/src/modules/audit/docs/commands/ActivateAuditPolicy.md +69 -0
- package/src/modules/audit/docs/commands/CreateAuditPolicy.md +79 -0
- package/src/modules/audit/docs/commands/DeactivateAuditPolicy.md +55 -0
- package/src/modules/audit/docs/commands/DeleteAuditPolicy.md +55 -0
- package/src/modules/audit/docs/commands/LogAuditEvent.md +137 -0
- package/src/modules/audit/docs/commands/ReactivateAuditPolicy.md +58 -0
- package/src/modules/audit/docs/commands/RegisterAuditableEntity.md +62 -0
- package/src/modules/audit/docs/commands/ReplaceAuditPolicy.md +72 -0
- package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +77 -0
- package/src/modules/audit/docs/features/audit-event-logging.md +126 -0
- package/src/modules/audit/docs/features/audit-policy-configuration.md +135 -0
- package/src/modules/audit/docs/features/field-level-change-tracking.md +95 -0
- package/src/modules/audit/docs/models/AuditEntry.md +55 -0
- package/src/modules/audit/docs/models/AuditPolicy.md +79 -0
- package/src/modules/audit/docs/models/AuditableEntity.md +38 -0
- package/src/modules/audit/docs/models/ChangeDetail.md +55 -0
- package/src/modules/audit/docs/models/PolicyFieldRule.md +45 -0
- package/src/modules/audit/docs/queries/GetAuditEntry.md +49 -0
- package/src/modules/audit/docs/queries/GetAuditPolicy.md +54 -0
- package/src/modules/audit/docs/queries/GetAuditSummary.md +84 -0
- package/src/modules/audit/docs/queries/GetChangeDetails.md +56 -0
- package/src/modules/audit/docs/queries/ListAuditPolicies.md +58 -0
- package/src/modules/audit/docs/queries/SearchAuditEntries.md +91 -0
- package/src/modules/audit/generated/kysely-tailordb.ts +92 -0
- package/src/modules/audit/index.ts +2 -0
- package/src/modules/audit/lib/_db_deps.ts +13 -0
- package/src/modules/audit/lib/errors.generated.ts +120 -0
- package/src/modules/audit/lib/permissions.generated.ts +14 -0
- package/src/modules/audit/lib/types.ts +28 -0
- package/src/modules/audit/module.ts +57 -0
- package/src/modules/audit/permissions.ts +39 -0
- package/src/modules/audit/query/getAuditEntry.generated.ts +5 -0
- package/src/modules/audit/query/getAuditEntry.test.ts +123 -0
- package/src/modules/audit/query/getAuditEntry.ts +36 -0
- package/src/modules/audit/query/getAuditPolicy.generated.ts +5 -0
- package/src/modules/audit/query/getAuditPolicy.test.ts +169 -0
- package/src/modules/audit/query/getAuditPolicy.ts +42 -0
- package/src/modules/audit/query/getAuditSummary.generated.ts +5 -0
- package/src/modules/audit/query/getAuditSummary.test.ts +632 -0
- package/src/modules/audit/query/getAuditSummary.ts +164 -0
- package/src/modules/audit/query/getChangeDetails.generated.ts +5 -0
- package/src/modules/audit/query/getChangeDetails.test.ts +195 -0
- package/src/modules/audit/query/getChangeDetails.ts +42 -0
- package/src/modules/audit/query/listAuditPolicies.generated.ts +5 -0
- package/src/modules/audit/query/listAuditPolicies.test.ts +239 -0
- package/src/modules/audit/query/listAuditPolicies.ts +100 -0
- package/src/modules/audit/query/searchAuditEntries.generated.ts +5 -0
- package/src/modules/audit/query/searchAuditEntries.test.ts +424 -0
- package/src/modules/audit/query/searchAuditEntries.ts +121 -0
- package/src/modules/audit/tailor.config.ts +13 -0
- package/src/modules/audit/tailor.d.ts +13 -0
- package/src/modules/audit/testing/fixtures.ts +215 -0
- package/src/modules/business-partner/README.md +60 -0
- package/src/modules/business-partner/command/.gitkeep +0 -0
- package/src/modules/business-partner/command/activatePartner.generated.ts +6 -0
- package/src/modules/business-partner/command/activatePartner.test.ts +59 -0
- package/src/modules/business-partner/command/activatePartner.ts +45 -0
- package/src/modules/business-partner/command/assignRoleToPartner.generated.ts +6 -0
- package/src/modules/business-partner/command/assignRoleToPartner.test.ts +113 -0
- package/src/modules/business-partner/command/assignRoleToPartner.ts +72 -0
- package/src/modules/business-partner/command/createContactPerson.generated.ts +6 -0
- package/src/modules/business-partner/command/createContactPerson.test.ts +193 -0
- package/src/modules/business-partner/command/createContactPerson.ts +98 -0
- package/src/modules/business-partner/command/createPartner.generated.ts +6 -0
- package/src/modules/business-partner/command/createPartner.test.ts +179 -0
- package/src/modules/business-partner/command/createPartner.ts +83 -0
- package/src/modules/business-partner/command/createPartnerAddress.generated.ts +6 -0
- package/src/modules/business-partner/command/createPartnerAddress.test.ts +195 -0
- package/src/modules/business-partner/command/createPartnerAddress.ts +119 -0
- package/src/modules/business-partner/command/createPartnerBankAccount.generated.ts +6 -0
- package/src/modules/business-partner/command/createPartnerBankAccount.test.ts +297 -0
- package/src/modules/business-partner/command/createPartnerBankAccount.ts +114 -0
- package/src/modules/business-partner/command/createPartnerIdentification.generated.ts +6 -0
- package/src/modules/business-partner/command/createPartnerIdentification.test.ts +255 -0
- package/src/modules/business-partner/command/createPartnerIdentification.ts +97 -0
- package/src/modules/business-partner/command/deactivateContactPerson.generated.ts +6 -0
- package/src/modules/business-partner/command/deactivateContactPerson.test.ts +70 -0
- package/src/modules/business-partner/command/deactivateContactPerson.ts +54 -0
- package/src/modules/business-partner/command/deactivatePartner.generated.ts +6 -0
- package/src/modules/business-partner/command/deactivatePartner.test.ts +59 -0
- package/src/modules/business-partner/command/deactivatePartner.ts +46 -0
- package/src/modules/business-partner/command/deleteContactPerson.generated.ts +6 -0
- package/src/modules/business-partner/command/deleteContactPerson.test.ts +61 -0
- package/src/modules/business-partner/command/deleteContactPerson.ts +48 -0
- package/src/modules/business-partner/command/deletePartner.generated.ts +6 -0
- package/src/modules/business-partner/command/deletePartner.test.ts +58 -0
- package/src/modules/business-partner/command/deletePartner.ts +46 -0
- package/src/modules/business-partner/command/deletePartnerAddress.generated.ts +6 -0
- package/src/modules/business-partner/command/deletePartnerAddress.test.ts +74 -0
- package/src/modules/business-partner/command/deletePartnerAddress.ts +52 -0
- package/src/modules/business-partner/command/deletePartnerBankAccount.generated.ts +6 -0
- package/src/modules/business-partner/command/deletePartnerBankAccount.test.ts +55 -0
- package/src/modules/business-partner/command/deletePartnerBankAccount.ts +36 -0
- package/src/modules/business-partner/command/deletePartnerIdentification.generated.ts +6 -0
- package/src/modules/business-partner/command/deletePartnerIdentification.test.ts +47 -0
- package/src/modules/business-partner/command/deletePartnerIdentification.ts +37 -0
- package/src/modules/business-partner/command/reactivateContactPerson.generated.ts +6 -0
- package/src/modules/business-partner/command/reactivateContactPerson.test.ts +48 -0
- package/src/modules/business-partner/command/reactivateContactPerson.ts +48 -0
- package/src/modules/business-partner/command/reactivatePartner.generated.ts +6 -0
- package/src/modules/business-partner/command/reactivatePartner.test.ts +59 -0
- package/src/modules/business-partner/command/reactivatePartner.ts +46 -0
- package/src/modules/business-partner/command/removeRoleFromPartner.generated.ts +6 -0
- package/src/modules/business-partner/command/removeRoleFromPartner.test.ts +82 -0
- package/src/modules/business-partner/command/removeRoleFromPartner.ts +73 -0
- package/src/modules/business-partner/command/setDefaultPartnerAddress.generated.ts +6 -0
- package/src/modules/business-partner/command/setDefaultPartnerAddress.test.ts +60 -0
- package/src/modules/business-partner/command/setDefaultPartnerAddress.ts +48 -0
- package/src/modules/business-partner/command/setDefaultPartnerBankAccount.generated.ts +6 -0
- package/src/modules/business-partner/command/setDefaultPartnerBankAccount.test.ts +56 -0
- package/src/modules/business-partner/command/setDefaultPartnerBankAccount.ts +51 -0
- package/src/modules/business-partner/command/setPrimaryContactPerson.generated.ts +6 -0
- package/src/modules/business-partner/command/setPrimaryContactPerson.test.ts +63 -0
- package/src/modules/business-partner/command/setPrimaryContactPerson.ts +55 -0
- package/src/modules/business-partner/command/updateContactPerson.generated.ts +6 -0
- package/src/modules/business-partner/command/updateContactPerson.test.ts +193 -0
- package/src/modules/business-partner/command/updateContactPerson.ts +92 -0
- package/src/modules/business-partner/command/updatePartner.generated.ts +6 -0
- package/src/modules/business-partner/command/updatePartner.test.ts +101 -0
- package/src/modules/business-partner/command/updatePartner.ts +76 -0
- package/src/modules/business-partner/command/updatePartnerAddress.generated.ts +6 -0
- package/src/modules/business-partner/command/updatePartnerAddress.test.ts +148 -0
- package/src/modules/business-partner/command/updatePartnerAddress.ts +64 -0
- package/src/modules/business-partner/command/updatePartnerBankAccount.generated.ts +6 -0
- package/src/modules/business-partner/command/updatePartnerBankAccount.test.ts +249 -0
- package/src/modules/business-partner/command/updatePartnerBankAccount.ts +109 -0
- package/src/modules/business-partner/command/updatePartnerIdentification.generated.ts +6 -0
- package/src/modules/business-partner/command/updatePartnerIdentification.test.ts +162 -0
- package/src/modules/business-partner/command/updatePartnerIdentification.ts +105 -0
- package/src/modules/business-partner/db/.gitkeep +0 -0
- package/src/modules/business-partner/db/businessPartner.ts +59 -0
- package/src/modules/business-partner/db/contactPerson.ts +49 -0
- package/src/modules/business-partner/db/partnerAddress.ts +45 -0
- package/src/modules/business-partner/db/partnerBankAccount.ts +53 -0
- package/src/modules/business-partner/db/partnerIdentification.ts +53 -0
- package/src/modules/business-partner/db/partnerRole.ts +43 -0
- package/src/modules/business-partner/docs/commands/ActivatePartner.md +39 -0
- package/src/modules/business-partner/docs/commands/AssignRoleToPartner.md +49 -0
- package/src/modules/business-partner/docs/commands/CreateContactPerson.md +59 -0
- package/src/modules/business-partner/docs/commands/CreatePartner.md +54 -0
- package/src/modules/business-partner/docs/commands/CreatePartnerAddress.md +60 -0
- package/src/modules/business-partner/docs/commands/CreatePartnerBankAccount.md +68 -0
- package/src/modules/business-partner/docs/commands/CreatePartnerIdentification.md +59 -0
- package/src/modules/business-partner/docs/commands/DeactivateContactPerson.md +42 -0
- package/src/modules/business-partner/docs/commands/DeactivatePartner.md +39 -0
- package/src/modules/business-partner/docs/commands/DeleteContactPerson.md +43 -0
- package/src/modules/business-partner/docs/commands/DeletePartner.md +40 -0
- package/src/modules/business-partner/docs/commands/DeletePartnerAddress.md +40 -0
- package/src/modules/business-partner/docs/commands/DeletePartnerBankAccount.md +35 -0
- package/src/modules/business-partner/docs/commands/DeletePartnerIdentification.md +33 -0
- package/src/modules/business-partner/docs/commands/ReactivateContactPerson.md +38 -0
- package/src/modules/business-partner/docs/commands/ReactivatePartner.md +39 -0
- package/src/modules/business-partner/docs/commands/RemoveRoleFromPartner.md +46 -0
- package/src/modules/business-partner/docs/commands/SetDefaultPartnerAddress.md +38 -0
- package/src/modules/business-partner/docs/commands/SetDefaultPartnerBankAccount.md +38 -0
- package/src/modules/business-partner/docs/commands/SetPrimaryContactPerson.md +43 -0
- package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +66 -0
- package/src/modules/business-partner/docs/commands/UpdatePartner.md +48 -0
- package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +46 -0
- package/src/modules/business-partner/docs/commands/UpdatePartnerBankAccount.md +64 -0
- package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +52 -0
- package/src/modules/business-partner/docs/features/contact-person-management.md +70 -0
- package/src/modules/business-partner/docs/features/partner-address-management.md +96 -0
- package/src/modules/business-partner/docs/features/partner-bank-account.md +70 -0
- package/src/modules/business-partner/docs/features/partner-identification.md +76 -0
- package/src/modules/business-partner/docs/features/partner-lifecycle.md +59 -0
- package/src/modules/business-partner/docs/features/partner-role-classification.md +73 -0
- package/src/modules/business-partner/docs/models/BusinessPartner.md +64 -0
- package/src/modules/business-partner/docs/models/ContactPerson.md +62 -0
- package/src/modules/business-partner/docs/models/PartnerAddress.md +52 -0
- package/src/modules/business-partner/docs/models/PartnerBankAccount.md +50 -0
- package/src/modules/business-partner/docs/models/PartnerIdentification.md +46 -0
- package/src/modules/business-partner/docs/models/PartnerRole.md +42 -0
- package/src/modules/business-partner/docs/queries/GetContactPerson.md +34 -0
- package/src/modules/business-partner/docs/queries/GetDefaultPartnerAddress.md +40 -0
- package/src/modules/business-partner/docs/queries/GetDefaultPartnerBankAccount.md +36 -0
- package/src/modules/business-partner/docs/queries/GetPartner.md +35 -0
- package/src/modules/business-partner/docs/queries/GetPartnerAddress.md +34 -0
- package/src/modules/business-partner/docs/queries/GetPartnerBankAccount.md +34 -0
- package/src/modules/business-partner/docs/queries/GetPartnerIdentification.md +34 -0
- package/src/modules/business-partner/docs/queries/GetPartnerRole.md +34 -0
- package/src/modules/business-partner/docs/queries/GetPrimaryContactPerson.md +36 -0
- package/src/modules/business-partner/docs/queries/ListContactPersonsByPartner.md +39 -0
- package/src/modules/business-partner/docs/queries/ListPartnerAddressesByPartner.md +41 -0
- package/src/modules/business-partner/docs/queries/ListPartnerBankAccountsByPartner.md +39 -0
- package/src/modules/business-partner/docs/queries/ListPartnerIdentificationsByPartner.md +41 -0
- package/src/modules/business-partner/docs/queries/ListPartnersByRole.md +47 -0
- package/src/modules/business-partner/executor/.gitkeep +0 -0
- package/src/modules/business-partner/generated/.gitkeep +0 -0
- package/src/modules/business-partner/generated/enums.ts +60 -0
- package/src/modules/business-partner/generated/kysely-tailordb.ts +114 -0
- package/src/modules/business-partner/index.ts +2 -0
- package/src/modules/business-partner/lib/_db_deps.ts +17 -0
- package/src/modules/business-partner/lib/errors.generated.ts +172 -0
- package/src/modules/business-partner/lib/errors.ts +2 -0
- package/src/modules/business-partner/lib/permissions.generated.ts +30 -0
- package/src/modules/business-partner/lib/types.ts +53 -0
- package/src/modules/business-partner/module.ts +181 -0
- package/src/modules/business-partner/permissions.ts +3 -0
- package/src/modules/business-partner/query/.gitkeep +0 -0
- package/src/modules/business-partner/query/getContactPerson.generated.ts +5 -0
- package/src/modules/business-partner/query/getContactPerson.test.ts +31 -0
- package/src/modules/business-partner/query/getContactPerson.ts +16 -0
- package/src/modules/business-partner/query/getDefaultPartnerAddress.generated.ts +5 -0
- package/src/modules/business-partner/query/getDefaultPartnerAddress.test.ts +45 -0
- package/src/modules/business-partner/query/getDefaultPartnerAddress.ts +30 -0
- package/src/modules/business-partner/query/getDefaultPartnerBankAccount.generated.ts +5 -0
- package/src/modules/business-partner/query/getDefaultPartnerBankAccount.test.ts +43 -0
- package/src/modules/business-partner/query/getDefaultPartnerBankAccount.ts +17 -0
- package/src/modules/business-partner/query/getPartner.generated.ts +5 -0
- package/src/modules/business-partner/query/getPartner.test.ts +31 -0
- package/src/modules/business-partner/query/getPartner.ts +16 -0
- package/src/modules/business-partner/query/getPartnerAddress.generated.ts +5 -0
- package/src/modules/business-partner/query/getPartnerAddress.test.ts +31 -0
- package/src/modules/business-partner/query/getPartnerAddress.ts +16 -0
- package/src/modules/business-partner/query/getPartnerBankAccount.generated.ts +5 -0
- package/src/modules/business-partner/query/getPartnerBankAccount.test.ts +31 -0
- package/src/modules/business-partner/query/getPartnerBankAccount.ts +16 -0
- package/src/modules/business-partner/query/getPartnerIdentification.generated.ts +5 -0
- package/src/modules/business-partner/query/getPartnerIdentification.test.ts +31 -0
- package/src/modules/business-partner/query/getPartnerIdentification.ts +16 -0
- package/src/modules/business-partner/query/getPartnerRole.generated.ts +5 -0
- package/src/modules/business-partner/query/getPartnerRole.test.ts +31 -0
- package/src/modules/business-partner/query/getPartnerRole.ts +19 -0
- package/src/modules/business-partner/query/getPrimaryContactPerson.generated.ts +5 -0
- package/src/modules/business-partner/query/getPrimaryContactPerson.test.ts +43 -0
- package/src/modules/business-partner/query/getPrimaryContactPerson.ts +17 -0
- package/src/modules/business-partner/query/listContactPersonsByPartner.generated.ts +5 -0
- package/src/modules/business-partner/query/listContactPersonsByPartner.test.ts +77 -0
- package/src/modules/business-partner/query/listContactPersonsByPartner.ts +32 -0
- package/src/modules/business-partner/query/listPartnerAddressesByPartner.generated.ts +5 -0
- package/src/modules/business-partner/query/listPartnerAddressesByPartner.test.ts +71 -0
- package/src/modules/business-partner/query/listPartnerAddressesByPartner.ts +37 -0
- package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.generated.ts +5 -0
- package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.test.ts +59 -0
- package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.ts +32 -0
- package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.generated.ts +5 -0
- package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.test.ts +72 -0
- package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.ts +40 -0
- package/src/modules/business-partner/query/listPartnersByRole.generated.ts +5 -0
- package/src/modules/business-partner/query/listPartnersByRole.test.ts +103 -0
- package/src/modules/business-partner/query/listPartnersByRole.ts +47 -0
- package/src/modules/business-partner/tailor.config.ts +13 -0
- package/src/modules/business-partner/tailor.d.ts +13 -0
- package/src/modules/business-partner/testing/fixtures.ts +204 -0
- package/src/modules/coa-management/README.md +61 -0
- package/src/modules/coa-management/command/.gitkeep +0 -0
- package/src/modules/coa-management/command/activateAccount.generated.ts +6 -0
- package/src/modules/coa-management/command/activateAccount.test.ts +125 -0
- package/src/modules/coa-management/command/activateAccount.ts +105 -0
- package/src/modules/coa-management/command/activateChartOfAccounts.generated.ts +6 -0
- package/src/modules/coa-management/command/activateChartOfAccounts.test.ts +113 -0
- package/src/modules/coa-management/command/activateChartOfAccounts.ts +104 -0
- package/src/modules/coa-management/command/createAccount.generated.ts +6 -0
- package/src/modules/coa-management/command/createAccount.test.ts +767 -0
- package/src/modules/coa-management/command/createAccount.ts +247 -0
- package/src/modules/coa-management/command/createAccountGroup.generated.ts +6 -0
- package/src/modules/coa-management/command/createAccountGroup.test.ts +494 -0
- package/src/modules/coa-management/command/createAccountGroup.ts +207 -0
- package/src/modules/coa-management/command/createChartOfAccounts.generated.ts +6 -0
- package/src/modules/coa-management/command/createChartOfAccounts.test.ts +502 -0
- package/src/modules/coa-management/command/createChartOfAccounts.ts +267 -0
- package/src/modules/coa-management/command/deactivateAccount.generated.ts +6 -0
- package/src/modules/coa-management/command/deactivateAccount.test.ts +199 -0
- package/src/modules/coa-management/command/deactivateAccount.ts +142 -0
- package/src/modules/coa-management/command/deactivateChartOfAccounts.generated.ts +6 -0
- package/src/modules/coa-management/command/deactivateChartOfAccounts.test.ts +91 -0
- package/src/modules/coa-management/command/deactivateChartOfAccounts.ts +88 -0
- package/src/modules/coa-management/command/deleteAccount.generated.ts +6 -0
- package/src/modules/coa-management/command/deleteAccount.test.ts +122 -0
- package/src/modules/coa-management/command/deleteAccount.ts +103 -0
- package/src/modules/coa-management/command/deleteAccountGroup.generated.ts +6 -0
- package/src/modules/coa-management/command/deleteAccountGroup.test.ts +120 -0
- package/src/modules/coa-management/command/deleteAccountGroup.ts +113 -0
- package/src/modules/coa-management/command/deleteChartOfAccounts.generated.ts +6 -0
- package/src/modules/coa-management/command/deleteChartOfAccounts.test.ts +154 -0
- package/src/modules/coa-management/command/deleteChartOfAccounts.ts +133 -0
- package/src/modules/coa-management/command/moveAccountGroup.generated.ts +6 -0
- package/src/modules/coa-management/command/moveAccountGroup.test.ts +199 -0
- package/src/modules/coa-management/command/moveAccountGroup.ts +145 -0
- package/src/modules/coa-management/command/reactivateAccount.generated.ts +6 -0
- package/src/modules/coa-management/command/reactivateAccount.test.ts +126 -0
- package/src/modules/coa-management/command/reactivateAccount.ts +123 -0
- package/src/modules/coa-management/command/updateAccount.generated.ts +6 -0
- package/src/modules/coa-management/command/updateAccount.test.ts +669 -0
- package/src/modules/coa-management/command/updateAccount.ts +370 -0
- package/src/modules/coa-management/command/updateAccountGroup.generated.ts +6 -0
- package/src/modules/coa-management/command/updateAccountGroup.test.ts +253 -0
- package/src/modules/coa-management/command/updateAccountGroup.ts +191 -0
- package/src/modules/coa-management/command/updateChartOfAccounts.generated.ts +6 -0
- package/src/modules/coa-management/command/updateChartOfAccounts.test.ts +153 -0
- package/src/modules/coa-management/command/updateChartOfAccounts.ts +133 -0
- package/src/modules/coa-management/db/.gitkeep +0 -0
- package/src/modules/coa-management/db/account.ts +119 -0
- package/src/modules/coa-management/db/accountGroup.ts +57 -0
- package/src/modules/coa-management/db/chartOfAccounts.ts +55 -0
- package/src/modules/coa-management/docs/commands/ActivateAccount.md +49 -0
- package/src/modules/coa-management/docs/commands/ActivateChartOfAccounts.md +47 -0
- package/src/modules/coa-management/docs/commands/CreateAccount.md +94 -0
- package/src/modules/coa-management/docs/commands/CreateAccountGroup.md +70 -0
- package/src/modules/coa-management/docs/commands/CreateChartOfAccounts.md +72 -0
- package/src/modules/coa-management/docs/commands/DeactivateAccount.md +65 -0
- package/src/modules/coa-management/docs/commands/DeactivateChartOfAccounts.md +44 -0
- package/src/modules/coa-management/docs/commands/DeleteAccount.md +52 -0
- package/src/modules/coa-management/docs/commands/DeleteAccountGroup.md +50 -0
- package/src/modules/coa-management/docs/commands/DeleteChartOfAccounts.md +48 -0
- package/src/modules/coa-management/docs/commands/MoveAccountGroup.md +57 -0
- package/src/modules/coa-management/docs/commands/ReactivateAccount.md +50 -0
- package/src/modules/coa-management/docs/commands/UpdateAccount.md +102 -0
- package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +62 -0
- package/src/modules/coa-management/docs/commands/UpdateChartOfAccounts.md +49 -0
- package/src/modules/coa-management/docs/features/account-group-hierarchy.md +81 -0
- package/src/modules/coa-management/docs/features/account-lifecycle.md +80 -0
- package/src/modules/coa-management/docs/features/account-management.md +114 -0
- package/src/modules/coa-management/docs/features/chart-of-accounts-setup.md +86 -0
- package/src/modules/coa-management/docs/models/Account.md +84 -0
- package/src/modules/coa-management/docs/models/AccountGroup.md +55 -0
- package/src/modules/coa-management/docs/models/ChartOfAccounts.md +65 -0
- package/src/modules/coa-management/docs/queries/DetectCircularReference.md +52 -0
- package/src/modules/coa-management/docs/queries/GetAccount.md +42 -0
- package/src/modules/coa-management/docs/queries/GetAccountGroup.md +42 -0
- package/src/modules/coa-management/docs/queries/GetChartOfAccounts.md +48 -0
- package/src/modules/coa-management/docs/queries/ListAccountGroups.md +42 -0
- package/src/modules/coa-management/docs/queries/ListAccounts.md +54 -0
- package/src/modules/coa-management/docs/queries/ListUnassignedAccounts.md +40 -0
- package/src/modules/coa-management/executor/.gitkeep +0 -0
- package/src/modules/coa-management/generated/.gitkeep +0 -0
- package/src/modules/coa-management/generated/enums.ts +45 -0
- package/src/modules/coa-management/generated/kysely-tailordb.ts +81 -0
- package/src/modules/coa-management/index.ts +2 -0
- package/src/modules/coa-management/lib/_db_deps.ts +17 -0
- package/src/modules/coa-management/lib/errors.generated.ts +162 -0
- package/src/modules/coa-management/lib/errors.ts +0 -0
- package/src/modules/coa-management/lib/permissions.generated.ts +20 -0
- package/src/modules/coa-management/lib/types.ts +22 -0
- package/src/modules/coa-management/module.ts +136 -0
- package/src/modules/coa-management/permissions.ts +3 -0
- package/src/modules/coa-management/query/.gitkeep +0 -0
- package/src/modules/coa-management/query/detectCircularReference.generated.ts +5 -0
- package/src/modules/coa-management/query/detectCircularReference.test.ts +88 -0
- package/src/modules/coa-management/query/detectCircularReference.ts +46 -0
- package/src/modules/coa-management/query/getAccount.generated.ts +5 -0
- package/src/modules/coa-management/query/getAccount.test.ts +55 -0
- package/src/modules/coa-management/query/getAccount.ts +25 -0
- package/src/modules/coa-management/query/getAccountGroup.generated.ts +5 -0
- package/src/modules/coa-management/query/getAccountGroup.test.ts +55 -0
- package/src/modules/coa-management/query/getAccountGroup.ts +25 -0
- package/src/modules/coa-management/query/getChartOfAccounts.generated.ts +5 -0
- package/src/modules/coa-management/query/getChartOfAccounts.test.ts +79 -0
- package/src/modules/coa-management/query/getChartOfAccounts.ts +28 -0
- package/src/modules/coa-management/query/listAccountGroups.generated.ts +5 -0
- package/src/modules/coa-management/query/listAccountGroups.test.ts +72 -0
- package/src/modules/coa-management/query/listAccountGroups.ts +49 -0
- package/src/modules/coa-management/query/listAccounts.generated.ts +5 -0
- package/src/modules/coa-management/query/listAccounts.test.ts +136 -0
- package/src/modules/coa-management/query/listAccounts.ts +82 -0
- package/src/modules/coa-management/query/listUnassignedAccounts.generated.ts +5 -0
- package/src/modules/coa-management/query/listUnassignedAccounts.test.ts +96 -0
- package/src/modules/coa-management/query/listUnassignedAccounts.ts +39 -0
- package/src/modules/coa-management/tailor.config.ts +13 -0
- package/src/modules/coa-management/tailor.d.ts +13 -0
- package/src/modules/coa-management/testing/fixtures.ts +201 -0
- package/src/modules/item-management/README.md +1 -1
- package/src/modules/organization/README.md +57 -0
- package/src/modules/organization/command/.gitkeep +0 -0
- package/src/modules/organization/command/activateCompany.generated.ts +6 -0
- package/src/modules/organization/command/activateCompany.test.ts +184 -0
- package/src/modules/organization/command/activateCompany.ts +92 -0
- package/src/modules/organization/command/createCompany.generated.ts +6 -0
- package/src/modules/organization/command/createCompany.test.ts +156 -0
- package/src/modules/organization/command/createCompany.ts +80 -0
- package/src/modules/organization/command/createDepartment.generated.ts +6 -0
- package/src/modules/organization/command/createDepartment.test.ts +239 -0
- package/src/modules/organization/command/createDepartment.ts +98 -0
- package/src/modules/organization/command/createSite.generated.ts +6 -0
- package/src/modules/organization/command/createSite.test.ts +262 -0
- package/src/modules/organization/command/createSite.ts +155 -0
- package/src/modules/organization/command/deactivateCompany.generated.ts +6 -0
- package/src/modules/organization/command/deactivateCompany.test.ts +58 -0
- package/src/modules/organization/command/deactivateCompany.ts +47 -0
- package/src/modules/organization/command/deactivateDepartment.generated.ts +6 -0
- package/src/modules/organization/command/deactivateDepartment.test.ts +115 -0
- package/src/modules/organization/command/deactivateDepartment.ts +63 -0
- package/src/modules/organization/command/deactivateSite.generated.ts +6 -0
- package/src/modules/organization/command/deactivateSite.test.ts +53 -0
- package/src/modules/organization/command/deactivateSite.ts +47 -0
- package/src/modules/organization/command/deleteCompany.generated.ts +6 -0
- package/src/modules/organization/command/deleteCompany.test.ts +99 -0
- package/src/modules/organization/command/deleteCompany.ts +66 -0
- package/src/modules/organization/command/reactivateCompany.generated.ts +6 -0
- package/src/modules/organization/command/reactivateCompany.test.ts +58 -0
- package/src/modules/organization/command/reactivateCompany.ts +47 -0
- package/src/modules/organization/command/reactivateDepartment.generated.ts +6 -0
- package/src/modules/organization/command/reactivateDepartment.test.ts +59 -0
- package/src/modules/organization/command/reactivateDepartment.ts +47 -0
- package/src/modules/organization/command/reactivateSite.generated.ts +6 -0
- package/src/modules/organization/command/reactivateSite.test.ts +53 -0
- package/src/modules/organization/command/reactivateSite.ts +47 -0
- package/src/modules/organization/command/updateCompany.generated.ts +6 -0
- package/src/modules/organization/command/updateCompany.test.ts +239 -0
- package/src/modules/organization/command/updateCompany.ts +127 -0
- package/src/modules/organization/command/updateDepartment.generated.ts +6 -0
- package/src/modules/organization/command/updateDepartment.test.ts +232 -0
- package/src/modules/organization/command/updateDepartment.ts +120 -0
- package/src/modules/organization/command/updateSite.generated.ts +6 -0
- package/src/modules/organization/command/updateSite.test.ts +274 -0
- package/src/modules/organization/command/updateSite.ts +176 -0
- package/src/modules/organization/db/.gitkeep +0 -0
- package/src/modules/organization/db/company.ts +44 -0
- package/src/modules/organization/db/department.ts +46 -0
- package/src/modules/organization/db/site.ts +44 -0
- package/src/modules/organization/docs/commands/ActivateCompany.md +62 -0
- package/src/modules/organization/docs/commands/CreateCompany.md +49 -0
- package/src/modules/organization/docs/commands/CreateDepartment.md +62 -0
- package/src/modules/organization/docs/commands/CreateSite.md +74 -0
- package/src/modules/organization/docs/commands/DeactivateCompany.md +40 -0
- package/src/modules/organization/docs/commands/DeactivateDepartment.md +44 -0
- package/src/modules/organization/docs/commands/DeactivateSite.md +38 -0
- package/src/modules/organization/docs/commands/DeleteCompany.md +50 -0
- package/src/modules/organization/docs/commands/ReactivateCompany.md +39 -0
- package/src/modules/organization/docs/commands/ReactivateDepartment.md +37 -0
- package/src/modules/organization/docs/commands/ReactivateSite.md +37 -0
- package/src/modules/organization/docs/commands/UpdateCompany.md +58 -0
- package/src/modules/organization/docs/commands/UpdateDepartment.md +64 -0
- package/src/modules/organization/docs/commands/UpdateSite.md +80 -0
- package/src/modules/organization/docs/features/company-lifecycle.md +76 -0
- package/src/modules/organization/docs/features/department-management.md +66 -0
- package/src/modules/organization/docs/features/site-management.md +86 -0
- package/src/modules/organization/docs/models/Company.md +60 -0
- package/src/modules/organization/docs/models/Department.md +57 -0
- package/src/modules/organization/docs/models/Site.md +57 -0
- package/src/modules/organization/docs/queries/DetectDepartmentCircularReference.md +50 -0
- package/src/modules/organization/docs/queries/GetCompany.md +40 -0
- package/src/modules/organization/docs/queries/GetDepartment.md +44 -0
- package/src/modules/organization/docs/queries/GetDepartmentChildren.md +40 -0
- package/src/modules/organization/docs/queries/GetSite.md +37 -0
- package/src/modules/organization/docs/queries/ListDepartmentsByCompany.md +54 -0
- package/src/modules/organization/docs/queries/ListSitesByCompany.md +54 -0
- package/src/modules/organization/executor/.gitkeep +0 -0
- package/src/modules/organization/generated/.gitkeep +0 -0
- package/src/modules/organization/generated/kysely-tailordb.ts +77 -0
- package/src/modules/organization/index.ts +2 -0
- package/src/modules/organization/lib/_db_deps.ts +10 -0
- package/src/modules/organization/lib/errors.generated.ts +117 -0
- package/src/modules/organization/lib/errors.ts +1 -0
- package/src/modules/organization/lib/permissions.generated.ts +19 -0
- package/src/modules/organization/lib/types.ts +16 -0
- package/src/modules/organization/module.ts +89 -0
- package/src/modules/organization/permissions.ts +3 -0
- package/src/modules/organization/query/.gitkeep +0 -0
- package/src/modules/organization/query/detectDepartmentCircularReference.generated.ts +5 -0
- package/src/modules/organization/query/detectDepartmentCircularReference.test.ts +102 -0
- package/src/modules/organization/query/detectDepartmentCircularReference.ts +27 -0
- package/src/modules/organization/query/getCompany.generated.ts +5 -0
- package/src/modules/organization/query/getCompany.test.ts +70 -0
- package/src/modules/organization/query/getCompany.ts +16 -0
- package/src/modules/organization/query/getDepartment.generated.ts +5 -0
- package/src/modules/organization/query/getDepartment.test.ts +85 -0
- package/src/modules/organization/query/getDepartment.ts +17 -0
- package/src/modules/organization/query/getDepartmentChildren.generated.ts +5 -0
- package/src/modules/organization/query/getDepartmentChildren.test.ts +75 -0
- package/src/modules/organization/query/getDepartmentChildren.ts +21 -0
- package/src/modules/organization/query/getSite.generated.ts +5 -0
- package/src/modules/organization/query/getSite.test.ts +55 -0
- package/src/modules/organization/query/getSite.ts +16 -0
- package/src/modules/organization/query/listDepartmentsByCompany.generated.ts +5 -0
- package/src/modules/organization/query/listDepartmentsByCompany.test.ts +124 -0
- package/src/modules/organization/query/listDepartmentsByCompany.ts +43 -0
- package/src/modules/organization/query/listSitesByCompany.generated.ts +5 -0
- package/src/modules/organization/query/listSitesByCompany.test.ts +126 -0
- package/src/modules/organization/query/listSitesByCompany.ts +41 -0
- package/src/modules/organization/tailor.config.ts +13 -0
- package/src/modules/organization/tailor.d.ts +13 -0
- package/src/modules/organization/testing/fixtures.ts +155 -0
- package/src/modules/primitives/README.md +1 -1
- package/src/modules/primitives/command/setBaseCurrency.test.ts +8 -64
- package/src/modules/primitives/command/setBaseCurrency.ts +6 -64
- package/src/modules/primitives/docs/commands/ActivateCategory.md +1 -1
- package/src/modules/primitives/docs/commands/ActivateCurrency.md +1 -1
- package/src/modules/primitives/docs/commands/ActivateUnit.md +1 -1
- package/src/modules/primitives/docs/commands/CreateExchangeRate.md +2 -2
- package/src/modules/primitives/docs/commands/CreateUnit.md +1 -1
- package/src/modules/primitives/docs/commands/DeactivateCategory.md +1 -1
- package/src/modules/primitives/docs/commands/DeactivateCurrency.md +1 -1
- package/src/modules/primitives/docs/commands/DeactivateUnit.md +1 -1
- package/src/modules/primitives/docs/commands/SetBaseCurrency.md +13 -23
- package/src/modules/primitives/docs/commands/SetReferenceUnit.md +1 -1
- package/src/modules/primitives/docs/features/currency-definitions.md +13 -14
- package/src/modules/primitives/docs/models/Currency.md +3 -4
- package/src/modules/primitives/docs/queries/ConvertAmount.md +2 -2
- package/src/modules/primitives/docs/queries/ConvertQuantity.md +2 -2
- package/src/modules/primitives/lib/errors.generated.ts +5 -0
- package/src/modules/product-management/README.md +1 -1
- package/src/modules/user-management/docs/commands/CreatePermission.md +3 -3
- package/src/modules/user-management/docs/commands/CreateRole.md +1 -1
- package/src/modules/user-management/docs/queries/ListRolePermissionsByRole.md +39 -0
- package/src/modules/user-management/docs/queries/ListUserRolesByUser.md +39 -0
- package/src/modules/user-management/generated/enums.ts +0 -15
- package/src/modules/user-management/generated/kysely-tailordb.ts +0 -11
- package/src/shared/createContext.ts +2 -1
- package/src/shared/defineQuery.ts +36 -1
- package/src/shared/requirePermission.ts +3 -3
- package/src/shared/types.ts +3 -0
- package/templates/scaffold/app/backend/package.json +8 -7
- package/templates/scaffold/app/frontend/eslint.config.js +12 -0
- package/templates/scaffold/app/frontend/package.json +19 -16
- package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +30 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +3 -2
- package/templates/scaffold/app/frontend/vite.config.ts +5 -5
- package/templates/workflows/erp-kit-check.yml +2 -2
- package/src/commands/module/list.test.ts +0 -57
- package/src/commands/module/list.ts +0 -64
- package/src/commands/scaffold.ts +0 -176
- /package/src/modules/{accounting → audit/db}/.gitkeep +0 -0
- /package/src/modules/audit/{.gitkeep → executor/.gitkeep} +0 -0
- /package/src/modules/{coa-management/.gitkeep → audit/lib/errors.ts} +0 -0
- /package/src/modules/{supplier-management → business-partner}/.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
|