@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,64 @@
|
|
|
1
|
+
# UpdateDepartment
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
UpdateDepartment modifies the name or parent department of an existing department. The department code and company are immutable. Parent department changes are validated to prevent self-references and circular hierarchies. Updating is allowed on both ACTIVE and INACTIVE departments.
|
|
6
|
+
|
|
7
|
+
This command supports organizational restructuring and department renaming.
|
|
8
|
+
|
|
9
|
+
## Business Rules
|
|
10
|
+
|
|
11
|
+
- Department must exist
|
|
12
|
+
- Name, if provided, must be non-empty
|
|
13
|
+
- Department code cannot be changed
|
|
14
|
+
- companyId cannot be changed
|
|
15
|
+
- Parent department, if provided, must exist and belong to the same company
|
|
16
|
+
- A department cannot reference itself as its own parent
|
|
17
|
+
- Circular parent references are rejected
|
|
18
|
+
- Updating parent department is allowed on both ACTIVE and INACTIVE departments
|
|
19
|
+
|
|
20
|
+
## Process Flow
|
|
21
|
+
|
|
22
|
+
```mermaid
|
|
23
|
+
flowchart TD
|
|
24
|
+
A[Receive update request] --> B{Department exists?}
|
|
25
|
+
B -->|No| C[Return error: DEPARTMENT_NOT_FOUND]
|
|
26
|
+
B -->|Yes| D{Name provided and empty?}
|
|
27
|
+
D -->|Yes| E[Return error: INVALID_NAME]
|
|
28
|
+
D -->|No| F{Parent change requested?}
|
|
29
|
+
F -->|Yes| G{Self-reference?}
|
|
30
|
+
G -->|Yes| H[Return error: SELF_REFERENCE]
|
|
31
|
+
G -->|No| I{Parent exists in same company?}
|
|
32
|
+
I -->|No| J[Return error: PARENT_NOT_FOUND]
|
|
33
|
+
I -->|Yes| K{Circular reference?}
|
|
34
|
+
K -->|Yes| L[Return error: CIRCULAR_REFERENCE]
|
|
35
|
+
K -->|No| M[Update department record]
|
|
36
|
+
F -->|No| M
|
|
37
|
+
M --> N[Return updated department]
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## External Dependencies
|
|
41
|
+
|
|
42
|
+
- [organization::detectDepartmentCircularReference](../queries/DetectDepartmentCircularReference.md) - Validates that reparenting would not create a cycle
|
|
43
|
+
|
|
44
|
+
## Error Scenarios
|
|
45
|
+
|
|
46
|
+
- **DEPARTMENT_NOT_FOUND**: Specified department ID does not exist
|
|
47
|
+
- **INVALID_NAME**: Department name is empty
|
|
48
|
+
- **SELF_REFERENCE**: Department references itself as parent
|
|
49
|
+
- **PARENT_NOT_FOUND**: Referenced parent department does not exist or belongs to a different company
|
|
50
|
+
- **CIRCULAR_REFERENCE**: Reparenting would create a circular hierarchy
|
|
51
|
+
|
|
52
|
+
## Test Cases
|
|
53
|
+
|
|
54
|
+
- updates department name
|
|
55
|
+
- updates parent department
|
|
56
|
+
- removes parent department (promotes to top-level)
|
|
57
|
+
- throws when department does not exist
|
|
58
|
+
- throws when name is empty
|
|
59
|
+
- throws when name is whitespace-only
|
|
60
|
+
- throws when setting self as parent
|
|
61
|
+
- throws when parent does not exist
|
|
62
|
+
- throws when parent belongs to different company
|
|
63
|
+
- throws when reparenting creates circular reference
|
|
64
|
+
- updates parent on INACTIVE department
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# UpdateSite
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
UpdateSite modifies fields on an existing site. Updatable fields include name, type, address fields, country, and timezone. The companyId is immutable after creation. Updating is permitted on both ACTIVE and INACTIVE sites.
|
|
6
|
+
|
|
7
|
+
This command supports address corrections, type reclassification, and timezone updates.
|
|
8
|
+
|
|
9
|
+
## Business Rules
|
|
10
|
+
|
|
11
|
+
- Site must exist
|
|
12
|
+
- Name, if provided, must be non-empty
|
|
13
|
+
- Name, if changed, must remain unique within the same company
|
|
14
|
+
- Type, if provided, must be one of the allowed classifications
|
|
15
|
+
- companyId cannot be changed
|
|
16
|
+
- Timezone, if provided, must be a valid IANA timezone identifier
|
|
17
|
+
- Country, if provided, must reference a valid country code
|
|
18
|
+
- Address fields can be individually updated
|
|
19
|
+
- Required address fields (street, city, postalCode, country), if provided, must be non-empty
|
|
20
|
+
- State/province is optional and may be set or cleared
|
|
21
|
+
- Updating is allowed on both ACTIVE and INACTIVE sites
|
|
22
|
+
|
|
23
|
+
## Process Flow
|
|
24
|
+
|
|
25
|
+
```mermaid
|
|
26
|
+
flowchart TD
|
|
27
|
+
A[Receive update request] --> B{Site exists?}
|
|
28
|
+
B -->|No| C[Return error: SITE_NOT_FOUND]
|
|
29
|
+
B -->|Yes| D{Name provided and empty?}
|
|
30
|
+
D -->|Yes| E[Return error: INVALID_NAME]
|
|
31
|
+
D -->|No| F{Name changed?}
|
|
32
|
+
F -->|Yes| G{Name unique in company?}
|
|
33
|
+
G -->|No| H[Return error: DUPLICATE_NAME]
|
|
34
|
+
G -->|Yes| I{Type valid?}
|
|
35
|
+
F -->|No| I
|
|
36
|
+
I -->|Invalid| J[Return error: INVALID_TYPE]
|
|
37
|
+
I -->|Valid or unchanged| I2{Required address field set to empty?}
|
|
38
|
+
I2 -->|Yes| I3[Return error: MISSING_REQUIRED_FIELDS]
|
|
39
|
+
I2 -->|No| K{Country valid?}
|
|
40
|
+
K -->|Invalid| K2[Return error: INVALID_COUNTRY]
|
|
41
|
+
K -->|Valid or unchanged| L{Timezone valid?}
|
|
42
|
+
L -->|Invalid| L2[Return error: INVALID_TIMEZONE]
|
|
43
|
+
L -->|Valid or unchanged| M[Update site record]
|
|
44
|
+
M --> N[Return updated site]
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## External Dependencies
|
|
48
|
+
|
|
49
|
+
- None
|
|
50
|
+
|
|
51
|
+
## Error Scenarios
|
|
52
|
+
|
|
53
|
+
- **SITE_NOT_FOUND**: Specified site ID does not exist
|
|
54
|
+
- **INVALID_NAME**: Site name is empty
|
|
55
|
+
- **DUPLICATE_NAME**: Site with same name already exists in the same company
|
|
56
|
+
- **INVALID_TYPE**: Site type is not one of the allowed classifications
|
|
57
|
+
- **MISSING_REQUIRED_FIELDS**: A required address field (street, city, postalCode, or country) was set to empty
|
|
58
|
+
- **INVALID_COUNTRY**: Country code is not a valid country code
|
|
59
|
+
- **INVALID_TIMEZONE**: Timezone is not a valid IANA timezone identifier
|
|
60
|
+
|
|
61
|
+
## Test Cases
|
|
62
|
+
|
|
63
|
+
- updates site name
|
|
64
|
+
- updates site address fields
|
|
65
|
+
- updates site type
|
|
66
|
+
- updates site timezone
|
|
67
|
+
- throws when site does not exist
|
|
68
|
+
- throws when name is empty
|
|
69
|
+
- throws when name already exists in same company
|
|
70
|
+
- throws when type is invalid
|
|
71
|
+
- throws when country code is invalid
|
|
72
|
+
- throws when timezone is invalid
|
|
73
|
+
- updates site country
|
|
74
|
+
- throws when street is set to empty
|
|
75
|
+
- throws when city is set to empty
|
|
76
|
+
- throws when postalCode is set to empty
|
|
77
|
+
- throws when country is set to empty
|
|
78
|
+
- updates state/province field
|
|
79
|
+
- clears state/province field
|
|
80
|
+
- updates address fields on INACTIVE site
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Company Lifecycle
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Companies are the root organizational entity in the Organization module. A company represents a legal entity — identified by its legal name, tax identification number, and registration number, along with its registered address and base currency assignment. Companies serve as the scoping entity for all transactional modules; every accounting entry, sales order, purchase order, and inventory movement belongs to exactly one company. Each company has a lifecycle state machine (DRAFT → ACTIVE ↔ INACTIVE) that controls when transactional operations and downstream module integrations are permitted. Fiscal calendar management (fiscal year, periods, cutoff dates) is owned by the accounting module — organization only provides the structural identity that accounting attaches fiscal configuration to.
|
|
6
|
+
|
|
7
|
+
## Business Purpose
|
|
8
|
+
|
|
9
|
+
Companies model real-world legal entities that enter contracts, hold tax identities, and prepare financial statements. This enables:
|
|
10
|
+
|
|
11
|
+
- Multi-company support with data isolation: each transactional record is scoped by companyId
|
|
12
|
+
- Separation of legal entity setup from day-to-day operations — companies are fully configured before going live
|
|
13
|
+
- Assignment of a base/functional currency per company (referencing the primitives module's Currency), ensuring consistent monetary calculations. Currency master data (ISO codes, symbols, exchange rates) is owned by the primitives module; organization only stores which currency a company uses as its base currency
|
|
14
|
+
|
|
15
|
+
The lifecycle ensures:
|
|
16
|
+
|
|
17
|
+
- Companies are reviewed and fully configured before downstream modules can reference them (DRAFT → ACTIVE). Activation means the structural identity (legal name, tax ID, registered address, base currency) is complete — it does not imply transactional readiness. Downstream master-data modules (e.g., CoA management) and transactional modules each enforce their own readiness gates on top of company ACTIVE status
|
|
18
|
+
- Inactive companies stop accepting new transactions while preserving all historical data
|
|
19
|
+
- Only DRAFT companies can be permanently deleted; ACTIVE/INACTIVE companies are preserved for audit and legal compliance
|
|
20
|
+
|
|
21
|
+
## Process Flow
|
|
22
|
+
|
|
23
|
+
```mermaid
|
|
24
|
+
stateDiagram-v2
|
|
25
|
+
[*] --> Draft: createCompany
|
|
26
|
+
Draft --> Active: activateCompany
|
|
27
|
+
Active --> Inactive: deactivateCompany
|
|
28
|
+
Inactive --> Active: reactivateCompany
|
|
29
|
+
Draft --> [*]: deleteCompany
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The company creation and setup flow follows this pattern:
|
|
33
|
+
|
|
34
|
+
```mermaid
|
|
35
|
+
flowchart TD
|
|
36
|
+
A[Create Company] --> B[Set Legal Details]
|
|
37
|
+
B --> C[Configure Registered Address]
|
|
38
|
+
C --> D[Assign Base Currency]
|
|
39
|
+
D --> E{Ready to go live?}
|
|
40
|
+
E -->|Yes| F[Activate Company]
|
|
41
|
+
E -->|No| G[Continue editing]
|
|
42
|
+
G --> B
|
|
43
|
+
F --> H[Available for Transactions]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Scenario Patterns
|
|
47
|
+
|
|
48
|
+
- **New Company Setup**: A company is created in DRAFT with its legal name and tax identification number. The registered address and base currency are configured, then the company is activated to confirm its structural identity is complete. After activation, master-data modules (e.g., CoA management) can begin building financial configuration on top of the company. Transactional readiness (e.g., journal posting) requires additional setup: an active Chart of Accounts and fiscal calendar configuration
|
|
49
|
+
- **Company Deactivation**: A legal entity ceases operations. The company moves to INACTIVE status, preventing new transactions from being created against it, but all historical records remain accessible for reporting and audit
|
|
50
|
+
- **Company Reactivation**: A previously inactive company resumes operations and is reactivated, allowing new transactions to be recorded against it
|
|
51
|
+
- **Draft Cleanup**: Incomplete company records in DRAFT are deleted before activation when a planned legal entity is no longer needed
|
|
52
|
+
- **Multi-Company Expansion**: A new subsidiary is added to the system as a separate company with its own base currency, enabling consolidated reporting across legal entities. Fiscal calendar for the subsidiary is configured independently via the accounting module
|
|
53
|
+
|
|
54
|
+
## Test Cases
|
|
55
|
+
|
|
56
|
+
- Company lifecycle follows DRAFT → ACTIVE ↔ INACTIVE state machine
|
|
57
|
+
- Companies can only be created in DRAFT status
|
|
58
|
+
- Only DRAFT companies can be deleted; ACTIVE and INACTIVE companies cannot
|
|
59
|
+
- Legal name is required and must be non-empty
|
|
60
|
+
- Tax identification number is stored and queryable per company
|
|
61
|
+
- Registration number is stored per company
|
|
62
|
+
- Base currency is optional at creation but must be set and reference a valid Currency from the primitives module before activation
|
|
63
|
+
- Base currency is immutable after activation to preserve transactional consistency
|
|
64
|
+
- Registered address fields are required before activation
|
|
65
|
+
- Activating a company without required fields (legal name, base currency, registered address) is rejected
|
|
66
|
+
- Deactivating a company does not affect existing historical transactions
|
|
67
|
+
- Reactivating an INACTIVE company returns it to ACTIVE status
|
|
68
|
+
- Each company has a unique companyId used for data isolation across transactional modules
|
|
69
|
+
- Deleting an ACTIVE or INACTIVE company returns an error
|
|
70
|
+
|
|
71
|
+
## Reference Links
|
|
72
|
+
|
|
73
|
+
- [SAP Business One Company Setup](https://help.sap.com/docs/SAP_BUSINESS_ONE)
|
|
74
|
+
- [Odoo Multi-Company](https://www.odoo.com/documentation/19.0/applications/general/companies.html)
|
|
75
|
+
- [Dynamics 365 Legal Entities](https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/fin-ops/organization-administration/plan-organizational-hierarchy)
|
|
76
|
+
- [Oracle Financials Legal Entity Configuration](https://docs.oracle.com/en/cloud/saas/financials/24d/faigl/legal-entities.html)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Department Management
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Departments represent functional organizational units within a company — such as Sales, Engineering, Finance, and Human Resources. Each department belongs to exactly one company and is identified by a unique code scoped to that company. Departments form a self-referential hierarchy through an optional parent department reference, enabling the modeling of organizational trees (e.g., Engineering > Backend Engineering > Platform Team). Each department carries a lifecycle state of ACTIVE or INACTIVE and a human-readable name. Departments serve as the primary structural unit for grouping business functions and are referenced by downstream modules. Manager assignment is owned by a future HR/employee module where the manager is an employee/worker reference, not a login identity.
|
|
6
|
+
|
|
7
|
+
## Business Purpose
|
|
8
|
+
|
|
9
|
+
Departments provide the foundational organizational structure that other modules build upon. This enables:
|
|
10
|
+
|
|
11
|
+
- Modeling the functional structure of a company as a hierarchical tree
|
|
12
|
+
- Scoping operational data (budgets, headcount, approvals) to specific organizational units
|
|
13
|
+
- Deactivating departments that are no longer in use without losing historical references
|
|
14
|
+
- Enforcing unique department codes per company for reliable cross-system integration
|
|
15
|
+
|
|
16
|
+
## Process Flow
|
|
17
|
+
|
|
18
|
+
```mermaid
|
|
19
|
+
flowchart TD
|
|
20
|
+
A[Create Department] --> B{Has parent?}
|
|
21
|
+
B -->|Yes| C[Set parent department]
|
|
22
|
+
B -->|No| D[Top-level department]
|
|
23
|
+
C --> E[Department ACTIVE]
|
|
24
|
+
D --> E
|
|
25
|
+
E --> F{Restructure needed?}
|
|
26
|
+
F -->|Reassign parent| G[Update parent reference]
|
|
27
|
+
G --> E
|
|
28
|
+
F -->|No longer needed| H{Has active sub-departments?}
|
|
29
|
+
H -->|Yes| I[Block deactivation]
|
|
30
|
+
I --> F
|
|
31
|
+
H -->|No| J[Deactivate Department]
|
|
32
|
+
J --> K[Department INACTIVE]
|
|
33
|
+
K --> L{Reactivate?}
|
|
34
|
+
L -->|Yes| E
|
|
35
|
+
L -->|No| M[Remains INACTIVE]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Scenario Patterns
|
|
39
|
+
|
|
40
|
+
- **Initial Org Structure Setup**: A company is created and its top-level departments (Sales, Engineering, Finance, HR) are added as ACTIVE departments with no parent. Sub-departments are then created beneath them to reflect the real organizational hierarchy.
|
|
41
|
+
- **Department Restructuring**: A reorganization moves the "DevOps" department from under "Engineering" to under "Infrastructure" by updating its parent department reference. All sub-departments of DevOps move with it implicitly through the hierarchy.
|
|
42
|
+
- **Department Deactivation**: The "Legacy Products" department is no longer needed. After confirming it has no active sub-departments, it is set to INACTIVE. Historical records that reference this department remain intact.
|
|
43
|
+
- **Department Reactivation**: A previously deactivated "Partnerships" department is reactivated when the company re-enters a market segment, restoring it to ACTIVE status for new assignments.
|
|
44
|
+
- **Cross-Company Isolation**: Two companies in the same tenant each have a department with code "ENG". The codes are unique per company but do not conflict across companies.
|
|
45
|
+
|
|
46
|
+
## Test Cases
|
|
47
|
+
|
|
48
|
+
- A department is created in ACTIVE status by default
|
|
49
|
+
- Department code is required, unique per company, and immutable after creation
|
|
50
|
+
- Department name is required and must be non-empty
|
|
51
|
+
- A department must reference an existing, valid company
|
|
52
|
+
- Setting a parent department creates a hierarchical relationship
|
|
53
|
+
- A department cannot reference itself as its own parent
|
|
54
|
+
- A department cannot be deactivated while it has active sub-departments
|
|
55
|
+
- Deactivating a department sets its state to INACTIVE
|
|
56
|
+
- Reactivating an INACTIVE department sets its state to ACTIVE
|
|
57
|
+
- Updating a department's parent department is allowed on both ACTIVE and INACTIVE departments
|
|
58
|
+
- Department codes from different companies do not conflict (company-scoped uniqueness)
|
|
59
|
+
- Circular parent references are rejected (A -> B -> C -> A)
|
|
60
|
+
- Deleting a company is restricted (rejected) if it has existing department references
|
|
61
|
+
|
|
62
|
+
## Reference Links
|
|
63
|
+
|
|
64
|
+
- [SAP Organizational Units](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/5765fa03d4c34ae7b8965e7a41d7c077/af204256a1f84457b2c3f16825e6af89.html)
|
|
65
|
+
- [Odoo Departments (HR)](https://www.odoo.com/documentation/19.0/applications/hr/employees/departments.html)
|
|
66
|
+
- [Dynamics 365 Operating Units](https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/fin-ops/organization-administration/organizations-organizational-hierarchies)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Site Management
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Sites represent physical facilities owned or operated by a company — offices, warehouses, stores, factories, and distribution centers. Each site is scoped to a single company (companyId) and stores a structured address (street, city, postalCode, country, and optional state/province), a type classification, timezone, and a lifecycle state. Sites provide the geographic foundation that downstream modules depend on: inventory uses sites to determine where stock is held, sales and purchasing reference sites for ship-from and ship-to addresses, and tax modules reference sites for jurisdiction determination.
|
|
6
|
+
|
|
7
|
+
Unlike business-partner addresses (which represent external parties' billing and shipping details), sites model company-owned facilities only. The organization module owns the physical site definition; storage layout concerns (zones, bins, aisles) belong to future warehouse modules that use `Warehouse`/`StorageLocation` entities referencing a site. Organization uses "Site" to mean a company-owned physical facility; warehouse modules use "Warehouse" and "StorageLocation" for internal storage layout within a site.
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
Sites bridge the gap between the legal entity (company) and its physical presence. This enables:
|
|
12
|
+
|
|
13
|
+
- Geographic scoping of operations: each warehouse, office, or store is a distinct addressable entity
|
|
14
|
+
- Structured address storage for consistent formatting, postal validation, and country-specific address rules
|
|
15
|
+
- Type classification (office, warehouse, store, factory, distribution center) to distinguish facility purposes
|
|
16
|
+
- Timezone assignment per site for scheduling, cutoff times, and local reporting
|
|
17
|
+
- Country assignment for tax jurisdiction determination and regulatory compliance
|
|
18
|
+
- A reference point for inventory (stock-on-hand at a site), shipping (origin/destination), and purchasing (delivery destination)
|
|
19
|
+
|
|
20
|
+
The lifecycle ensures:
|
|
21
|
+
|
|
22
|
+
- Sites are either ACTIVE (available for operational reference) or INACTIVE (no longer in use but preserved for historical records)
|
|
23
|
+
- Inactivating a site prevents new inventory movements and order references while preserving all historical data
|
|
24
|
+
- Sites have no DRAFT state — they are operational entities created ready for use
|
|
25
|
+
|
|
26
|
+
## Process Flow
|
|
27
|
+
|
|
28
|
+
```mermaid
|
|
29
|
+
stateDiagram-v2
|
|
30
|
+
[*] --> Active: createSite
|
|
31
|
+
Active --> Inactive: deactivateSite
|
|
32
|
+
Inactive --> Active: reactivateSite
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The site creation and configuration flow follows this pattern:
|
|
36
|
+
|
|
37
|
+
```mermaid
|
|
38
|
+
flowchart TD
|
|
39
|
+
A[Create Site] --> B[Set Name & Type]
|
|
40
|
+
B --> C[Enter Structured Address]
|
|
41
|
+
C --> D[Assign Country & Timezone]
|
|
42
|
+
D --> E[Activate for Operations]
|
|
43
|
+
E --> F{Site no longer needed?}
|
|
44
|
+
F -->|Yes| G[Deactivate Site]
|
|
45
|
+
F -->|No| H[Site remains ACTIVE]
|
|
46
|
+
G --> I{Reopen facility?}
|
|
47
|
+
I -->|Yes| J[Reactivate Site]
|
|
48
|
+
I -->|No| K[Site remains INACTIVE]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Scenario Patterns
|
|
52
|
+
|
|
53
|
+
- **New Warehouse Site**: A company opens a new distribution warehouse. A site is created with type WAREHOUSE, the full structured address, country, and the local timezone. Once created, inventory and shipping modules can reference it as a stock-holding and ship-from facility
|
|
54
|
+
- **Office Registration**: A company registers its headquarters as a site with type OFFICE. The address and country are recorded for legal correspondence and tax jurisdiction purposes
|
|
55
|
+
- **Store Opening**: A retail company opens a new storefront. A site of type STORE is created with the store's physical address, enabling point-of-sale and local inventory tracking
|
|
56
|
+
- **Facility Closure**: A factory is shut down permanently. The site is deactivated, preventing new inventory or orders from referencing it, while all historical transactions tied to the site remain intact
|
|
57
|
+
- **Facility Reopening**: A previously closed warehouse site is reopened for seasonal demand. The site is reactivated, making it available again for inventory and shipping operations
|
|
58
|
+
- **Multi-Site Expansion**: A company expands internationally by adding sites in new countries, each with the appropriate country code and timezone, enabling localized tax and regulatory compliance
|
|
59
|
+
- **Address Correction**: A site's street address or postal code is updated to correct a data entry error. The structured address fields are individually updatable without affecting the site's identity or references
|
|
60
|
+
|
|
61
|
+
## Test Cases
|
|
62
|
+
|
|
63
|
+
- Sites are created in ACTIVE status (no DRAFT state)
|
|
64
|
+
- Site lifecycle follows ACTIVE ↔ INACTIVE state machine
|
|
65
|
+
- Site name is required and must be non-empty
|
|
66
|
+
- Site type is required and must be one of the allowed classifications (e.g., OFFICE, WAREHOUSE, STORE, FACTORY, DISTRIBUTION_CENTER)
|
|
67
|
+
- Each site is scoped to exactly one companyId
|
|
68
|
+
- The referenced company must exist and be in ACTIVE status
|
|
69
|
+
- Structured address fields (street, city, postal code, country) are required at creation
|
|
70
|
+
- Country field is required and must reference a valid country code
|
|
71
|
+
- Timezone is required and must be a valid IANA timezone identifier
|
|
72
|
+
- A site's companyId is immutable after creation
|
|
73
|
+
- Updating address fields on an ACTIVE site is permitted
|
|
74
|
+
- Deactivating a site does not delete or modify historical transactions referencing it
|
|
75
|
+
- Reactivating an INACTIVE site returns it to ACTIVE status
|
|
76
|
+
- Attempting to create a site under a non-existent or INACTIVE company is rejected
|
|
77
|
+
- Site deletion is not supported; sites are deactivated instead to preserve referential integrity with downstream records (inventory, orders)
|
|
78
|
+
- Multiple sites can exist for the same company
|
|
79
|
+
- Site name uniqueness is enforced within the same companyId scope
|
|
80
|
+
|
|
81
|
+
## Reference Links
|
|
82
|
+
|
|
83
|
+
- [Odoo Branches / Multi-Location](https://www.odoo.com/documentation/19.0/applications/general/companies.html)
|
|
84
|
+
- [Dynamics 365 Sites and Warehouses](https://learn.microsoft.com/en-us/dynamics365/supply-chain/warehousing/warehouse-configuration)
|
|
85
|
+
- [SAP Business One Warehouses](https://help.sap.com/docs/SAP_BUSINESS_ONE)
|
|
86
|
+
- [Oracle SCM Locations](https://docs.oracle.com/en/cloud/saas/supply-chain-management/24d/fadmm/manage-locations.html)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Company
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
Company represents a legal entity in the ERP system — identified by its legal name, tax identification number, registration number, and registered address. Each company is assigned a base currency from the primitives module and serves as the root scoping entity for all transactional modules. Every accounting entry, sales order, purchase order, and inventory movement belongs to exactly one company. Companies follow a lifecycle state machine (DRAFT → ACTIVE ↔ INACTIVE) that controls when transactional operations are permitted.
|
|
6
|
+
|
|
7
|
+
Examples: "Acme Corp" (active manufacturing company), "Beta Ltd" (draft subsidiary being configured).
|
|
8
|
+
|
|
9
|
+
## Domain Model Definitions
|
|
10
|
+
|
|
11
|
+
### Model type
|
|
12
|
+
|
|
13
|
+
Stateful
|
|
14
|
+
|
|
15
|
+
#### State Transitions
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
stateDiagram-v2
|
|
19
|
+
[*] --> Draft: createCompany
|
|
20
|
+
Draft --> Active: activateCompany
|
|
21
|
+
Active --> Inactive: deactivateCompany
|
|
22
|
+
Inactive --> Active: reactivateCompany
|
|
23
|
+
Draft --> [*]: deleteCompany
|
|
24
|
+
note right of Draft: Only DRAFT companies can be deleted
|
|
25
|
+
note right of Active: Base currency is immutable after activation
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Command Definitions
|
|
29
|
+
|
|
30
|
+
- [createCompany](../commands/CreateCompany.md) - Create a new company in DRAFT status
|
|
31
|
+
- [updateCompany](../commands/UpdateCompany.md) - Modify company fields (legal name, address, tax ID, etc.)
|
|
32
|
+
- [activateCompany](../commands/ActivateCompany.md) - Transition company from DRAFT to ACTIVE
|
|
33
|
+
- [deactivateCompany](../commands/DeactivateCompany.md) - Transition company from ACTIVE to INACTIVE
|
|
34
|
+
- [reactivateCompany](../commands/ReactivateCompany.md) - Transition company from INACTIVE to ACTIVE
|
|
35
|
+
- [deleteCompany](../commands/DeleteCompany.md) - Permanently remove a DRAFT company
|
|
36
|
+
|
|
37
|
+
### Query Definitions
|
|
38
|
+
|
|
39
|
+
- [getCompany](../queries/GetCompany.md) - Retrieve a company by ID
|
|
40
|
+
|
|
41
|
+
### Models
|
|
42
|
+
|
|
43
|
+
- Company
|
|
44
|
+
|
|
45
|
+
### Invariants
|
|
46
|
+
|
|
47
|
+
- Legal name is required and must be non-empty
|
|
48
|
+
- Base currency is optional at creation but must reference a valid Currency from the primitives module before activation
|
|
49
|
+
- Base currency is immutable after activation (ACTIVE or INACTIVE state)
|
|
50
|
+
- Only DRAFT companies can be permanently deleted; ACTIVE and INACTIVE companies are preserved for audit
|
|
51
|
+
- Deleting a DRAFT company is rejected (restrict) if it has existing departments or sites referencing it
|
|
52
|
+
- Registered address fields (street, city, postalCode, country) are required before activation
|
|
53
|
+
- Each company has a unique system-generated ID used for data isolation across transactional modules
|
|
54
|
+
|
|
55
|
+
### Relationships
|
|
56
|
+
|
|
57
|
+
- **References Currency (cross-module)**: Company references a Currency from the primitives module as its base currency via baseCurrencyId
|
|
58
|
+
- **Referenced By Department**: Departments belong to exactly one company via companyId
|
|
59
|
+
- **Referenced By Site**: Sites belong to exactly one company via companyId
|
|
60
|
+
- **Referenced By Transactions**: Company is used as scoping entity across all transactional modules (accounting, sales, purchasing, inventory)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Department
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
Department represents a functional organizational unit within a company — such as Sales, Engineering, Finance, or Human Resources. Each department belongs to exactly one company and is identified by a unique code scoped to that company. Departments form a self-referential hierarchy through an optional parent department reference, enabling the modeling of organizational trees (e.g., Engineering > Backend Engineering > Platform Team). Manager assignment is deferred to a future HR/employee module.
|
|
6
|
+
|
|
7
|
+
Examples: "ENG" (Engineering), "FIN" (Finance), "ENG-BE" (Backend Engineering under Engineering).
|
|
8
|
+
|
|
9
|
+
## Domain Model Definitions
|
|
10
|
+
|
|
11
|
+
### Model type
|
|
12
|
+
|
|
13
|
+
Stateful
|
|
14
|
+
|
|
15
|
+
#### State Transitions
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
stateDiagram-v2
|
|
19
|
+
[*] --> Active: createDepartment
|
|
20
|
+
Active --> Inactive: deactivateDepartment
|
|
21
|
+
Inactive --> Active: reactivateDepartment
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Command Definitions
|
|
25
|
+
|
|
26
|
+
- [createDepartment](../commands/CreateDepartment.md) - Create a new department in ACTIVE status
|
|
27
|
+
- [updateDepartment](../commands/UpdateDepartment.md) - Update department name or parent department
|
|
28
|
+
- [deactivateDepartment](../commands/DeactivateDepartment.md) - Transition department from ACTIVE to INACTIVE
|
|
29
|
+
- [reactivateDepartment](../commands/ReactivateDepartment.md) - Transition department from INACTIVE to ACTIVE
|
|
30
|
+
|
|
31
|
+
### Query Definitions
|
|
32
|
+
|
|
33
|
+
- [getDepartment](../queries/GetDepartment.md) - Retrieve a department by ID or code
|
|
34
|
+
- [getDepartmentChildren](../queries/GetDepartmentChildren.md) - Retrieve direct child departments of a given department
|
|
35
|
+
- [detectDepartmentCircularReference](../queries/DetectDepartmentCircularReference.md) - Validate that reparenting would not create a cycle
|
|
36
|
+
- [listDepartmentsByCompany](../queries/ListDepartmentsByCompany.md) - List all departments for a given company
|
|
37
|
+
|
|
38
|
+
### Models
|
|
39
|
+
|
|
40
|
+
- Department
|
|
41
|
+
|
|
42
|
+
### Invariants
|
|
43
|
+
|
|
44
|
+
- Department code is required, unique per company, and immutable after creation
|
|
45
|
+
- Department name is required and must be non-empty
|
|
46
|
+
- A department must reference an existing, valid company
|
|
47
|
+
- A department cannot reference itself as its own parent
|
|
48
|
+
- Circular parent references are rejected (A → B → C → A)
|
|
49
|
+
- A department cannot be deactivated while it has active sub-departments
|
|
50
|
+
- Updating a department's parent is allowed in both ACTIVE and INACTIVE states
|
|
51
|
+
- Department codes from different companies do not conflict (company-scoped uniqueness)
|
|
52
|
+
|
|
53
|
+
### Relationships
|
|
54
|
+
|
|
55
|
+
- **Belongs To Company**: Each department references exactly one Company via companyId
|
|
56
|
+
- **Self-Referential Parent-Child**: Each department optionally references another Department as its parent via parentDepartmentId, forming a tree hierarchy
|
|
57
|
+
- **Referenced By Downstream Modules**: Departments are referenced by future modules for cost allocation, approval workflows, and reporting
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Site
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
Site represents a physical facility owned or operated by a company — offices, warehouses, stores, factories, and distribution centers. Each site is scoped to a single company and stores a structured address (street, city, state/province, postal code, country), type classification, timezone, and lifecycle state. Sites provide the geographic foundation that downstream modules depend on: inventory uses sites to determine where stock is held, sales and purchasing reference sites for ship-from and ship-to addresses, and tax modules reference sites for jurisdiction determination.
|
|
6
|
+
|
|
7
|
+
Examples: "Tokyo HQ" (OFFICE), "Osaka Warehouse" (WAREHOUSE), "Shibuya Store" (STORE).
|
|
8
|
+
|
|
9
|
+
## Domain Model Definitions
|
|
10
|
+
|
|
11
|
+
### Model type
|
|
12
|
+
|
|
13
|
+
Stateful
|
|
14
|
+
|
|
15
|
+
#### State Transitions
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
stateDiagram-v2
|
|
19
|
+
[*] --> Active: createSite
|
|
20
|
+
Active --> Inactive: deactivateSite
|
|
21
|
+
Inactive --> Active: reactivateSite
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Command Definitions
|
|
25
|
+
|
|
26
|
+
- [createSite](../commands/CreateSite.md) - Create a new site in ACTIVE status
|
|
27
|
+
- [updateSite](../commands/UpdateSite.md) - Update site name, address, type, or timezone
|
|
28
|
+
- [deactivateSite](../commands/DeactivateSite.md) - Transition site from ACTIVE to INACTIVE
|
|
29
|
+
- [reactivateSite](../commands/ReactivateSite.md) - Transition site from INACTIVE to ACTIVE
|
|
30
|
+
|
|
31
|
+
### Query Definitions
|
|
32
|
+
|
|
33
|
+
- [getSite](../queries/GetSite.md) - Retrieve a site by ID
|
|
34
|
+
- [listSitesByCompany](../queries/ListSitesByCompany.md) - List all sites for a given company
|
|
35
|
+
|
|
36
|
+
### Models
|
|
37
|
+
|
|
38
|
+
- Site
|
|
39
|
+
|
|
40
|
+
### Invariants
|
|
41
|
+
|
|
42
|
+
- Site name is required, non-empty, and unique within the same company
|
|
43
|
+
- Site type is required and must be one of: OFFICE, WAREHOUSE, STORE, FACTORY, DISTRIBUTION_CENTER
|
|
44
|
+
- Structured address fields (street, city, postalCode, country) are required at creation
|
|
45
|
+
- State/province is optional (not all countries use states or provinces)
|
|
46
|
+
- Country must reference a valid country code
|
|
47
|
+
- Timezone is required and must be a valid IANA timezone identifier
|
|
48
|
+
- companyId is immutable after creation
|
|
49
|
+
- The referenced company must exist and be in ACTIVE status at creation time
|
|
50
|
+
- Site deletion is not supported; deactivation is used instead to preserve referential integrity with downstream records
|
|
51
|
+
|
|
52
|
+
### Relationships
|
|
53
|
+
|
|
54
|
+
- **Belongs To Company**: Each site references exactly one Company via companyId
|
|
55
|
+
- **Referenced By Warehouse (future)**: Future warehouse modules will reference sites for storage layout (Warehouse/StorageLocation entities)
|
|
56
|
+
- **Referenced By Inventory**: Sites are referenced by inventory for stock-on-hand tracking
|
|
57
|
+
- **Referenced By Sales/Purchasing**: Sites are referenced as ship-from and delivery destinations
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# DetectDepartmentCircularReference
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
DetectDepartmentCircularReference validates that reparenting a department would not create a circular reference in the hierarchy. It walks up the ancestor chain from the proposed new parent, checking whether the department being moved appears as an ancestor. If the moved department is found in the ancestor chain, the move would create a cycle.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- A department cannot be moved to become a descendant of itself
|
|
10
|
+
- Self-referencing is explicitly rejected: newParentId === departmentId
|
|
11
|
+
- Ancestor chain is traversed from the new parent upward to the root
|
|
12
|
+
- If the moved department's ID is found in the ancestor chain, the move is circular
|
|
13
|
+
- Traversal stops at root (parentDepartmentId = null) or broken chain (parent not found)
|
|
14
|
+
- Only relevant when newParentId is non-null (promoting to root cannot create a cycle)
|
|
15
|
+
|
|
16
|
+
## Process Flow
|
|
17
|
+
|
|
18
|
+
```mermaid
|
|
19
|
+
flowchart TD
|
|
20
|
+
A[Receive departmentId + newParentId] --> B{newParentId === departmentId?}
|
|
21
|
+
B -->|Yes| C[Return isCircular: true]
|
|
22
|
+
B -->|No| D[Set ancestorId = newParentId]
|
|
23
|
+
D --> E[SELECT ancestor where id = ancestorId]
|
|
24
|
+
E --> F{Ancestor found?}
|
|
25
|
+
F -->|No| G[Return isCircular: false]
|
|
26
|
+
F -->|Yes| H[Set ancestorId = ancestor.parentDepartmentId]
|
|
27
|
+
H --> I{ancestorId === departmentId?}
|
|
28
|
+
I -->|Yes| C
|
|
29
|
+
I -->|No| J{ancestorId is null?}
|
|
30
|
+
J -->|Yes| G
|
|
31
|
+
J -->|No| E
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## External Dependencies
|
|
35
|
+
|
|
36
|
+
- None
|
|
37
|
+
|
|
38
|
+
## Error Scenarios
|
|
39
|
+
|
|
40
|
+
- **CIRCULAR_REFERENCE**: The moved department appears in the ancestor chain of the new parent — returns isCircular: true
|
|
41
|
+
- **SELF_REFERENCE**: Department is moved to itself as parent — returns isCircular: true
|
|
42
|
+
|
|
43
|
+
## Test Cases
|
|
44
|
+
|
|
45
|
+
- detects self-reference as circular
|
|
46
|
+
- detects moving department under its child as circular
|
|
47
|
+
- detects moving department under its grandchild as circular
|
|
48
|
+
- returns not circular for valid move
|
|
49
|
+
- returns not circular when new parent is root
|
|
50
|
+
- handles broken ancestor chain gracefully (not circular)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# GetCompany
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
GetCompany retrieves a single company by its unique identifier. Returns the full company record including status, legal details, address, and base currency reference, or null if no matching company exists.
|
|
6
|
+
|
|
7
|
+
This function supports company validation and lookup operations across all modules that reference companies.
|
|
8
|
+
|
|
9
|
+
## Business Rules
|
|
10
|
+
|
|
11
|
+
- Lookup by `id` performs an exact UUID match
|
|
12
|
+
- Returns the full company record including status, legal name, tax ID, registration number, address, and base currency
|
|
13
|
+
- Does not filter by status — returns DRAFT, ACTIVE, and INACTIVE companies
|
|
14
|
+
- Returns null when no matching company is found
|
|
15
|
+
|
|
16
|
+
## Process Flow
|
|
17
|
+
|
|
18
|
+
```mermaid
|
|
19
|
+
flowchart TD
|
|
20
|
+
A[Receive lookup request] --> B[Query Company by id]
|
|
21
|
+
B --> C{Found?}
|
|
22
|
+
C -->|Yes| D[Return company]
|
|
23
|
+
C -->|No| E[Return null]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## External Dependencies
|
|
27
|
+
|
|
28
|
+
- None
|
|
29
|
+
|
|
30
|
+
## Error Scenarios
|
|
31
|
+
|
|
32
|
+
- None (returns null when not found instead of throwing)
|
|
33
|
+
|
|
34
|
+
## Test Cases
|
|
35
|
+
|
|
36
|
+
- returns company when found by id
|
|
37
|
+
- returns null when company not found
|
|
38
|
+
- returns DRAFT company
|
|
39
|
+
- returns ACTIVE company
|
|
40
|
+
- returns INACTIVE company
|