@tailor-platform/erp-kit 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +35 -7
- package/dist/cli.mjs +779 -268
- package/package.json +5 -4
- package/skills/erp-kit-app-1-requirements/SKILL.md +8 -9
- package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +4 -0
- package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +4 -0
- package/skills/erp-kit-app-3-plan/SKILL.md +27 -27
- package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +21 -17
- 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-5-impl-backend/SKILL.md +9 -11
- 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-module-1-requirements/SKILL.md +6 -12
- 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 +2 -4
- 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-6-impl-review/SKILL.md +21 -7
- 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/src/commands/app/index.ts +28 -17
- 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.ts +17 -10
- package/src/commands/index.ts +20 -8
- 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 +13 -8
- package/src/commands/module/index.ts +17 -21
- 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/generator/generate-code-boilerplate.test.ts +1 -1
- package/src/generator/generate-code.test.ts +33 -6
- package/src/generator/generate-code.ts +12 -226
- 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/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 +4 -3
- package/templates/scaffold/app/frontend/eslint.config.js +12 -0
- package/templates/scaffold/app/frontend/package.json +10 -7
- 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/src/commands/module/list.test.ts +0 -57
- package/src/commands/module/list.ts +0 -64
- /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,57 @@
|
|
|
1
|
+
# MoveAccountGroup
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
moveAccountGroup reparents an account group by changing its parent reference within the same CoA. The group and all its descendants move together, preserving the subtree structure and all account assignments. Moving to a null parent promotes the group to a root group.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target group must exist
|
|
10
|
+
- Parent CoA must be in DRAFT or ACTIVE status; moving a group under an ARCHIVED CoA is rejected
|
|
11
|
+
- New parent group must exist within the same CoA when specified (null for root promotion)
|
|
12
|
+
- A group cannot be moved under itself or any of its descendants (circular reference prevention)
|
|
13
|
+
- All child groups and their account assignments are preserved during the move
|
|
14
|
+
- Group code and account assignments are unchanged by the move
|
|
15
|
+
- Emits an audit event via the audit module recording the acting user, timestamp, previous parent reference, and new parent reference
|
|
16
|
+
|
|
17
|
+
## Process Flow
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
flowchart TD
|
|
21
|
+
A[Receive move request] --> B{Group exists?}
|
|
22
|
+
B -->|No| C[Return error: not found]
|
|
23
|
+
B -->|Yes| B2{Parent CoA is DRAFT or ACTIVE?}
|
|
24
|
+
B2 -->|No| B3[Return error: CoA is ARCHIVED]
|
|
25
|
+
B2 -->|Yes| D{New parent specified?}
|
|
26
|
+
D -->|Yes| E{New parent exists in same CoA?}
|
|
27
|
+
E -->|No| F[Return error: parent not found]
|
|
28
|
+
E -->|Yes| G{New parent is descendant of group?}
|
|
29
|
+
G -->|Yes| H[Return error: circular reference]
|
|
30
|
+
G -->|No| I[Update parent reference]
|
|
31
|
+
D -->|No/null| I[Promote to root]
|
|
32
|
+
I --> J[Emit audit event]
|
|
33
|
+
J --> K[Return moved group]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## External Dependencies
|
|
37
|
+
|
|
38
|
+
- None
|
|
39
|
+
|
|
40
|
+
## Error Scenarios
|
|
41
|
+
|
|
42
|
+
- **ACCOUNT_GROUP_NOT_FOUND**: Specified group ID does not exist
|
|
43
|
+
- **CHART_OF_ACCOUNTS_ARCHIVED**: Parent CoA is in ARCHIVED status; no modifications are permitted
|
|
44
|
+
- **PARENT_GROUP_NOT_FOUND**: Specified new parent group ID does not exist or belongs to a different CoA
|
|
45
|
+
- **CIRCULAR_REFERENCE**: New parent is the group itself or one of its descendants
|
|
46
|
+
|
|
47
|
+
## Test Cases
|
|
48
|
+
|
|
49
|
+
- returns error when group does not exist
|
|
50
|
+
- returns error when parent CoA is ARCHIVED
|
|
51
|
+
- returns error when new parent does not exist
|
|
52
|
+
- returns error when new parent belongs to different CoA
|
|
53
|
+
- returns error when moving group under itself
|
|
54
|
+
- returns error when moving group under its descendant
|
|
55
|
+
- moves group to different parent
|
|
56
|
+
- promotes group to root by setting parent to null
|
|
57
|
+
- emits audit event recording previous and new parent references
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# ReactivateAccount
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
reactivateAccount transitions a GL account from INACTIVE back to ACTIVE status, making it eligible to receive journal postings again. Reactivation clears any previously mapped successor account, as the account is now directly available for use.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target account must exist
|
|
10
|
+
- Parent CoA must be in ACTIVE status; reactivating an account under an ARCHIVED CoA is rejected. Note: the DRAFT CoA case is unreachable because account activation requires an ACTIVE CoA, so an INACTIVE account cannot exist under a DRAFT CoA
|
|
11
|
+
- Target account must be in INACTIVE status
|
|
12
|
+
- Reactivating a DRAFT or ACTIVE account fails with an invalid state transition error
|
|
13
|
+
- Reactivation clears any previously mapped successor account
|
|
14
|
+
- Emits an audit event via the audit module recording the acting user, timestamp, CoA reference, account code, and status transition from INACTIVE to ACTIVE
|
|
15
|
+
|
|
16
|
+
## Process Flow
|
|
17
|
+
|
|
18
|
+
```mermaid
|
|
19
|
+
flowchart TD
|
|
20
|
+
A[Receive reactivate request] --> B{Account exists?}
|
|
21
|
+
B -->|No| C[Return error: not found]
|
|
22
|
+
B -->|Yes| B2{Parent CoA is ACTIVE?}
|
|
23
|
+
B2 -->|No| B3[Return error: CoA is not ACTIVE]
|
|
24
|
+
B2 -->|Yes| D{Status is INACTIVE?}
|
|
25
|
+
D -->|No| E[Return error: invalid state transition]
|
|
26
|
+
D -->|Yes| F[Clear successor mapping]
|
|
27
|
+
F --> G[Update status to ACTIVE]
|
|
28
|
+
G --> H[Emit audit event]
|
|
29
|
+
H --> I[Return reactivated account]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## External Dependencies
|
|
33
|
+
|
|
34
|
+
- None
|
|
35
|
+
|
|
36
|
+
## Error Scenarios
|
|
37
|
+
|
|
38
|
+
- **ACCOUNT_NOT_FOUND**: Specified account ID does not exist
|
|
39
|
+
- **CHART_OF_ACCOUNTS_ARCHIVED**: Parent CoA is in ARCHIVED status; no modifications are permitted
|
|
40
|
+
- **INVALID_STATE_TRANSITION**: Entity is not in the required status for the requested state transition
|
|
41
|
+
|
|
42
|
+
## Test Cases
|
|
43
|
+
|
|
44
|
+
- returns error when account does not exist
|
|
45
|
+
- returns error when parent CoA is ARCHIVED
|
|
46
|
+
- returns error when account is DRAFT
|
|
47
|
+
- returns error when account is already ACTIVE
|
|
48
|
+
- reactivates an INACTIVE account
|
|
49
|
+
- clears successor mapping on reactivation
|
|
50
|
+
- emits audit event recording status transition from INACTIVE to ACTIVE
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# UpdateAccount
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateAccount modifies attributes of an existing GL account. Structural fields (code, type, classification, currency restriction) become immutable once the account has posted transactions. Non-structural fields (name, tags, default tax code, account group assignment) remain updatable regardless of posting history.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target account must exist
|
|
10
|
+
- Parent CoA must be in DRAFT or ACTIVE status; updating an account under an ARCHIVED CoA is rejected
|
|
11
|
+
- Name, when provided, must be non-empty
|
|
12
|
+
- Account code, when changed, must be a valid structured numeric identifier
|
|
13
|
+
- Account code, when changed, must remain unique within the CoA
|
|
14
|
+
- If the account has posted transactions, structural fields (code, type, classification, currency restriction) cannot be changed
|
|
15
|
+
- Classification changes must maintain compatibility with account type
|
|
16
|
+
- Changing classification to RETAINED_EARNINGS is rejected if another account in the CoA already has that classification
|
|
17
|
+
- The reconciliation invariant is enforced on every update: accounts with RECEIVABLE, PAYABLE, or BANK_CASH classification must have reconciliation enabled. Explicitly setting isReconciliation to false on an account that currently has (or is being changed to) one of these classifications is rejected. This applies to three update paths: (1) changing classification to RECEIVABLE/PAYABLE/BANK_CASH while isReconciliation is false, (2) setting isReconciliation to false on an account already classified as RECEIVABLE/PAYABLE/BANK_CASH, and (3) simultaneously changing classification to one of these types and setting isReconciliation to false
|
|
18
|
+
- Classification changes that affect posting constraints must update the stored constraint accordingly: changing to NON_POSTING marks the account as excluded from posting target selection; changing to RECEIVABLE or PAYABLE marks the account as a control account blocking manual postings; changing away from these classifications removes the corresponding constraint (all enforced by downstream posting modules)
|
|
19
|
+
- Currency restriction changes must reference a valid currency from the primitives module. An account with currency restriction only accepts postings in that currency (enforced by downstream posting modules)
|
|
20
|
+
- Account group changes must reference a group in the same CoA, and the account code must fall within the group's number range (if defined)
|
|
21
|
+
- When the account code is changed and the account belongs to an account group (whether the group assignment is also changing or staying the same), the new code must fall within the target group's number range (if defined). This applies to both cases: changing only the code while keeping the current group, and changing both the code and the group simultaneously
|
|
22
|
+
- Emits an audit event via the audit module recording the acting user, timestamp, CoA reference, account code, and previous and new field values for all changed attributes
|
|
23
|
+
|
|
24
|
+
## Process Flow
|
|
25
|
+
|
|
26
|
+
```mermaid
|
|
27
|
+
flowchart TD
|
|
28
|
+
A[Receive update request] --> B{Account exists?}
|
|
29
|
+
B -->|No| C[Return error: not found]
|
|
30
|
+
B -->|Yes| B2{Parent CoA is DRAFT or ACTIVE?}
|
|
31
|
+
B2 -->|No| B3[Return error: CoA is ARCHIVED]
|
|
32
|
+
B2 -->|Yes| D{Structural fields changed?}
|
|
33
|
+
D -->|Yes| E{Account has posted transactions?}
|
|
34
|
+
E -->|Yes| F[Return error: structural fields immutable]
|
|
35
|
+
E -->|No| D2{Code changed?}
|
|
36
|
+
D2 -->|Yes| D3{Valid numeric format?}
|
|
37
|
+
D3 -->|No| D4[Return error: invalid code format]
|
|
38
|
+
D3 -->|Yes| D5{Code unique within CoA?}
|
|
39
|
+
D5 -->|No| D6[Return error: duplicate code]
|
|
40
|
+
D5 -->|Yes| G{Validate other structural changes}
|
|
41
|
+
D2 -->|No| G
|
|
42
|
+
D -->|No| H{Validate non-structural changes}
|
|
43
|
+
G --> H
|
|
44
|
+
H --> H2{Reconciliation invariant violated?}
|
|
45
|
+
H2 -->|Yes| H3[Return error: reconciliation required]
|
|
46
|
+
H2 -->|No| I[Update account fields]
|
|
47
|
+
I --> J[Emit audit event]
|
|
48
|
+
J --> K[Return updated account]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## External Dependencies
|
|
52
|
+
|
|
53
|
+
- [primitives::getCurrency](../../../primitives/docs/queries/GetCurrency.md) - Validates currency restriction changes
|
|
54
|
+
|
|
55
|
+
## Error Scenarios
|
|
56
|
+
|
|
57
|
+
- **ACCOUNT_NOT_FOUND**: Specified account ID does not exist
|
|
58
|
+
- **CHART_OF_ACCOUNTS_ARCHIVED**: Parent CoA is in ARCHIVED status; no modifications are permitted
|
|
59
|
+
- **NAME_REQUIRED**: Name is provided but empty
|
|
60
|
+
- **INVALID_ACCOUNT_CODE**: New account code is not a valid structured numeric identifier
|
|
61
|
+
- **DUPLICATE_ACCOUNT_CODE**: An account with the same code already exists in the CoA
|
|
62
|
+
- **STRUCTURAL_FIELD_IMMUTABLE**: Attempted to change a structural field on an account with posted transactions
|
|
63
|
+
- **INCOMPATIBLE_CLASSIFICATION**: New classification is not compatible with the account type
|
|
64
|
+
- **DUPLICATE_RETAINED_EARNINGS**: Another account in the CoA already has RETAINED_EARNINGS classification
|
|
65
|
+
- **RECONCILIATION_REQUIRED**: Cannot disable reconciliation on an account with RECEIVABLE, PAYABLE, or BANK_CASH classification
|
|
66
|
+
- **CURRENCY_NOT_FOUND**: Referenced currency does not exist or is not active
|
|
67
|
+
- **ACCOUNT_GROUP_NOT_FOUND**: Referenced account group does not exist or belongs to a different CoA
|
|
68
|
+
- **CODE_OUT_OF_RANGE**: Account code does not fall within the target group's number range (applies when changing the group, changing the code, or changing both)
|
|
69
|
+
|
|
70
|
+
## Test Cases
|
|
71
|
+
|
|
72
|
+
- returns error when account does not exist
|
|
73
|
+
- returns error when parent CoA is ARCHIVED
|
|
74
|
+
- returns error when name is empty
|
|
75
|
+
- returns error when new account code is not a valid numeric identifier
|
|
76
|
+
- returns error when new account code already exists in the CoA
|
|
77
|
+
- returns error when changing structural field on account with posted transactions
|
|
78
|
+
- returns error when new classification is incompatible with type
|
|
79
|
+
- returns error when changing to RETAINED_EARNINGS and another account already has it
|
|
80
|
+
- returns error when new currency does not exist
|
|
81
|
+
- returns error when new group belongs to different CoA
|
|
82
|
+
- updates name of an account
|
|
83
|
+
- updates tags of an account
|
|
84
|
+
- updates default tax code
|
|
85
|
+
- updates account group assignment
|
|
86
|
+
- updates structural fields when no posted transactions exist
|
|
87
|
+
- returns error when setting isReconciliation to false on a RECEIVABLE account
|
|
88
|
+
- returns error when setting isReconciliation to false on a PAYABLE account
|
|
89
|
+
- returns error when setting isReconciliation to false on a BANK_CASH account
|
|
90
|
+
- returns error when changing classification to RECEIVABLE with isReconciliation explicitly set to false
|
|
91
|
+
- enforces reconciliation when classification changes to RECEIVABLE
|
|
92
|
+
- marks account as excluded from posting when classification changes to NON_POSTING
|
|
93
|
+
- marks account as control account blocking manual postings when classification changes to RECEIVABLE
|
|
94
|
+
- marks account as control account blocking manual postings when classification changes to PAYABLE
|
|
95
|
+
- removes posting exclusion when classification changes from NON_POSTING to REGULAR
|
|
96
|
+
- updates currency restriction and posting currency constraint accordingly
|
|
97
|
+
- returns error when account code outside new group number range
|
|
98
|
+
- returns error when changing code to a value outside the current group's number range
|
|
99
|
+
- returns error when changing classification from RECEIVABLE after posted transactions
|
|
100
|
+
- returns error when changing classification from PAYABLE after posted transactions
|
|
101
|
+
- emits audit event recording previous and new field values for all changed attributes
|
|
102
|
+
- passes custom fields through to update
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# UpdateAccountGroup
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateAccountGroup modifies the mutable fields (name, sort order, number range) of an existing account group. Code is immutable after creation. Number range changes must not conflict with existing account assignments or overlap with other groups' ranges.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target group must exist
|
|
10
|
+
- Parent CoA must be in DRAFT or ACTIVE status; updating a group under an ARCHIVED CoA is rejected
|
|
11
|
+
- Name, when provided, must be non-empty
|
|
12
|
+
- Group code is immutable
|
|
13
|
+
- Number range changes, when provided, require both start and end to be provided together, must remain a valid non-overlapping interval within the CoA
|
|
14
|
+
- Changing a number range must not invalidate existing accounts already assigned to the group (their codes must still fall within the new range)
|
|
15
|
+
- Emits an audit event via the audit module recording the acting user, timestamp, and previous and new field values for all changed attributes
|
|
16
|
+
|
|
17
|
+
## Process Flow
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
flowchart TD
|
|
21
|
+
A[Receive update request] --> B{Group exists?}
|
|
22
|
+
B -->|No| C[Return error: not found]
|
|
23
|
+
B -->|Yes| B2{Parent CoA is DRAFT or ACTIVE?}
|
|
24
|
+
B2 -->|No| B3[Return error: CoA is ARCHIVED]
|
|
25
|
+
B2 -->|Yes| D{Name valid if provided?}
|
|
26
|
+
D -->|No| E[Return error: name required]
|
|
27
|
+
D -->|Yes| F{Number range valid if changed?}
|
|
28
|
+
F -->|No| G[Return error: invalid or overlapping range]
|
|
29
|
+
F -->|Yes| H{Existing accounts within new range?}
|
|
30
|
+
H -->|No| I[Return error: accounts out of range]
|
|
31
|
+
H -->|Yes| J[Update group fields]
|
|
32
|
+
J --> K[Emit audit event]
|
|
33
|
+
K --> L[Return updated group]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## External Dependencies
|
|
37
|
+
|
|
38
|
+
- [audit](../../../audit/README.md) — Receives audit events emitted by this command
|
|
39
|
+
|
|
40
|
+
## Error Scenarios
|
|
41
|
+
|
|
42
|
+
- **ACCOUNT_GROUP_NOT_FOUND**: Specified group ID does not exist
|
|
43
|
+
- **CHART_OF_ACCOUNTS_ARCHIVED**: Parent CoA is in ARCHIVED status; no modifications are permitted
|
|
44
|
+
- **NAME_REQUIRED**: Name is provided but empty
|
|
45
|
+
- **INVALID_NUMBER_RANGE**: Number range is invalid or overlaps with another group's range
|
|
46
|
+
- **ACCOUNTS_OUT_OF_RANGE**: Existing assigned accounts have codes outside the new number range
|
|
47
|
+
|
|
48
|
+
## Test Cases
|
|
49
|
+
|
|
50
|
+
- returns error when group does not exist
|
|
51
|
+
- returns error when parent CoA is ARCHIVED
|
|
52
|
+
- returns error when name is empty
|
|
53
|
+
- returns error when new number range is invalid
|
|
54
|
+
- returns error when updating to one-sided number range (start only)
|
|
55
|
+
- returns error when updating to one-sided number range (end only)
|
|
56
|
+
- returns error when new number range overlaps with another group
|
|
57
|
+
- returns error when existing accounts fall outside new number range
|
|
58
|
+
- updates group name
|
|
59
|
+
- updates sort order
|
|
60
|
+
- updates number range
|
|
61
|
+
- emits audit event recording previous and new field values
|
|
62
|
+
- passes custom fields through to update
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# UpdateChartOfAccounts
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateChartOfAccounts modifies the mutable fields (name, description) of an existing Chart of Accounts. Updates are permitted while the CoA is in DRAFT or ACTIVE status. ARCHIVED CoA records cannot be updated.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target CoA must exist
|
|
10
|
+
- Target CoA must be in DRAFT or ACTIVE status; updating an ARCHIVED CoA is rejected
|
|
11
|
+
- Name, when provided, must be non-empty
|
|
12
|
+
- Description is optional and can be cleared
|
|
13
|
+
- Emits an audit event via the audit module recording the acting user, timestamp, and previous and new field values for all changed attributes
|
|
14
|
+
|
|
15
|
+
## Process Flow
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart TD
|
|
19
|
+
A[Receive update request] --> B{CoA exists?}
|
|
20
|
+
B -->|No| C[Return error: not found]
|
|
21
|
+
B -->|Yes| D{Status is DRAFT or ACTIVE?}
|
|
22
|
+
D -->|No| E[Return error: CoA is archived]
|
|
23
|
+
D -->|Yes| F{Name valid if provided?}
|
|
24
|
+
F -->|No| G[Return error: name required]
|
|
25
|
+
F -->|Yes| H[Update CoA fields]
|
|
26
|
+
H --> I[Emit audit event]
|
|
27
|
+
I --> J[Return updated CoA]
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## External Dependencies
|
|
31
|
+
|
|
32
|
+
- None
|
|
33
|
+
|
|
34
|
+
## Error Scenarios
|
|
35
|
+
|
|
36
|
+
- **CHART_OF_ACCOUNTS_NOT_FOUND**: Specified CoA ID does not exist
|
|
37
|
+
- **CHART_OF_ACCOUNTS_ARCHIVED**: CoA is in ARCHIVED status and cannot be modified
|
|
38
|
+
- **NAME_REQUIRED**: Name is provided but empty
|
|
39
|
+
|
|
40
|
+
## Test Cases
|
|
41
|
+
|
|
42
|
+
- returns error when CoA does not exist
|
|
43
|
+
- returns error when CoA is ARCHIVED
|
|
44
|
+
- returns error when name is empty
|
|
45
|
+
- updates name of a DRAFT CoA
|
|
46
|
+
- updates description of an ACTIVE CoA
|
|
47
|
+
- clears description by setting to null
|
|
48
|
+
- emits audit event recording previous and new field values
|
|
49
|
+
- passes custom fields through to update
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Account Group Hierarchy
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Account groups organize general ledger (GL) accounts into logical categories and nestable hierarchical tree structures within a Chart of Accounts (CoA). Each group has a code, name, optional parent group reference for nesting, and a sort order that controls display sequencing. Groups define categories such as "Current Assets" or "Long-Term Liabilities" and may constrain the account number ranges assignable to their member accounts.
|
|
6
|
+
|
|
7
|
+
Groups can be nested to form a multi-level tree hierarchy that provides structural metadata for the CoA. A root group with no parent represents a top-level section (e.g., "Assets"), while child groups subdivide it into progressively finer categories. Accounts are mapped to leaf or intermediate groups. The hierarchy defines the structure; how that structure is consumed — for balance aggregation, financial statement rendering, or period-close validation — is the responsibility of downstream modules (general-ledger, reporting).
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
- **Logical categorization**: Groups classify GL accounts into meaningful business categories (e.g., "Cash and Cash Equivalents", "Accounts Receivable") so that users and downstream modules can reason about accounts collectively
|
|
12
|
+
- **Hierarchical structure**: Nested group trees define the structural organization of accounts. The hierarchy provides the metadata that downstream modules (general-ledger, reporting) consume for balance aggregation and financial statement rendering — this module owns the tree structure, not the aggregation logic
|
|
13
|
+
- **Account number range control**: Groups can define allowed number intervals, ensuring that accounts created within a group fall into the expected numbering range (e.g., 1000-1999 for Assets)
|
|
14
|
+
- **Single operational hierarchy**: Each CoA has one group hierarchy tree that defines the operational categorization of accounts. Financial statement versions (FSV) and multi-GAAP alternative hierarchies are out of scope for this module and belong to a future reporting module
|
|
15
|
+
- **Structural consistency**: Account group assignment is optional per account, but recommended. This module provides a query to list accounts not assigned to any group, enabling downstream consumers to validate completeness according to their own requirements
|
|
16
|
+
|
|
17
|
+
## Process Flow
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
flowchart TD
|
|
21
|
+
A[Create Chart of Accounts] --> B[Define Root Groups]
|
|
22
|
+
B --> C[Create Child Groups under Root]
|
|
23
|
+
C --> D{More nesting needed?}
|
|
24
|
+
D -- Yes --> C
|
|
25
|
+
D -- No --> E[Set Account Number Ranges per Group]
|
|
26
|
+
E --> F[Assign Accounts to Groups]
|
|
27
|
+
F --> G[Hierarchy Structure Complete]
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```mermaid
|
|
31
|
+
flowchart TD
|
|
32
|
+
L1[Root Group: Assets]
|
|
33
|
+
L1 --> L2A[Child Group: Current Assets]
|
|
34
|
+
L1 --> L2B[Child Group: Non-Current Assets]
|
|
35
|
+
L2A --> L3A[Leaf Group: Cash and Equivalents]
|
|
36
|
+
L2A --> L3B[Leaf Group: Accounts Receivable]
|
|
37
|
+
L3A --> A1[Account 1010: Petty Cash]
|
|
38
|
+
L3A --> A2[Account 1020: Bank Account]
|
|
39
|
+
L3B --> A3[Account 1100: Trade Receivables]
|
|
40
|
+
L2B --> L3C[Leaf Group: Fixed Assets]
|
|
41
|
+
L3C --> A4[Account 1500: Equipment]
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Scenario Patterns
|
|
45
|
+
|
|
46
|
+
- **Standard Balance Sheet Structure**: A controller creates root groups for Assets, Liabilities, and Equity, then nests child groups (Current Assets, Non-Current Assets, Current Liabilities, etc.) to define the account organization structure
|
|
47
|
+
- **Income Statement Structure**: Revenue and expense root groups are subdivided into operating and non-operating categories, with leaf groups for specific reporting classes such as operating expenses, non-operating expenses, and revenue subclasses (e.g., product revenue, service revenue)
|
|
48
|
+
- **Operational Hierarchy Setup**: A single group hierarchy is defined for the CoA, structuring accounts into logical sections (Balance Sheet and Income Statement categories). Downstream modules consume this hierarchy for reporting and aggregation
|
|
49
|
+
- **Account Range Enforcement**: An "Accounts Payable" group is configured with the number range 2000-2099; attempting to create an account numbered 3001 within this group is rejected
|
|
50
|
+
- **Reparenting a Group**: A "Short-Term Investments" group is moved from "Non-Current Assets" to "Current Assets" to reflect a reclassification, updating the hierarchy path
|
|
51
|
+
- **Unassigned Account Query**: A query lists all active accounts not assigned to any group, enabling downstream consumers (e.g., reporting module) to validate hierarchy completeness according to their own requirements
|
|
52
|
+
|
|
53
|
+
## Test Cases
|
|
54
|
+
|
|
55
|
+
- Every account group belongs to exactly one Chart of Accounts
|
|
56
|
+
- Account group code is required and must be unique within its CoA
|
|
57
|
+
- Account group code is immutable after creation
|
|
58
|
+
- Account group name is required and must be non-empty
|
|
59
|
+
- A group with no parent reference is treated as a root-level group
|
|
60
|
+
- A group with a parent reference must reference a valid group within the same CoA
|
|
61
|
+
- Circular parent references are rejected (a group cannot be its own ancestor)
|
|
62
|
+
- Sort order controls the display sequence of sibling groups under the same parent
|
|
63
|
+
- Deleting a group that contains child groups or assigned accounts is rejected
|
|
64
|
+
- Account number range, when defined on a group, must be a valid non-overlapping interval within the CoA
|
|
65
|
+
- Accounts assigned to a group must have account numbers within the group's allowed range (when a range is defined)
|
|
66
|
+
- Hierarchy depth is not artificially limited but must remain acyclic
|
|
67
|
+
- Moving a group to a new parent within the same CoA updates the hierarchy without breaking existing account assignments
|
|
68
|
+
- A query returns all active accounts within a CoA that are not assigned to any group
|
|
69
|
+
- Account group assignment is optional; accounts can exist in a CoA without belonging to any group
|
|
70
|
+
- The hierarchy tree structure is queryable by downstream modules for consumption (e.g., balance aggregation, report rendering)
|
|
71
|
+
- Creating an account group emits an audit event via the audit module recording the acting user, timestamp, and initial field values
|
|
72
|
+
- Updating an account group (name, sort order, number range) emits an audit event recording previous and new field values; parent changes are handled by the moveAccountGroup operation, not updateAccountGroup
|
|
73
|
+
- Deleting an account group emits an audit event recording the deletion and acting user
|
|
74
|
+
- Moving a group to a new parent emits an audit event recording the previous and new parent references
|
|
75
|
+
|
|
76
|
+
## Reference Links
|
|
77
|
+
|
|
78
|
+
- [SAP Account Groups and Number Ranges](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee5c9e37ff4f4e33a6c7e2c32f8fc3b5/4b0d35d32d6b3e41e10000000a42189c.html)
|
|
79
|
+
- [SAP Financial Statement Versions](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee5c9e37ff4f4e33a6c7e2c32f8fc3b5/577f8c2a397b4ce589e1ad03a64eb1ae.html)
|
|
80
|
+
- [Oracle General Ledger Trees and Hierarchies](https://docs.oracle.com/en/cloud/saas/financials/24d/oaglg/overview-of-accounting-hierarchies.html)
|
|
81
|
+
- [Odoo Account Groups](https://www.odoo.com/documentation/19.0/applications/finance/accounting/get_started/chart_of_accounts.html)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Account Lifecycle
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
GL accounts follow a state machine (DRAFT -> ACTIVE <-> INACTIVE) that governs when an account can receive journal postings, be modified, or be deactivated. The lifecycle ensures that accounts are fully validated before they participate in financial transactions, and that historical data is preserved when an account is retired.
|
|
6
|
+
|
|
7
|
+
Accounts with posted transactions cannot be deleted — they must be deactivated instead. Deactivation prevents new postings while retaining the account for regulatory reporting and audit purposes. An optional successor account mapping allows a replacement to be designated during deactivation; the actual posting redirection behavior is owned by the general-ledger module, which reads the successor mapping from this module. All status transitions emit audit events through the audit module, supporting SOX compliance requirements for change tracking on the chart of accounts.
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
- **Lifecycle gating**: Only ACTIVE accounts can receive new journal postings, preventing use of incomplete or retired accounts in financial transactions. Account activation itself requires the parent CoA to be in ACTIVE status — accounts under a DRAFT CoA remain in DRAFT until the CoA is activated, ensuring safe cascade deletion of DRAFT CoAs
|
|
12
|
+
- **Data preservation**: Accounts with posted transactions are never deleted; deactivation preserves history for regulatory retention requirements (typically 7-10 years)
|
|
13
|
+
- **Deprecation with successor mapping**: When retiring an account, an optional successor account can be designated. This module stores the mapping; the general-ledger module is responsible for reading this mapping and redirecting future postings
|
|
14
|
+
- **Balance verification (integration point)**: Deactivation can optionally verify that the account carries no open or unreconciled balances. The balance truth is owned by the general-ledger module — this module exposes a hook for the GL module to block deactivation when open balances exist
|
|
15
|
+
- **Audit trail**: Every status transition is recorded via the audit module, providing a complete change history for internal controls and external audits
|
|
16
|
+
- **Segregation of duties**: Account creation, modification, and approval of status changes can be assigned to separate roles, satisfying SOX and internal control requirements
|
|
17
|
+
|
|
18
|
+
## Process Flow
|
|
19
|
+
|
|
20
|
+
```mermaid
|
|
21
|
+
stateDiagram-v2
|
|
22
|
+
[*] --> Draft: createAccount
|
|
23
|
+
Draft --> Active: activateAccount
|
|
24
|
+
Active --> Inactive: deactivateAccount
|
|
25
|
+
Inactive --> Active: reactivateAccount
|
|
26
|
+
Draft --> [*]: deleteAccount
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```mermaid
|
|
30
|
+
stateDiagram-v2
|
|
31
|
+
state "Deactivation Workflow" as deact {
|
|
32
|
+
[*] --> VerifyBalances: initiate deactivation
|
|
33
|
+
VerifyBalances --> MapSuccessor: no open balances
|
|
34
|
+
VerifyBalances --> Blocked: open balances exist
|
|
35
|
+
MapSuccessor --> SetInactive: successor mapped (optional)
|
|
36
|
+
SetInactive --> EmitAuditEvent
|
|
37
|
+
EmitAuditEvent --> [*]
|
|
38
|
+
Blocked --> [*]: resolve balances first
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Scenario Patterns
|
|
43
|
+
|
|
44
|
+
- **New Account Setup**: A controller creates a GL account in DRAFT, assigns it to the correct account group and hierarchy, then activates it once the parent CoA is ACTIVE (account activation is gated on CoA ACTIVE status) before the first posting period
|
|
45
|
+
- **Account Deprecation with Successor**: A revenue account is being replaced by a more granular set of accounts; the old account is deactivated with a successor mapped. The general-ledger module reads this mapping to redirect any future automated postings to the new account
|
|
46
|
+
- **Balance-Blocked Deactivation (with GL integration)**: An attempt to deactivate an expense account is blocked by the general-ledger module's balance check hook because it still carries an unreconciled balance; the balance must be cleared or transferred before deactivation can proceed
|
|
47
|
+
- **Seasonal Reactivation**: A project-specific account was deactivated at project close but is reactivated when the project resumes, avoiding a duplicate account
|
|
48
|
+
- **Draft Cleanup**: An account created in error is deleted while still in DRAFT before any transactions are posted against it
|
|
49
|
+
- **Regulatory Retention**: A long-inactive account remains in the system with full posting history to satisfy the organization's 7-year data retention policy
|
|
50
|
+
|
|
51
|
+
## Test Cases
|
|
52
|
+
|
|
53
|
+
- Account lifecycle follows DRAFT -> ACTIVE <-> INACTIVE state machine
|
|
54
|
+
- Accounts can only be created in DRAFT status
|
|
55
|
+
- Only DRAFT accounts with no posted transactions can be deleted
|
|
56
|
+
- Activating a DRAFT account transitions status to ACTIVE when the parent CoA is ACTIVE
|
|
57
|
+
- Activating an account under a DRAFT CoA fails because account activation requires the parent CoA to be in ACTIVE status
|
|
58
|
+
- Activating an account under an ARCHIVED CoA fails because archived CoAs are immutable
|
|
59
|
+
- Activating an already ACTIVE account fails with an invalid status transition error
|
|
60
|
+
- Deactivating an ACTIVE account transitions status to INACTIVE
|
|
61
|
+
- Deactivating a DRAFT account fails with an invalid status transition error
|
|
62
|
+
- Reactivating an INACTIVE account transitions status to ACTIVE
|
|
63
|
+
- Only ACTIVE accounts can receive new journal postings
|
|
64
|
+
- Deactivation exposes a pre-deactivation hook that the general-ledger module can use to block the transition when open or unreconciled balances exist
|
|
65
|
+
- Without a GL module integrated, deactivation proceeds without balance checks
|
|
66
|
+
- A successor account can be mapped during deactivation; posting redirection is owned by the general-ledger module
|
|
67
|
+
- The successor account must itself be ACTIVE at the time of mapping
|
|
68
|
+
- A successor account mapping is optional; deactivation succeeds without one when balances are clear
|
|
69
|
+
- Deleting an account that has posted transactions fails regardless of current status
|
|
70
|
+
- Each status transition emits an audit event via the audit module
|
|
71
|
+
- Audit events record the previous status, new status, acting user, and timestamp
|
|
72
|
+
- Reactivating an account clears any previously mapped successor account
|
|
73
|
+
- Inactive accounts and their posted transactions remain queryable for reporting
|
|
74
|
+
|
|
75
|
+
## Reference Links
|
|
76
|
+
|
|
77
|
+
- [SAP GL Account Master Data](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee8e4a0f52db415aaa43eb0bf5446a35/4b0a1e1c2d6b3e41e10000000a42189c.html)
|
|
78
|
+
- [Odoo Chart of Accounts](https://www.odoo.com/documentation/19.0/applications/finance/accounting/get_started/chart_of_accounts.html)
|
|
79
|
+
- [Oracle GL Account Maintenance](https://docs.oracle.com/en/cloud/saas/financials/24d/oafmg/overview-of-oracle-general-ledger.html)
|
|
80
|
+
- [SOX Section 302 — Internal Controls](https://www.sarbanes-oxley-101.com/sarbanes-oxley-compliance.htm)
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Account Management
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Account Management provides CRUD operations for General Ledger (GL) accounts within a Chart of Accounts (CoA). A GL account is the fundamental building block of financial recording — every journal entry, sub-ledger posting, and financial report ultimately references one or more GL accounts. Each account carries a structured numeric code, a descriptive name, an account type drawn from the standard five-category classification (ASSET, LIABILITY, EQUITY, REVENUE, EXPENSE), an account classification that describes its operational role (e.g., RECEIVABLE, PAYABLE, BANK_CASH, FIXED_ASSET, RETAINED_EARNINGS, NON_POSTING, REGULAR), and optional attributes such as currency restriction, reconciliation flag, default tax code reference, and tags.
|
|
6
|
+
|
|
7
|
+
Accounts are always scoped to a parent CoA and may optionally belong to an account group for hierarchical reporting. The account code follows a structured numbering convention (e.g., 1000-1999 for assets, 2000-2999 for liabilities) that encodes classification directly in the identifier, enabling consistent sorting and range-based queries across the ledger.
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
- **Standardized financial classification**: The five account types (ASSET, LIABILITY, EQUITY, REVENUE, EXPENSE) map directly to the structure of the balance sheet and income statement, ensuring every transaction is categorized correctly
|
|
12
|
+
- **Operational account classification**: Beyond the five financial types, each account carries a classification that describes its operational role in the ERP system. Classifications include RECEIVABLE (sub-ledger integration with AR), PAYABLE (sub-ledger integration with AP), BANK_CASH (cash management and bank reconciliation), FIXED_ASSET (asset accounting integration), RETAINED_EARNINGS (equity roll-forward), NON_POSTING (a postability attribute that marks accounts as excluded from journal entry posting; this is not a hierarchy mechanism — structural hierarchy is owned exclusively by account groups), and REGULAR (general-purpose accounts with no special behavior). This classification drives downstream module behavior — for example, only RECEIVABLE accounts can serve as AR control accounts, and NON_POSTING accounts are excluded from journal entry target selection
|
|
13
|
+
- **Structured code numbering**: Numeric code ranges provide an immediately recognizable, sortable identifier that conveys account classification without requiring a lookup
|
|
14
|
+
- **Currency restriction**: Restricting an account to a specific currency prevents mixed-currency postings and simplifies reconciliation for foreign-currency bank or receivable accounts
|
|
15
|
+
- **Reconciliation control**: The reconciliation flag designates accounts (such as bank, accounts receivable, and accounts payable) where individual line items must be matched and cleared, supporting accurate cash and partner balance tracking. Accounts classified as RECEIVABLE, PAYABLE, or BANK_CASH must have reconciliation enabled — this is enforced as an invariant, not a default
|
|
16
|
+
- **Control account posting restrictions**: Accounts classified as RECEIVABLE or PAYABLE serve as sub-ledger control accounts. Direct manual journal postings to these accounts must be blocked; only automated postings from the AR/AP sub-ledger modules are permitted. This invariant preserves the integrity of the sub-ledger ↔ GL reconciliation and prevents manual entries from creating discrepancies between the sub-ledger detail and the GL summary balance
|
|
17
|
+
- **Structural immutability after posting**: Once an account has received posted transactions, structural fields (account code, account type, account classification, currency restriction) become immutable. This applies to all accounts but is especially critical for control accounts (RECEIVABLE, PAYABLE) where a classification change would break sub-ledger integration
|
|
18
|
+
- **Default tax code**: An optional free-text tax code identifier stored on the account for downstream use. When the `tax-configuration` module is implemented, this field will be migrated to a validated foreign-key reference against the tax code catalog. Until then, this module stores the identifier as free text with no external validation. The migration contract: the `tax-configuration` module will own the validation rule; this module will add a dependency and enforce referential integrity at that time
|
|
19
|
+
- **Tag-based categorization**: Tags provide flexible, cross-cutting labels for filtering and reporting beyond the rigid type and group hierarchy — for example, tagging accounts as "intercompany", "cost-center-allocable", or "cash-flow-relevant"
|
|
20
|
+
- **CoA and group membership**: Scoping accounts to a CoA and optional account group maintains structural integrity and supports hierarchical roll-up in trial balances and financial statements
|
|
21
|
+
|
|
22
|
+
## Process Flow
|
|
23
|
+
|
|
24
|
+
```mermaid
|
|
25
|
+
flowchart TD
|
|
26
|
+
A[Start] --> B[Create Account in CoA]
|
|
27
|
+
B --> C{All required fields valid?}
|
|
28
|
+
C -- No --> D[Return validation error]
|
|
29
|
+
C -- Yes --> E[Account created]
|
|
30
|
+
E --> F{Update needed?}
|
|
31
|
+
F -- Yes --> G[Update account attributes]
|
|
32
|
+
G --> H{Account referenced in journal entries?}
|
|
33
|
+
H -- Yes --> I[Restrict updates to non-structural fields]
|
|
34
|
+
H -- No --> J[Allow full update]
|
|
35
|
+
I --> E
|
|
36
|
+
J --> E
|
|
37
|
+
F -- No --> K{Delete requested?}
|
|
38
|
+
K -- Yes --> L{Account in DRAFT status?}
|
|
39
|
+
L -- No --> M[Reject deletion — must deactivate instead]
|
|
40
|
+
L -- Yes --> L2{Account has posted transactions?}
|
|
41
|
+
L2 -- Yes --> M
|
|
42
|
+
L2 -- No --> N[Delete account]
|
|
43
|
+
K -- No --> O[Read / List / Filter accounts]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```mermaid
|
|
47
|
+
flowchart TD
|
|
48
|
+
subgraph Code Structure
|
|
49
|
+
A1[1000-1999: ASSET] --> A2[2000-2999: LIABILITY]
|
|
50
|
+
A2 --> A3[3000-3999: EQUITY]
|
|
51
|
+
A3 --> A4[4000-4999: REVENUE]
|
|
52
|
+
A4 --> A5[5000-5999: EXPENSE]
|
|
53
|
+
end
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Scenario Patterns
|
|
57
|
+
|
|
58
|
+
- **Standard Account Creation**: A finance team sets up a new CoA and creates GL accounts following the structured numbering convention — cash at 1010 (BANK_CASH), accounts receivable at 1200 (RECEIVABLE), accounts payable at 2100 (PAYABLE), retained earnings at 3100 (RETAINED_EARNINGS), sales revenue at 4000 (REGULAR), and office supplies expense at 5200 (REGULAR)
|
|
59
|
+
- **Foreign Currency Bank Account**: A treasury team creates a bank account (ASSET, BANK_CASH, code 1015) with a currency restriction set to USD, ensuring only USD-denominated entries can be posted to it
|
|
60
|
+
- **Reconcilable Receivable Account**: An accounts receivable control account (ASSET, RECEIVABLE, code 1200) is created with the reconciliation flag enabled, allowing individual customer invoice and payment lines to be matched and cleared. The RECEIVABLE classification marks it as the AR sub-ledger control account
|
|
61
|
+
- **Non-Posting Control Account**: A clearing or suspense account (ASSET, NON_POSTING, code 1000) is created with the NON_POSTING classification, marking it as excluded from journal entry posting. This is strictly a postability control — it prevents the account from being selected as a target in journal entries. Structural grouping, subtotals, and report labels are owned by account groups and downstream reporting modules, not by account classification
|
|
62
|
+
- **Tax-Defaulted Revenue Account**: A domestic sales revenue account (REVENUE, REGULAR, code 4010) is created with a default tax code referencing the standard VAT rate, so journal lines hitting this account auto-populate the correct tax treatment
|
|
63
|
+
- **Tagged Intercompany Account**: An intercompany receivable account is created with RECEIVABLE classification and tagged with "intercompany" to enable cross-entity elimination reports without relying solely on account code ranges
|
|
64
|
+
- **Retained Earnings Account**: An equity account (EQUITY, RETAINED_EARNINGS, code 3100) is designated to receive the net income roll-forward at period close. Only one account per CoA should carry this classification
|
|
65
|
+
- **Fixed Asset Account**: Equipment account (ASSET, FIXED_ASSET, code 1500) is created with the FIXED_ASSET classification, enabling future integration with the fixed-asset module for depreciation scheduling
|
|
66
|
+
- **Account Group Assignment**: Multiple expense accounts (5100 salaries, 5200 rent, 5300 utilities) are assigned to an "Operating Expenses" account group for hierarchical organization
|
|
67
|
+
- **Blocked Manual Posting to Control Account**: A user attempts to create a manual journal entry debiting the AR control account (1200, RECEIVABLE); the posting is rejected because RECEIVABLE accounts only accept automated sub-ledger postings from the AR module
|
|
68
|
+
- **Prevented Deletion of Active Account**: An attempt to delete account 1010 (cash), which is in ACTIVE status, fails because only DRAFT accounts can be deleted; accounts with posted transactions must be deactivated instead
|
|
69
|
+
- **Prevented Structural Change on Posted Control Account**: An attempt to change the classification of account 2100 (PAYABLE) to REGULAR is rejected because the account has posted transactions; the PAYABLE classification is immutable after posting
|
|
70
|
+
- **Bulk Account Setup**: During initial CoA configuration, a batch of accounts is created from a template covering all five types with appropriate classifications, codes, names, and default attributes
|
|
71
|
+
|
|
72
|
+
## Test Cases
|
|
73
|
+
|
|
74
|
+
- Creating an account requires a valid parent CoA reference
|
|
75
|
+
- Account code must be unique within the same CoA
|
|
76
|
+
- Account code must be a structured numeric identifier and cannot be empty
|
|
77
|
+
- Account name is required and must be non-empty
|
|
78
|
+
- Account type must be one of ASSET, LIABILITY, EQUITY, REVENUE, or EXPENSE
|
|
79
|
+
- Account classification must be one of REGULAR, RECEIVABLE, PAYABLE, BANK_CASH, FIXED_ASSET, RETAINED_EARNINGS, or NON_POSTING
|
|
80
|
+
- Account classification defaults to REGULAR when not explicitly set
|
|
81
|
+
- Account classification must be compatible with account type: RECEIVABLE and BANK_CASH and FIXED_ASSET require type ASSET; PAYABLE requires type LIABILITY; RETAINED_EARNINGS requires type EQUITY; REGULAR and NON_POSTING are allowed with any account type
|
|
82
|
+
- NON_POSTING accounts cannot receive journal postings — downstream modules must exclude them from posting target selection. NON_POSTING is a postability attribute only; it does not imply parent-child relationships between accounts (hierarchy is owned by account groups)
|
|
83
|
+
- Only one account per CoA may carry the RETAINED_EARNINGS classification
|
|
84
|
+
- Currency restriction, when provided, must reference a valid currency from the primitives module
|
|
85
|
+
- An account with currency restriction only accepts postings in that currency
|
|
86
|
+
- Reconciliation flag defaults to false when not explicitly set for REGULAR, FIXED_ASSET, RETAINED_EARNINGS, and NON_POSTING classifications
|
|
87
|
+
- Accounts with RECEIVABLE, PAYABLE, or BANK_CASH classification must have reconciliation enabled; attempting to set reconciliation to false for these classifications is rejected
|
|
88
|
+
- Creating a RECEIVABLE or PAYABLE account automatically enforces reconciliation enabled as an invariant
|
|
89
|
+
- RECEIVABLE and PAYABLE accounts block direct manual journal postings; only sub-ledger module automated postings are permitted
|
|
90
|
+
- Attempting a direct manual journal posting to a RECEIVABLE or PAYABLE control account is rejected by downstream posting modules (this module marks the constraint; enforcement is at the GL/posting layer)
|
|
91
|
+
- Default tax code is an optional free-text identifier (validation against a tax configuration module is a future integration point)
|
|
92
|
+
- Tags are optional and may contain zero or more string labels
|
|
93
|
+
- An account can optionally belong to an account group within the same CoA
|
|
94
|
+
- Updating an account that has posted journal entries restricts changes to non-structural fields (name, tags, default tax code); structural fields (account code, account type, account classification, currency restriction) become immutable
|
|
95
|
+
- Updating account type, code, or classification is rejected when the account has posted transactions
|
|
96
|
+
- Changing account classification from RECEIVABLE or PAYABLE to any other classification is rejected once the account has posted transactions, preserving sub-ledger integrity
|
|
97
|
+
- Only DRAFT accounts with no posted transactions can be deleted (consistent with account lifecycle state machine)
|
|
98
|
+
- Deleting an ACTIVE or INACTIVE account is rejected regardless of transaction history; these accounts must be deactivated instead
|
|
99
|
+
- Deleting a DRAFT account that has posted transactions is rejected to preserve ledger integrity
|
|
100
|
+
- Listing accounts supports filtering by type, account group, tags, and currency restriction
|
|
101
|
+
- Accounts within a CoA can be retrieved sorted by account code
|
|
102
|
+
- Creating two accounts with the same code in the same CoA fails with a uniqueness constraint error
|
|
103
|
+
- Creating an account with a code outside valid numeric format fails validation
|
|
104
|
+
- Assigning an account to a group that belongs to a different CoA fails validation
|
|
105
|
+
- Creating an account emits an audit event via the audit module recording the acting user, timestamp, and initial field values
|
|
106
|
+
- Updating an account emits an audit event recording the previous and new field values for all changed attributes
|
|
107
|
+
- Deleting a DRAFT account emits an audit event recording the deletion and acting user
|
|
108
|
+
- Audit events for account operations include the CoA reference, account code, and account classification for traceability
|
|
109
|
+
|
|
110
|
+
## Reference Links
|
|
111
|
+
|
|
112
|
+
- [SAP GL Account Master Data](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee4e846b9aea4e78b6665038855e5148/4d9a976ecc0e7a30e10000000a15822b.html)
|
|
113
|
+
- [Odoo Chart of Accounts (account.account)](https://www.odoo.com/documentation/19.0/applications/finance/accounting/get_started/chart_of_accounts.html)
|
|
114
|
+
- [IFRS Conceptual Framework — Elements of Financial Statements](https://www.ifrs.org/issued-standards/list-of-standards/conceptual-framework/)
|