@tailor-platform/erp-kit 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/README.md +35 -7
- package/dist/cli.mjs +783 -272
- package/package.json +5 -4
- package/skills/erp-kit-app-1-requirements/SKILL.md +39 -12
- package/skills/{erp-kit-app-3-plan → erp-kit-app-1-requirements}/references/story-extraction.md +1 -1
- package/skills/erp-kit-app-2-requirements-review/SKILL.md +29 -5
- 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-2-requirements-review/references/story-quality-check.md +67 -0
- package/skills/erp-kit-app-3-plan/SKILL.md +51 -50
- package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +24 -18
- package/skills/erp-kit-app-3-plan/references/screen-extraction.md +18 -2
- package/skills/erp-kit-app-4-plan-review/SKILL.md +16 -13
- package/skills/erp-kit-app-5-impl-backend/SKILL.md +19 -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 +16 -0
- package/skills/erp-kit-app-6-impl-frontend/references/pages.md +16 -46
- package/skills/erp-kit-app-7-impl-review/SKILL.md +29 -23
- 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 +29 -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 +30 -7
- 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/skills/erp-kit-module-shared/references/commands.md +1 -1
- package/skills/erp-kit-module-shared/references/queries.md +5 -6
- 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 -2
- package/src/generator/generate-code.test.ts +43 -12
- 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/module.ts +3 -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 +33 -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 +42 -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 +48 -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 +170 -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 +48 -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/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 +82 -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/permissions.generated.ts +30 -0
- package/src/modules/business-partner/lib/types.ts +58 -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/permissions.generated.ts +20 -0
- package/src/modules/coa-management/lib/types.ts +27 -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/item-management/command/activateItem.generated.ts +1 -1
- package/src/modules/item-management/command/activateItem.ts +1 -1
- package/src/modules/item-management/command/assignItemToTaxonomy.generated.ts +1 -1
- package/src/modules/item-management/command/assignItemToTaxonomy.ts +1 -1
- package/src/modules/item-management/command/createItem.generated.ts +1 -1
- package/src/modules/item-management/command/createItem.test.ts +1 -1
- package/src/modules/item-management/command/createItem.ts +1 -1
- package/src/modules/item-management/command/createTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/createTaxonomyNode.test.ts +1 -1
- package/src/modules/item-management/command/createTaxonomyNode.ts +1 -1
- package/src/modules/item-management/command/deactivateItem.generated.ts +1 -1
- package/src/modules/item-management/command/deactivateItem.ts +1 -1
- package/src/modules/item-management/command/deleteItem.generated.ts +1 -1
- package/src/modules/item-management/command/deleteItem.ts +1 -1
- package/src/modules/item-management/command/deleteTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/deleteTaxonomyNode.ts +1 -1
- package/src/modules/item-management/command/moveTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/moveTaxonomyNode.test.ts +1 -1
- package/src/modules/item-management/command/moveTaxonomyNode.ts +1 -1
- package/src/modules/item-management/command/reactivateItem.generated.ts +1 -1
- package/src/modules/item-management/command/reactivateItem.ts +1 -1
- package/src/modules/item-management/command/removeItemFromTaxonomy.generated.ts +1 -1
- package/src/modules/item-management/command/removeItemFromTaxonomy.ts +1 -1
- package/src/modules/item-management/command/updateItem.generated.ts +1 -1
- package/src/modules/item-management/command/updateItem.test.ts +1 -1
- package/src/modules/item-management/command/updateItem.ts +1 -1
- package/src/modules/item-management/command/updateTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/updateTaxonomyNode.ts +1 -1
- package/src/modules/item-management/lib/errors.generated.ts +1 -1
- package/src/modules/item-management/lib/permissions.generated.ts +1 -1
- package/src/modules/item-management/lib/types.ts +6 -1
- package/src/modules/item-management/module.ts +1 -1
- package/src/modules/item-management/query/calculateNodeDepth.generated.ts +1 -1
- package/src/modules/item-management/query/calculateNodeDepth.ts +1 -1
- package/src/modules/item-management/query/calculateSubtreeDepth.generated.ts +1 -1
- package/src/modules/item-management/query/calculateSubtreeDepth.ts +1 -1
- package/src/modules/item-management/query/detectCircularReference.generated.ts +1 -1
- package/src/modules/item-management/query/detectCircularReference.ts +1 -1
- package/src/modules/item-management/query/getItem.generated.ts +1 -1
- package/src/modules/item-management/query/getItem.ts +1 -1
- package/src/modules/item-management/query/getItemTaxonomyAssignment.generated.ts +1 -1
- package/src/modules/item-management/query/getItemTaxonomyAssignment.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNode.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeChildren.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeChildren.ts +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/permissions.generated.ts +19 -0
- package/src/modules/organization/lib/types.ts +21 -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/activateCategory.generated.ts +1 -1
- package/src/modules/primitives/command/activateCategory.ts +1 -1
- package/src/modules/primitives/command/activateCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/activateCurrency.ts +1 -1
- package/src/modules/primitives/command/activateUnit.generated.ts +1 -1
- package/src/modules/primitives/command/activateUnit.ts +1 -1
- package/src/modules/primitives/command/createCategory.generated.ts +1 -1
- package/src/modules/primitives/command/createCategory.ts +1 -1
- package/src/modules/primitives/command/createCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/createCurrency.ts +1 -1
- package/src/modules/primitives/command/createExchangeRate.generated.ts +1 -1
- package/src/modules/primitives/command/createExchangeRate.ts +1 -1
- package/src/modules/primitives/command/createUnit.generated.ts +1 -1
- package/src/modules/primitives/command/createUnit.ts +1 -1
- package/src/modules/primitives/command/deactivateCategory.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateCategory.ts +1 -1
- package/src/modules/primitives/command/deactivateCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateCurrency.ts +1 -1
- package/src/modules/primitives/command/deactivateUnit.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateUnit.ts +1 -1
- package/src/modules/primitives/command/setBaseCurrency.generated.ts +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/command/setReferenceUnit.generated.ts +1 -1
- package/src/modules/primitives/command/setReferenceUnit.ts +1 -1
- 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 +6 -1
- package/src/modules/primitives/lib/permissions.generated.ts +1 -1
- package/src/modules/primitives/lib/types.ts +6 -1
- package/src/modules/primitives/module.ts +1 -1
- package/src/modules/primitives/query/convertAmount.generated.ts +1 -1
- package/src/modules/primitives/query/convertAmount.test.ts +1 -1
- package/src/modules/primitives/query/convertAmount.ts +1 -1
- package/src/modules/primitives/query/convertQuantity.generated.ts +1 -1
- package/src/modules/primitives/query/convertQuantity.test.ts +1 -1
- package/src/modules/primitives/query/convertQuantity.ts +1 -1
- package/src/modules/primitives/query/getBaseCurrency.generated.ts +1 -1
- package/src/modules/primitives/query/getBaseCurrency.test.ts +1 -1
- package/src/modules/primitives/query/getBaseCurrency.ts +1 -1
- package/src/modules/primitives/query/getCurrency.generated.ts +1 -1
- package/src/modules/primitives/query/getCurrency.ts +1 -1
- package/src/modules/primitives/query/getUnit.generated.ts +1 -1
- package/src/modules/primitives/query/getUnit.ts +1 -1
- package/src/modules/primitives/query/getUoMCategory.generated.ts +1 -1
- package/src/modules/primitives/query/getUoMCategory.ts +1 -1
- package/src/modules/primitives/query/listUnitsByCategory.generated.ts +1 -1
- package/src/modules/primitives/query/listUnitsByCategory.ts +2 -2
- package/src/modules/product-management/README.md +1 -1
- package/src/modules/product-management/command/activateProduct.generated.ts +1 -1
- package/src/modules/product-management/command/activateProduct.ts +1 -1
- package/src/modules/product-management/command/assignProductToCategory.generated.ts +1 -1
- package/src/modules/product-management/command/assignProductToCategory.ts +1 -1
- package/src/modules/product-management/command/createProduct.generated.ts +1 -1
- package/src/modules/product-management/command/createProduct.test.ts +1 -1
- package/src/modules/product-management/command/createProduct.ts +1 -1
- package/src/modules/product-management/command/createProductAttribute.generated.ts +1 -1
- package/src/modules/product-management/command/createProductAttribute.ts +1 -1
- package/src/modules/product-management/command/createProductAttributeValue.generated.ts +1 -1
- package/src/modules/product-management/command/createProductAttributeValue.ts +1 -1
- package/src/modules/product-management/command/createProductCategory.generated.ts +1 -1
- package/src/modules/product-management/command/createProductCategory.test.ts +1 -1
- package/src/modules/product-management/command/createProductCategory.ts +1 -1
- package/src/modules/product-management/command/deactivateProduct.generated.ts +1 -1
- package/src/modules/product-management/command/deactivateProduct.ts +1 -1
- package/src/modules/product-management/command/deleteProduct.generated.ts +1 -1
- package/src/modules/product-management/command/deleteProduct.ts +1 -1
- package/src/modules/product-management/command/deleteProductAttribute.generated.ts +1 -1
- package/src/modules/product-management/command/deleteProductAttribute.ts +1 -1
- package/src/modules/product-management/command/deleteProductAttributeValue.generated.ts +1 -1
- package/src/modules/product-management/command/deleteProductAttributeValue.ts +1 -1
- package/src/modules/product-management/command/deleteProductCategory.generated.ts +1 -1
- package/src/modules/product-management/command/deleteProductCategory.ts +1 -1
- package/src/modules/product-management/command/generateVariants.generated.ts +1 -1
- package/src/modules/product-management/command/generateVariants.test.ts +1 -1
- package/src/modules/product-management/command/generateVariants.ts +1 -1
- package/src/modules/product-management/command/moveProductCategory.generated.ts +1 -1
- package/src/modules/product-management/command/moveProductCategory.test.ts +1 -1
- package/src/modules/product-management/command/moveProductCategory.ts +1 -1
- package/src/modules/product-management/command/reactivateProduct.generated.ts +1 -1
- package/src/modules/product-management/command/reactivateProduct.ts +1 -1
- package/src/modules/product-management/command/removeProductFromCategory.generated.ts +1 -1
- package/src/modules/product-management/command/removeProductFromCategory.ts +1 -1
- package/src/modules/product-management/command/setProductAttributeAssignment.generated.ts +1 -1
- package/src/modules/product-management/command/setProductAttributeAssignment.ts +1 -1
- package/src/modules/product-management/command/updateProduct.generated.ts +1 -1
- package/src/modules/product-management/command/updateProduct.test.ts +1 -1
- package/src/modules/product-management/command/updateProduct.ts +1 -1
- package/src/modules/product-management/command/updateProductAttribute.generated.ts +1 -1
- package/src/modules/product-management/command/updateProductAttribute.ts +1 -1
- package/src/modules/product-management/command/updateProductAttributeValue.generated.ts +1 -1
- package/src/modules/product-management/command/updateProductAttributeValue.ts +1 -1
- package/src/modules/product-management/command/updateProductCategory.generated.ts +1 -1
- package/src/modules/product-management/command/updateProductCategory.ts +1 -1
- package/src/modules/product-management/lib/errors.generated.ts +1 -1
- package/src/modules/product-management/lib/permissions.generated.ts +1 -1
- package/src/modules/product-management/lib/types.ts +6 -1
- package/src/modules/product-management/module.ts +1 -1
- package/src/modules/product-management/query/calculateCategoryDepth.generated.ts +1 -1
- package/src/modules/product-management/query/calculateCategoryDepth.ts +1 -1
- package/src/modules/product-management/query/detectCategoryCircularReference.generated.ts +1 -1
- package/src/modules/product-management/query/detectCategoryCircularReference.ts +1 -1
- package/src/modules/product-management/query/getProduct.generated.ts +1 -1
- package/src/modules/product-management/query/getProduct.ts +1 -1
- package/src/modules/product-management/query/getProductAttribute.generated.ts +1 -1
- package/src/modules/product-management/query/getProductAttribute.ts +1 -1
- package/src/modules/product-management/query/getProductAttributeAssignment.generated.ts +1 -1
- package/src/modules/product-management/query/getProductAttributeAssignment.ts +1 -1
- package/src/modules/product-management/query/getProductAttributeValue.generated.ts +1 -1
- package/src/modules/product-management/query/getProductAttributeValue.ts +1 -1
- package/src/modules/product-management/query/getProductCategory.generated.ts +1 -1
- package/src/modules/product-management/query/getProductCategory.ts +1 -1
- package/src/modules/product-management/query/getProductCategoryAssignment.generated.ts +1 -1
- package/src/modules/product-management/query/getProductCategoryAssignment.ts +1 -1
- package/src/modules/product-management/query/getProductVariant.generated.ts +1 -1
- package/src/modules/product-management/query/getProductVariant.ts +1 -1
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.generated.ts +1 -1
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.ts +1 -1
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.generated.ts +1 -1
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.ts +1 -1
- package/src/modules/product-management/query/listProductAttributeAssignments.generated.ts +1 -1
- package/src/modules/product-management/query/listProductAttributeAssignments.ts +1 -1
- package/src/modules/product-management/query/listProductAttributeValues.generated.ts +1 -1
- package/src/modules/product-management/query/listProductAttributeValues.ts +1 -1
- package/src/modules/product-management/query/listProductCategoryAssignments.generated.ts +1 -1
- package/src/modules/product-management/query/listProductCategoryAssignments.ts +1 -1
- package/src/modules/product-management/query/listProductCategoryChildren.generated.ts +1 -1
- package/src/modules/product-management/query/listProductCategoryChildren.ts +1 -1
- package/src/modules/product-management/query/listProductVariants.generated.ts +1 -1
- package/src/modules/product-management/query/listProductVariants.ts +1 -1
- package/src/modules/user-management/command/activateUser.generated.ts +1 -1
- package/src/modules/user-management/command/activateUser.ts +1 -1
- package/src/modules/user-management/command/assignPermissionToRole.generated.ts +1 -1
- package/src/modules/user-management/command/assignPermissionToRole.ts +1 -1
- package/src/modules/user-management/command/assignRoleToUser.generated.ts +1 -1
- package/src/modules/user-management/command/assignRoleToUser.ts +1 -1
- package/src/modules/user-management/command/createPermission.generated.ts +1 -1
- package/src/modules/user-management/command/createPermission.ts +1 -1
- package/src/modules/user-management/command/createRole.generated.ts +1 -1
- package/src/modules/user-management/command/createRole.ts +1 -1
- package/src/modules/user-management/command/createUser.generated.ts +1 -1
- package/src/modules/user-management/command/createUser.ts +1 -1
- package/src/modules/user-management/command/deactivateUser.generated.ts +1 -1
- package/src/modules/user-management/command/deactivateUser.ts +1 -1
- package/src/modules/user-management/command/reactivateUser.generated.ts +1 -1
- package/src/modules/user-management/command/reactivateUser.ts +1 -1
- package/src/modules/user-management/command/revokePermissionFromRole.generated.ts +1 -1
- package/src/modules/user-management/command/revokePermissionFromRole.ts +1 -1
- package/src/modules/user-management/command/revokeRoleFromUser.generated.ts +1 -1
- package/src/modules/user-management/command/revokeRoleFromUser.ts +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/modules/user-management/lib/errors.generated.ts +1 -1
- package/src/modules/user-management/lib/permissions.generated.ts +1 -1
- package/src/modules/user-management/lib/types.ts +6 -1
- package/src/modules/user-management/module.ts +1 -1
- 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/templates/scaffold/module/lib/types.ts +6 -1
- package/templates/scaffold/module/permissions.ts +1 -1
- package/src/commands/module/list.test.ts +0 -57
- package/src/commands/module/list.ts +0 -64
- package/templates/scaffold/module/lib/errors.ts +0 -1
- /package/src/modules/{accounting → audit/db}/.gitkeep +0 -0
- /package/src/modules/audit/{.gitkeep → executor/.gitkeep} +0 -0
- /package/src/modules/{coa-management → business-partner}/.gitkeep +0 -0
- /package/src/modules/{supplier-management → business-partner/command}/.gitkeep +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# UpdateContactPerson
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateContactPerson modifies the details of an existing contact person. All fields are optional, but validation rules are enforced for any provided values. The contact person's association with its organization partner cannot be changed. After the update, at least one communication channel (email or phone) must remain present.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Contact person must exist in the system
|
|
10
|
+
- First name, if provided, must be non-empty and not whitespace-only
|
|
11
|
+
- Last name, if provided, must be non-empty and not whitespace-only
|
|
12
|
+
- Email, if provided, must be in a valid format
|
|
13
|
+
- After update, at least one of email or phone must still be present (whitespace-only values do not count)
|
|
14
|
+
- The organization association is immutable and cannot be changed
|
|
15
|
+
- The primary contact designation (isPrimary) is not modifiable through this command; it is preserved as-is
|
|
16
|
+
- Only provided fields are updated; omitted fields retain their current values
|
|
17
|
+
|
|
18
|
+
## Process Flow
|
|
19
|
+
|
|
20
|
+
```mermaid
|
|
21
|
+
flowchart TD
|
|
22
|
+
A[Receive update request] --> B{Contact person exists?}
|
|
23
|
+
B -->|No| C[Return error: contact person not found]
|
|
24
|
+
B -->|Yes| B2{firstName provided?}
|
|
25
|
+
B2 -->|Yes| B3{firstName non-empty after trim?}
|
|
26
|
+
B3 -->|No| B4[Return error: invalid first name]
|
|
27
|
+
B3 -->|Yes| B5{lastName provided?}
|
|
28
|
+
B2 -->|No| B5
|
|
29
|
+
B5 -->|Yes| B6{lastName non-empty after trim?}
|
|
30
|
+
B6 -->|No| B7[Return error: invalid last name]
|
|
31
|
+
B6 -->|Yes| D{Email provided?}
|
|
32
|
+
B5 -->|No| D
|
|
33
|
+
D -->|Yes| E{Email format valid?}
|
|
34
|
+
E -->|No| F[Return error: invalid email format]
|
|
35
|
+
E -->|Yes| G{At least one communication channel remains?}
|
|
36
|
+
D -->|No| G
|
|
37
|
+
G -->|No| H[Return error: missing communication channel]
|
|
38
|
+
G -->|Yes| I[Update contact person record]
|
|
39
|
+
I --> J[Return updated contact person]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## External Dependencies
|
|
43
|
+
|
|
44
|
+
- None
|
|
45
|
+
|
|
46
|
+
## Error Scenarios
|
|
47
|
+
|
|
48
|
+
- **CONTACT_PERSON_NOT_FOUND**: Specified contact person ID does not exist
|
|
49
|
+
- **INVALID_FIRST_NAME**: Provided first name is empty or whitespace-only
|
|
50
|
+
- **INVALID_LAST_NAME**: Provided last name is empty or whitespace-only
|
|
51
|
+
- **INVALID_EMAIL_FORMAT**: Provided email is not in a valid format
|
|
52
|
+
- **MISSING_COMMUNICATION_CHANNEL**: Update would result in neither email nor phone being present
|
|
53
|
+
|
|
54
|
+
## Test Cases
|
|
55
|
+
|
|
56
|
+
- updates contact person details
|
|
57
|
+
- returns error when contact not found
|
|
58
|
+
- returns error when first name is empty
|
|
59
|
+
- returns error when first name is whitespace-only
|
|
60
|
+
- returns error when last name is empty
|
|
61
|
+
- returns error when last name is whitespace-only
|
|
62
|
+
- returns error when email format is invalid
|
|
63
|
+
- returns error when update would leave no communication channel
|
|
64
|
+
- returns error when whitespace-only phone would leave no communication channel
|
|
65
|
+
- does not change organization association
|
|
66
|
+
- preserves primary contact designation
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# UpdatePartner
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updatePartner modifies the mutable fields of an existing business partner. Only name and preferred currency can be updated. The partner type remains immutable after creation. This command supports incremental enrichment of partner data throughout the partner lifecycle.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Partner must exist in the system
|
|
10
|
+
- Name, if provided, must be non-empty
|
|
11
|
+
- Preferred currency, if provided, must reference an existing Currency in the primitives module
|
|
12
|
+
- Partner type cannot be changed via this command
|
|
13
|
+
|
|
14
|
+
## Process Flow
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
flowchart TD
|
|
18
|
+
A[Receive update request] --> B{Partner exists?}
|
|
19
|
+
B -->|No| C[Return error: partner not found]
|
|
20
|
+
B -->|Yes| D{Name provided?}
|
|
21
|
+
D -->|Yes| E{Name non-empty?}
|
|
22
|
+
E -->|No| F[Return error: invalid name]
|
|
23
|
+
E -->|Yes| G{Currency provided?}
|
|
24
|
+
D -->|No| G
|
|
25
|
+
G -->|Yes| H{Currency exists?}
|
|
26
|
+
H -->|No| I[Return error: currency not found]
|
|
27
|
+
H -->|Yes| J[Update partner record]
|
|
28
|
+
G -->|No| J
|
|
29
|
+
J --> K[Return updated partner]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## External Dependencies
|
|
33
|
+
|
|
34
|
+
- [primitives::Currency](../../../primitives/docs/models/Currency.md) - Validates that the referenced preferred currency exists (when provided)
|
|
35
|
+
|
|
36
|
+
## Error Scenarios
|
|
37
|
+
|
|
38
|
+
- **PARTNER_NOT_FOUND**: Specified partner ID does not exist
|
|
39
|
+
- **CURRENCY_NOT_FOUND**: Referenced preferred currency does not exist
|
|
40
|
+
- **INVALID_NAME**: Provided name is empty
|
|
41
|
+
|
|
42
|
+
## Test Cases
|
|
43
|
+
|
|
44
|
+
- updates partner name
|
|
45
|
+
- updates preferred currency
|
|
46
|
+
- returns error when partner not found
|
|
47
|
+
- returns error when name is empty
|
|
48
|
+
- returns error when currency not found
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# UpdatePartnerAddress
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updatePartnerAddress modifies the fields of an existing partner address. The address type is immutable and cannot be changed after creation. All other address fields (line1, line2, city, state, postalCode, country) can be updated individually. Country validation is enforced when a new country value is provided. Updates are permitted regardless of the parent partner's lifecycle status (DRAFT, ACTIVE, or INACTIVE) — existing addresses always remain updatable.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Address must exist in the system
|
|
10
|
+
- Parent partner's lifecycle status is not checked — updates are permitted in any state (DRAFT, ACTIVE, or INACTIVE)
|
|
11
|
+
- Address type is immutable — it cannot be changed after creation
|
|
12
|
+
- Country, if provided, must be a valid ISO 3166-1 alpha-2 code
|
|
13
|
+
- Only provided fields are updated; omitted fields retain their current values
|
|
14
|
+
|
|
15
|
+
## Process Flow
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart TD
|
|
19
|
+
A[Receive update request] --> B{Address exists?}
|
|
20
|
+
B -->|No| C[Return error: address not found]
|
|
21
|
+
B -->|Yes| D{Country provided?}
|
|
22
|
+
D -->|Yes| E{Country code valid?}
|
|
23
|
+
E -->|No| F[Return error: invalid country code]
|
|
24
|
+
E -->|Yes| G[Update address record]
|
|
25
|
+
D -->|No| G
|
|
26
|
+
G --> H[Return updated address]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## External Dependencies
|
|
30
|
+
|
|
31
|
+
- None
|
|
32
|
+
|
|
33
|
+
## Error Scenarios
|
|
34
|
+
|
|
35
|
+
- **ADDRESS_NOT_FOUND**: Specified address ID does not exist
|
|
36
|
+
- **INVALID_COUNTRY_CODE**: Country is not a valid ISO 3166-1 alpha-2 code
|
|
37
|
+
|
|
38
|
+
## Test Cases
|
|
39
|
+
|
|
40
|
+
- updates address fields
|
|
41
|
+
- updates address for DRAFT partner
|
|
42
|
+
- updates address for ACTIVE partner
|
|
43
|
+
- updates address for INACTIVE partner
|
|
44
|
+
- returns error when address not found
|
|
45
|
+
- returns error when country code is invalid
|
|
46
|
+
- returns error when country code is lowercase
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# UpdatePartnerBankAccount
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updatePartnerBankAccount modifies the details of an existing bank account. All fields are optional, but the same validation rules that apply at creation are enforced for any provided values. This allows incremental updates to banking information as details change. Updates are permitted regardless of the parent partner's lifecycle status (DRAFT, ACTIVE, or INACTIVE).
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Bank account must exist in the system
|
|
10
|
+
- Parent partner's status is not checked — updates are permitted in any lifecycle state (DRAFT, ACTIVE, or INACTIVE)
|
|
11
|
+
- Bank name, if provided, must be non-empty
|
|
12
|
+
- Account holder name, if provided, must be non-empty
|
|
13
|
+
- After update, at least one of accountNumber or iban must still be present
|
|
14
|
+
- `routingNumber` is optional — can be added, updated, or cleared
|
|
15
|
+
- `swiftBic` is optional — can be added, updated, or cleared
|
|
16
|
+
- Currency, if provided, must reference an existing Currency in the primitives module
|
|
17
|
+
|
|
18
|
+
## Process Flow
|
|
19
|
+
|
|
20
|
+
```mermaid
|
|
21
|
+
flowchart TD
|
|
22
|
+
A[Receive update request] --> B{Bank account exists?}
|
|
23
|
+
B -->|No| C[Return error: bank account not found]
|
|
24
|
+
B -->|Yes| D{bankName provided and empty?}
|
|
25
|
+
D -->|Yes| D1[Return error: invalid bank name]
|
|
26
|
+
D -->|No| E2{accountHolderName provided and empty?}
|
|
27
|
+
E2 -->|Yes| E3[Return error: invalid account holder name]
|
|
28
|
+
E2 -->|No| F1{Currency provided?}
|
|
29
|
+
F1 -->|Yes| F2{Currency exists?}
|
|
30
|
+
F2 -->|No| F3[Return error: currency not found]
|
|
31
|
+
F2 -->|Yes| G{At least one account identifier remains?}
|
|
32
|
+
F1 -->|No| G
|
|
33
|
+
G -->|No| H[Return error: missing account identifier]
|
|
34
|
+
G -->|Yes| I[Update bank account record]
|
|
35
|
+
I --> J[Return updated bank account]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## External Dependencies
|
|
39
|
+
|
|
40
|
+
- [primitives::Currency](../../../primitives/docs/models/Currency.md) - Validates that the referenced currency exists (when provided)
|
|
41
|
+
|
|
42
|
+
## Error Scenarios
|
|
43
|
+
|
|
44
|
+
- **BANK_ACCOUNT_NOT_FOUND**: Specified bank account ID does not exist
|
|
45
|
+
- **INVALID_BANK_NAME**: Bank name is provided but empty
|
|
46
|
+
- **INVALID_ACCOUNT_HOLDER_NAME**: Account holder name is provided but empty
|
|
47
|
+
- **CURRENCY_NOT_FOUND**: Referenced currency does not exist
|
|
48
|
+
- **MISSING_ACCOUNT_IDENTIFIER**: Update would result in neither accountNumber nor iban being present
|
|
49
|
+
|
|
50
|
+
## Test Cases
|
|
51
|
+
|
|
52
|
+
- updates bank account details
|
|
53
|
+
- updates routingNumber
|
|
54
|
+
- updates swiftBic
|
|
55
|
+
- clears routingNumber when null is passed
|
|
56
|
+
- clears swiftBic when null is passed
|
|
57
|
+
- updates bank account for DRAFT partner
|
|
58
|
+
- updates bank account for ACTIVE partner
|
|
59
|
+
- updates bank account for INACTIVE partner
|
|
60
|
+
- returns error when account not found
|
|
61
|
+
- returns error when bank name is empty
|
|
62
|
+
- returns error when account holder name is empty
|
|
63
|
+
- returns error when currency not found
|
|
64
|
+
- returns error when update would remove all identifiers
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# UpdatePartnerIdentification
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updatePartnerIdentification modifies the fields of an existing partner identification. The identification type is immutable and cannot be changed after creation. When the value is updated, uniqueness is re-validated against the company scope to prevent duplicate registrations.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Identification must exist in the system
|
|
10
|
+
- Type is immutable — it cannot be changed after creation
|
|
11
|
+
- If value is provided, it must be non-empty and not whitespace-only
|
|
12
|
+
- If value is changed, the new (type, value) combination must be unique within the company scope
|
|
13
|
+
- When both validFrom and validTo are set, validTo must be greater than or equal to validFrom
|
|
14
|
+
- Issuing country and validity dates are optional
|
|
15
|
+
|
|
16
|
+
## Process Flow
|
|
17
|
+
|
|
18
|
+
```mermaid
|
|
19
|
+
flowchart TD
|
|
20
|
+
A[Receive update request] --> B{Identification exists?}
|
|
21
|
+
B -->|No| C[Return error: identification not found]
|
|
22
|
+
B -->|Yes| D{Value provided?}
|
|
23
|
+
D -->|Yes| D2{Value non-empty after trim?}
|
|
24
|
+
D2 -->|No| D3[Return error: invalid value]
|
|
25
|
+
D2 -->|Yes| E{Value changed and new type + value unique in company?}
|
|
26
|
+
E -->|No| F[Return error: duplicate identification]
|
|
27
|
+
E -->|Yes| G{Validate validity period}
|
|
28
|
+
D -->|No| G
|
|
29
|
+
G -->|validTo < validFrom| H[Return error: invalid validity period]
|
|
30
|
+
G -->|Valid| I[Update identification record]
|
|
31
|
+
I --> J[Return updated identification]
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## External Dependencies
|
|
35
|
+
|
|
36
|
+
- None
|
|
37
|
+
|
|
38
|
+
## Error Scenarios
|
|
39
|
+
|
|
40
|
+
- **IDENTIFICATION_NOT_FOUND**: Specified identification ID does not exist
|
|
41
|
+
- **INVALID_VALUE**: Provided value is empty or whitespace-only
|
|
42
|
+
- **DUPLICATE_IDENTIFICATION**: Updated (type, value) combination already exists within the company
|
|
43
|
+
- **INVALID_VALIDITY_PERIOD**: validTo is earlier than validFrom
|
|
44
|
+
|
|
45
|
+
## Test Cases
|
|
46
|
+
|
|
47
|
+
- updates identification value
|
|
48
|
+
- returns error when identification not found
|
|
49
|
+
- returns error when value is empty
|
|
50
|
+
- returns error when value is whitespace-only
|
|
51
|
+
- returns error when updated value creates duplicate
|
|
52
|
+
- returns error when validity period is invalid
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Contact Person Management
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Contact Person Management enables organizations to track individual people who represent a business partner organization. Each contact person is a sub-entity linked to exactly one ORGANIZATION-type partner — they are not business partners themselves, but named individuals who act on behalf of that organization. Contact persons carry their own identifying information (name, and at least one of email or phone, plus optional job title and department) and maintain an independent ACTIVE/INACTIVE status.
|
|
6
|
+
|
|
7
|
+
One contact person per organization can be designated as the primary contact, providing a single point of first contact for that partner relationship.
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
Business interactions with partner organizations are typically conducted through specific individuals. Tracking contact persons enables:
|
|
12
|
+
|
|
13
|
+
- **Named communication**: Sales, procurement, and support teams can reach the right person at a partner organization rather than relying on generic email addresses or phone numbers
|
|
14
|
+
- **Role clarity**: Job title and department fields identify who is responsible for purchasing, accounts payable, technical escalation, and other functional areas
|
|
15
|
+
- **Primary contact designation**: Each organization has one primary contact, reducing ambiguity about who to contact first for general enquiries
|
|
16
|
+
- **Status tracking**: Contacts who leave or change roles can be marked INACTIVE without losing historical records tied to past transactions or communications
|
|
17
|
+
- **CRM alignment**: Mirrors industry-standard models (SAP BP relationships, Odoo child contacts, Salesforce Contact-Account) for interoperability and familiarity
|
|
18
|
+
|
|
19
|
+
## Process Flow
|
|
20
|
+
|
|
21
|
+
The relationship between a partner organization and its contact persons:
|
|
22
|
+
|
|
23
|
+
```mermaid
|
|
24
|
+
flowchart TD
|
|
25
|
+
A[ORGANIZATION-type Partner] -->|has zero or more| B[Contact Person]
|
|
26
|
+
B --> C{Is primary contact?}
|
|
27
|
+
C -->|Yes| D[Designated as primary contact\nfor the organization]
|
|
28
|
+
C -->|No| E[Regular contact person]
|
|
29
|
+
D -->|another contact promoted| F[Primary designation transferred]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Contact person lifecycle:
|
|
33
|
+
|
|
34
|
+
```mermaid
|
|
35
|
+
stateDiagram-v2
|
|
36
|
+
[*] --> Active: createContactPerson
|
|
37
|
+
Active --> Inactive: deactivateContactPerson
|
|
38
|
+
Inactive --> Active: reactivateContactPerson
|
|
39
|
+
Active --> [*]: deleteContactPerson (only when not primary)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Scenario Patterns
|
|
43
|
+
|
|
44
|
+
- **New supplier onboarding**: When a new supplier partner is registered, the procurement team adds the account manager's name, email, and phone as a contact person and marks them as primary contact
|
|
45
|
+
- **Multiple contacts per organization**: A customer organization has separate contacts for accounts payable and technical support — both are recorded with distinct job titles and departments
|
|
46
|
+
- **Primary contact change**: The existing primary contact leaves the organization; their record is marked INACTIVE, and a newly added colleague is designated as the primary contact
|
|
47
|
+
- **Contact details update**: A contact person's phone number or job title changes; the record is updated without affecting their link to the parent organization or their primary status
|
|
48
|
+
- **Departed contact retention**: A contact person who has left the partner organization is deactivated rather than deleted, preserving references in historical correspondence and past transactions
|
|
49
|
+
- **Organization type enforcement**: Attempting to link a contact person to an INDIVIDUAL-type partner is rejected; contact persons may only belong to ORGANIZATION-type partners
|
|
50
|
+
|
|
51
|
+
## Test Cases
|
|
52
|
+
|
|
53
|
+
- A contact person can only be linked to an ORGANIZATION-type partner; linking to an INDIVIDUAL-type partner must be rejected
|
|
54
|
+
- Contact person fields firstName and lastName are required; email, phone, jobTitle, and department are optional. At least one communication channel (email or phone) must be provided
|
|
55
|
+
- Email format must be validated on creation and update
|
|
56
|
+
- A contact person is created with ACTIVE status by default
|
|
57
|
+
- An ACTIVE contact person can be deactivated; an INACTIVE contact person can be reactivated
|
|
58
|
+
- At most one contact person per organization may hold primary contact designation at any given time
|
|
59
|
+
- Designating a new primary contact automatically removes the designation from the previous primary contact
|
|
60
|
+
- A contact person marked as primary cannot be deleted; the primary designation must be transferred first
|
|
61
|
+
- Deactivating a primary contact person removes their primary designation; the organization has no primary contact until one is explicitly set
|
|
62
|
+
- Multiple contact persons with distinct roles may exist under the same organization
|
|
63
|
+
- Updating a contact person's details does not change their organization association or primary status
|
|
64
|
+
- Listing contact persons for an organization returns only those linked to that specific organization
|
|
65
|
+
|
|
66
|
+
## Reference Links
|
|
67
|
+
|
|
68
|
+
- [SAP Business Partner Relationships](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/7b24a64d9d0941bda1afa753263d9e39/4e4dece7db1b59cde10000000a42189b.html)
|
|
69
|
+
- [Odoo Contacts as Child Partners](https://www.odoo.com/documentation/19.0/applications/general/contacts.html)
|
|
70
|
+
- [Salesforce Contact Object](https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_contact.htm)
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Partner Address Management
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Partner Address Management allows each business partner to maintain multiple addresses, each classified by purpose (BILLING, SHIPPING, REGISTERED, or OTHER). Addresses are child entities — they cannot exist without a parent partner record — and they carry the same structured format used by the organization module's Site entity: line1, line2, city, state/province, postalCode, and country (ISO 3166-1 alpha-2). While a Site models a company-owned physical facility, a partner address models an external party's location and is owned entirely by the business-partner module.
|
|
6
|
+
|
|
7
|
+
One address per partner may be designated as the default for each address type, eliminating ambiguity when downstream modules (accounts payable, order management, shipping) need to resolve where to send an invoice, a shipment, or a legal notice. When no explicit override is provided on a transaction, the relevant default address is used automatically.
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
Partners routinely operate out of more than one location and require different addresses for different purposes. This feature enables:
|
|
12
|
+
|
|
13
|
+
- Separate billing and shipping addresses so that invoices reach the accounts-payable office while goods arrive at the warehouse
|
|
14
|
+
- A registered address that captures the legal domicile of a corporate partner for compliance, contract, and regulatory correspondence
|
|
15
|
+
- An OTHER classification for secondary or informal locations not covered by the primary types
|
|
16
|
+
- A default-per-type designation that downstream modules can resolve without bespoke selection logic
|
|
17
|
+
- Structured, country-aware address fields that support postal validation and country-specific formatting rules
|
|
18
|
+
- Independent address lifecycle — addresses can be added, updated, or removed without altering the partner's own record or status. Adding new addresses requires the partner to be in DRAFT or ACTIVE state; INACTIVE partners may only have their existing addresses read or updated, not extended with new entries
|
|
19
|
+
- Preservation of address history: removing an address that has been referenced on historical transactions is prevented to maintain referential integrity
|
|
20
|
+
|
|
21
|
+
## Process Flow
|
|
22
|
+
|
|
23
|
+
The following diagram shows the end-to-end flow for managing addresses on a partner:
|
|
24
|
+
|
|
25
|
+
```mermaid
|
|
26
|
+
flowchart TD
|
|
27
|
+
A[Partner exists in system] --> B[Add address to partner]
|
|
28
|
+
B --> C[Provide structured address fields\nline1, city, postalCode, country, addressType]
|
|
29
|
+
C --> D{Mark as default\nfor this type?}
|
|
30
|
+
D -->|Yes| E[Set isDefault = true\nfor this addressType]
|
|
31
|
+
D -->|No| F[Address saved as non-default]
|
|
32
|
+
E --> G[Previous default of same type\nautomatically unset]
|
|
33
|
+
G --> H[Address available for\ndownstream resolution]
|
|
34
|
+
F --> H
|
|
35
|
+
H --> I{Update needed?}
|
|
36
|
+
I -->|Yes| J[Update address fields]
|
|
37
|
+
J --> H
|
|
38
|
+
I -->|No| K{Remove address?}
|
|
39
|
+
K -->|Yes| L{Address referenced\non transactions?}
|
|
40
|
+
L -->|Yes| M[Reject removal —\npreserve referential integrity]
|
|
41
|
+
L -->|No| N[Delete address]
|
|
42
|
+
K -->|No| H
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The default-resolution flow used by downstream modules:
|
|
46
|
+
|
|
47
|
+
```mermaid
|
|
48
|
+
flowchart TD
|
|
49
|
+
A[Downstream module needs address] --> B[Specify partner + addressType]
|
|
50
|
+
B --> C{Default address\nexists for this type?}
|
|
51
|
+
C -->|Yes| D[Return default address]
|
|
52
|
+
C -->|No| E{Any address\nof this type exists?}
|
|
53
|
+
E -->|Yes| F[Return error —\ncaller must select explicitly]
|
|
54
|
+
E -->|No| G[Return error —\nno address of this type exists]
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Scenario Patterns
|
|
58
|
+
|
|
59
|
+
- **Separate billing and shipping**: A distributor's finance department is located at the head office, but deliveries go to a regional warehouse. Two addresses are added to the partner: one with type BILLING marked as default, one with type SHIPPING marked as default. Purchase orders automatically route the invoice to the head office and the shipment to the warehouse
|
|
60
|
+
- **Legal registered address**: A corporate partner is registered with a government authority at a different location from its operational offices. A REGISTERED address is added to hold the statutory address used for compliance filings and contract headers
|
|
61
|
+
- **Multiple shipping sites**: A large retail chain partner has three distribution centers. Three SHIPPING addresses are maintained; one is marked as the default and the others are available for explicit selection on individual orders
|
|
62
|
+
- **Address correction**: A partner's postal code changes after a municipal rezoning. The affected address record is updated in place without creating a new address or touching the partner's master record
|
|
63
|
+
- **Expanding to a new country**: A partner opens a new subsidiary in another country. A second BILLING address is added with the appropriate country code and regional postal format, and the default BILLING designation is moved to the new address
|
|
64
|
+
- **Removing an obsolete address**: A partner closes one of its warehouses. The corresponding SHIPPING address is removed, provided no open or historical transactions reference it
|
|
65
|
+
- **OTHER address for informal site**: A partner uses a forwarding agent at a location that does not fit BILLING, SHIPPING, or REGISTERED. An OTHER address is recorded to capture the forwarding address for ad hoc use
|
|
66
|
+
|
|
67
|
+
## Test Cases
|
|
68
|
+
|
|
69
|
+
- An address cannot be created without a valid, existing parent partner
|
|
70
|
+
- address fields line1, city, postalCode, country, and addressType are required at creation
|
|
71
|
+
- line2 is optional
|
|
72
|
+
- country must be a valid ISO 3166-1 alpha-2 code
|
|
73
|
+
- addressType must be one of BILLING, SHIPPING, REGISTERED, OTHER
|
|
74
|
+
- A partner may hold multiple addresses of the same type
|
|
75
|
+
- Setting isDefault = true for an addressType automatically unsets isDefault on any previous default of the same type for the same partner
|
|
76
|
+
- Only one address per partner per addressType may be marked as default at any time
|
|
77
|
+
- Retrieving the default address for a partner and type returns exactly the address with isDefault = true for that type
|
|
78
|
+
- A partner can have independent defaults for BILLING, SHIPPING, REGISTERED, and OTHER simultaneously
|
|
79
|
+
- Updating address fields (line1, line2, city, state, postalCode, country) on an existing address record is permitted
|
|
80
|
+
- addressType is immutable after creation; changing type requires deleting the old address and creating a new one
|
|
81
|
+
- Deleting an address that is referenced on a historical or open transaction is rejected to preserve referential integrity
|
|
82
|
+
- Deleting the default address of a type does not automatically promote another address of the same type to default; no default exists until one is explicitly set
|
|
83
|
+
- Querying addresses by partner returns all addresses for that partner
|
|
84
|
+
- Querying addresses by partner and addressType returns only addresses of the requested type
|
|
85
|
+
- A partner with no addresses returns an empty list, not an error
|
|
86
|
+
- Reading and updating existing addresses is permitted regardless of partner status (DRAFT, ACTIVE, or INACTIVE)
|
|
87
|
+
- Adding new addresses to a partner requires the partner to be in DRAFT or ACTIVE state; adding to an INACTIVE partner is rejected
|
|
88
|
+
- When no default address exists for a requested type, the system returns an error rather than silently picking an arbitrary address; the caller must either set a default or select an address explicitly
|
|
89
|
+
|
|
90
|
+
## Reference Links
|
|
91
|
+
|
|
92
|
+
- [SAP Business Partner Address Management (BP)](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/f76052846e404ea8811eb06534b6e099/5e13e82b8ca111d1a6090000e8353423.html)
|
|
93
|
+
- [Odoo Contact Addresses (child records under res.partner)](https://www.odoo.com/documentation/19.0/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/delivery_countries.html)
|
|
94
|
+
- [Dynamics 365 Party postal addresses](https://learn.microsoft.com/en-us/dynamics365/finance/accounts-payable/vendor-posting-profiles)
|
|
95
|
+
- [Oracle Supplier Sites and Addresses](https://docs.oracle.com/en/cloud/saas/procurement/24d/faaps/supplier-addresses.html)
|
|
96
|
+
- [ISO 3166-1 alpha-2 Country Codes](https://www.iso.org/iso-3166-country-codes.html)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Partner Bank Account
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Partner Bank Accounts are child entities of a Business Partner that store the banking details required to execute financial transactions with that partner. Each record captures identifying information for a single bank account: bank name, account holder name, account number, routing number, IBAN, SWIFT/BIC, and the transaction currency. A partner may hold multiple bank accounts, and one account per partner may be designated as the default to streamline payment processing.
|
|
6
|
+
|
|
7
|
+
Bank account records can be created and maintained regardless of the partner's current lifecycle state (DRAFT, ACTIVE, or INACTIVE), allowing finance teams to prepare payment details in advance and retain them after a partner is deactivated.
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
Accurate bank account data is a prerequisite for both accounts payable (paying suppliers) and accounts receivable (collecting from customers). Maintaining this data on the partner record ensures downstream payment and collection workflows always have a reliable, auditable source:
|
|
12
|
+
|
|
13
|
+
- **Accounts payable**: Supplier bank details are referenced when generating payment runs, wire transfers, or ACH batches for purchase invoices
|
|
14
|
+
- **Accounts receivable**: Customer bank details support direct debit collection and refund processing
|
|
15
|
+
- **Multi-account flexibility**: Partners operating across multiple currencies or banking jurisdictions can have separate accounts per bank or currency
|
|
16
|
+
- **Default designation**: Finance teams can mark one account as default to reduce manual selection during routine payment processing
|
|
17
|
+
- **Regional field coverage**: The model supports both account-number/routing-number conventions (US/Canada) and IBAN/SWIFT conventions (Europe and international), enabling global counterparty management
|
|
18
|
+
- **Currency association**: Each bank account references a Currency from the primitives module, clarifying which denomination the account handles
|
|
19
|
+
|
|
20
|
+
## Process Flow
|
|
21
|
+
|
|
22
|
+
The following diagram shows how a bank account is added to a partner and how the default designation is managed:
|
|
23
|
+
|
|
24
|
+
```mermaid
|
|
25
|
+
flowchart TD
|
|
26
|
+
A[Select Business Partner] --> B[Add Bank Account]
|
|
27
|
+
B --> C[Enter Bank Details\nbankName, accountHolderName,\naccountNumber / IBAN,\nroutingNumber / SWIFT/BIC,\ncurrency]
|
|
28
|
+
C --> D{First account\nfor this partner?}
|
|
29
|
+
D -->|Yes| E[Auto-designate as default]
|
|
30
|
+
D -->|No| F[Save as non-default]
|
|
31
|
+
E --> G[Bank Account Saved]
|
|
32
|
+
F --> G
|
|
33
|
+
G --> H{Change default?}
|
|
34
|
+
H -->|Yes| I[Mark account as default\nPrevious default is unset]
|
|
35
|
+
H -->|No| J[No further action]
|
|
36
|
+
I --> K[Default Updated]
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Scenario Patterns
|
|
40
|
+
|
|
41
|
+
- **New supplier payment setup**: A procurement team onboards a new vendor. Before the first purchase order is issued, the AP team adds the supplier's EUR bank account (IBAN + SWIFT/BIC) and it is automatically designated as the default. Payment runs will reference this account.
|
|
42
|
+
- **US domestic vendor with routing**: A US-based supplier provides an ABA routing number and checking account number instead of an IBAN. Finance adds the account using `routingNumber` and `accountNumber` fields, omitting IBAN and SWIFT/BIC.
|
|
43
|
+
- **Multi-currency supplier**: An international supplier invoices in both USD and EUR. Two bank accounts are added — one per currency — each referencing the appropriate Currency from the primitives module. The USD account is marked as the default for domestic transactions.
|
|
44
|
+
- **Customer direct debit**: A customer agreement includes a direct debit mandate. The AR team records the customer's bank account so that collection runs can reference it without re-entering details each cycle.
|
|
45
|
+
- **Updating the default account**: A supplier notifies the company of a new primary bank account. The finance team adds the new account and marks it as default; the previous default account is retained for reference and audit but is no longer automatically selected.
|
|
46
|
+
- **Inactive partner retention**: A vendor is deactivated following contract expiry. Their bank accounts remain in the system for audit and potential reactivation, but the partner cannot be referenced in new payment runs while INACTIVE.
|
|
47
|
+
|
|
48
|
+
## Test Cases
|
|
49
|
+
|
|
50
|
+
- A bank account can be added to a partner in DRAFT, ACTIVE, or INACTIVE state
|
|
51
|
+
- The first bank account added to a partner is automatically designated as the default
|
|
52
|
+
- A partner can have more than one bank account
|
|
53
|
+
- Marking a bank account as default unsets the default flag on all other accounts for that partner
|
|
54
|
+
- At most one bank account per partner can be designated as default at any time
|
|
55
|
+
- `bankName` is required and must be non-empty
|
|
56
|
+
- `accountHolderName` is required and must be non-empty
|
|
57
|
+
- At least one of `accountNumber` or `iban` must be provided; both may be provided simultaneously
|
|
58
|
+
- `routingNumber` is optional and applicable for domestic (ACH/wire) routing conventions
|
|
59
|
+
- `swiftBic` is optional and applicable for international transfers
|
|
60
|
+
- `currency` must reference a valid, existing Currency from the primitives module
|
|
61
|
+
- Removing a bank account that is currently designated as the default does not automatically promote another account; the partner has no default until one is explicitly designated
|
|
62
|
+
- Bank accounts are isolated per partner; accounts belonging to one partner are not visible on another
|
|
63
|
+
|
|
64
|
+
## Reference Links
|
|
65
|
+
|
|
66
|
+
- [SAP Business Partner Bank Details](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/f325a3e3a5514e85aab72db8bab710c8/4b2011bb2d6b3e41e10000000a42189c.html)
|
|
67
|
+
- [Odoo Partner Bank Accounts (res.partner.bank)](https://www.odoo.com/documentation/19.0/applications/accounting/payments/pay.html)
|
|
68
|
+
- [Oracle Supplier Bank Accounts](https://docs.oracle.com/en/cloud/saas/financials/24b/fappp/manage-supplier-bank-accounts.html)
|
|
69
|
+
- [ISO 9362 SWIFT/BIC Standard](https://www.iso.org/standard/60390.html)
|
|
70
|
+
- [ISO 13616 IBAN Standard](https://www.iso.org/standard/81090.html)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Partner Identification
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Partner Identification allows storing official registration numbers — such as tax IDs, VAT numbers, DUNS numbers, and company registry codes — against a business partner. Each identification record captures the type, value, and optional metadata including issuing country and validity period. A single partner can hold multiple identification records of different types, reflecting the reality that organisations are often registered across multiple jurisdictions or recognised by more than one authority.
|
|
6
|
+
|
|
7
|
+
Identifications are child entities of a business partner and can be added at any point in the partner's lifecycle. Uniqueness is enforced on the combination of type and value within a company scope, preventing the same registration number from being attached to duplicate partner records. This scoping is intentionally company-level; cross-company deduplication is out of scope for the initial implementation and may be introduced as a future enhancement if shared-counterparty scenarios arise.
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
Accurate partner identification data is required for legal compliance and operational integrity:
|
|
12
|
+
|
|
13
|
+
- **Tax reporting and invoicing**: Tax ID and VAT number must appear on invoices in many jurisdictions. Storing them on the partner record ensures they are available for document generation without manual entry
|
|
14
|
+
- **Know Your Customer (KYC)**: Onboarding processes in regulated industries require verified registration numbers to confirm a partner's legal identity before commencing trade
|
|
15
|
+
- **Duplicate detection**: Enforcing uniqueness on (type, value) within a company scope prevents the same real-world entity from existing as multiple partner records
|
|
16
|
+
- **Cross-border trade**: A partner operating in multiple countries may hold a domestic tax ID, a regional VAT number (e.g., EU VAT), and an international identifier (e.g., DUNS). All can be stored concurrently
|
|
17
|
+
- **Audit trail and compliance**: Validity dates on identification records support time-bounded compliance checks and historical audit requirements
|
|
18
|
+
|
|
19
|
+
## Process Flow
|
|
20
|
+
|
|
21
|
+
The typical flow for recording and using partner identifications:
|
|
22
|
+
|
|
23
|
+
```mermaid
|
|
24
|
+
flowchart TD
|
|
25
|
+
A[Select Business Partner] --> B[Add Identification]
|
|
26
|
+
B --> C{Type already present\nwith same value?}
|
|
27
|
+
C -->|Yes - duplicate| D[Reject: uniqueness violation]
|
|
28
|
+
C -->|No| E[Store Identification\ntype + value + metadata]
|
|
29
|
+
E --> F{More IDs to add?}
|
|
30
|
+
F -->|Yes| B
|
|
31
|
+
F -->|No| G[Partner Identifications Complete]
|
|
32
|
+
G --> H[Use in invoicing / tax reporting / KYC]
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Identification validity is checked at the point of use:
|
|
36
|
+
|
|
37
|
+
```mermaid
|
|
38
|
+
flowchart TD
|
|
39
|
+
A[Retrieve Partner Identification] --> B{validFrom / validTo set?}
|
|
40
|
+
B -->|No| C[Identification is always valid]
|
|
41
|
+
B -->|Yes| D{Current date within range?}
|
|
42
|
+
D -->|Yes| E[Identification is valid]
|
|
43
|
+
D -->|No| F[Identification is expired or not yet active]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Scenario Patterns
|
|
47
|
+
|
|
48
|
+
- **Domestic tax registration**: A supplier is onboarded for a single country. A `TAX_ID` identification is added with the national tax number and the issuing country set to the supplier's home country
|
|
49
|
+
- **EU VAT number**: A European partner holds both a domestic `TAX_ID` and an EU-wide `VAT` number. Both are stored as separate identification records on the same partner
|
|
50
|
+
- **DUNS for procurement**: A large enterprise uses DUNS numbers in its supplier qualification process. A `DUNS` identification is added and used to cross-reference the partner against third-party credit and risk databases
|
|
51
|
+
- **Company registry reference**: A partner's legal registration number from a national company registry is stored as `COMPANY_REGISTRY`, enabling verification against public registers
|
|
52
|
+
- **National ID for individual partners**: An individual business partner (e.g., a sole trader) has a `NATIONAL_ID` stored as their primary identification
|
|
53
|
+
- **Time-bounded VAT registration**: A partner's VAT registration is valid from a specific date. The `validFrom` field is set so that downstream processes can determine whether the VAT number applies to a given transaction date
|
|
54
|
+
- **Duplicate partner prevention**: An operator attempts to add a `TAX_ID` with a value already recorded on another partner. The system rejects the entry, surfacing the conflict so the operator can merge or review the existing partner record
|
|
55
|
+
- **Other / custom identifiers**: A partner holds an identifier that does not fit any standard type (e.g., an industry-specific accreditation number). It is stored under type `OTHER` with a descriptive value
|
|
56
|
+
|
|
57
|
+
## Test Cases
|
|
58
|
+
|
|
59
|
+
- An identification requires both `type` and `value`; records missing either field are rejected
|
|
60
|
+
- Supported types are: `TAX_ID`, `VAT`, `DUNS`, `COMPANY_REGISTRY`, `NATIONAL_ID`, `OTHER`
|
|
61
|
+
- The combination of (type, value) must be unique within the company scope (intentionally company-level; cross-company deduplication is not enforced); attempting to create a duplicate within the same company is rejected
|
|
62
|
+
- A single partner can hold multiple identification records with different types
|
|
63
|
+
- Two partners may not share an identification record with the same (type, value) combination
|
|
64
|
+
- `issuingCountry`, `validFrom`, and `validTo` are optional and may be omitted
|
|
65
|
+
- When both `validFrom` and `validTo` are set, `validTo` must be equal to or later than `validFrom`
|
|
66
|
+
- Identifications can be added to partners in any lifecycle state (DRAFT, ACTIVE, INACTIVE)
|
|
67
|
+
- An identification record can be deleted without affecting the parent partner or other identifications
|
|
68
|
+
- `type` is immutable after creation; changing the identification type requires deleting the existing record and creating a new one
|
|
69
|
+
- Updating an identification's value must re-validate the (type, value) uniqueness constraint
|
|
70
|
+
|
|
71
|
+
## Reference Links
|
|
72
|
+
|
|
73
|
+
- [SAP Business Partner — Tax Numbers and Identification](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/f544846954f24b9183edd4ca52275847/d6a0de9fd00f4ab2843e013d7a8f5380.html)
|
|
74
|
+
- [Odoo Fiscal Information — VAT and Company Registry](https://www.odoo.com/documentation/19.0/applications/accounting/accounting/taxes/taxcloud.html)
|
|
75
|
+
- [Oracle Supplier Tax Registrations](https://docs.oracle.com/en/cloud/saas/financials/24a/fappp/supplier-registration.html)
|
|
76
|
+
- [DUNS Number — Dun & Bradstreet](https://www.dnb.com/duns-number.html)
|