@tailor-platform/erp-kit 0.2.0 → 0.2.2
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 +12 -0
- package/README.md +3 -26
- package/dist/cli.mjs +1613 -0
- package/package.json +14 -13
- package/schemas/app-compose/business-flow.yml +3 -0
- package/schemas/app-compose/story.yml +13 -1
- package/schemas/module/command.yml +9 -0
- package/schemas/module/module.yml +4 -0
- package/schemas/module/query.yml +9 -0
- package/skills/erp-kit-app-1-requirements/SKILL.md +8 -14
- package/skills/erp-kit-app-2-requirements-review/SKILL.md +102 -0
- package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +66 -0
- package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +69 -0
- package/skills/erp-kit-app-2-requirements-review/references/requirements-report-format.md +25 -0
- package/skills/erp-kit-app-3-plan/SKILL.md +157 -0
- package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +107 -0
- package/skills/erp-kit-app-3-plan/references/screen-extraction.md +74 -0
- package/skills/erp-kit-app-3-plan/references/story-extraction.md +86 -0
- package/skills/erp-kit-app-4-plan-review/SKILL.md +177 -0
- package/skills/erp-kit-app-4-plan-review/references/actor-flow-parity.md +73 -0
- package/skills/erp-kit-app-4-plan-review/references/business-flow-story-parity.md +86 -0
- package/skills/erp-kit-app-4-plan-review/references/orphan-detection.md +69 -0
- package/skills/erp-kit-app-4-plan-review/references/parity-report-format.md +52 -0
- package/skills/erp-kit-app-4-plan-review/references/story-resolver-parity.md +83 -0
- package/skills/erp-kit-app-4-plan-review/references/story-screen-parity.md +73 -0
- package/skills/erp-kit-app-5-impl-backend/SKILL.md +105 -0
- package/skills/erp-kit-app-5-impl-backend/references/app-config.md +38 -0
- package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +48 -0
- package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +68 -0
- package/skills/erp-kit-app-6-impl-frontend/SKILL.md +74 -0
- package/skills/erp-kit-app-6-impl-frontend/references/pages.md +160 -0
- package/skills/erp-kit-app-7-impl-review/SKILL.md +176 -0
- package/skills/erp-kit-app-7-impl-review/references/impl-parity-report-format.md +52 -0
- package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +84 -0
- package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +86 -0
- package/skills/erp-kit-app-7-impl-review/references/screen-doc-code-parity.md +86 -0
- package/skills/erp-kit-module-1-requirements/SKILL.md +126 -0
- package/skills/erp-kit-module-1-requirements/references/boundary-analysis.md +51 -0
- package/skills/erp-kit-module-1-requirements/references/erp-research.md +57 -0
- package/skills/erp-kit-module-1-requirements/references/feature-doc.md +61 -0
- package/skills/erp-kit-module-2-requirements-review/SKILL.md +112 -0
- package/skills/erp-kit-module-2-requirements-review/references/best-practices-check.md +79 -0
- package/skills/erp-kit-module-2-requirements-review/references/boundary-consistency-check.md +70 -0
- package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +25 -0
- package/skills/erp-kit-module-3-plan/SKILL.md +107 -0
- package/skills/erp-kit-module-3-plan/references/command-extraction.md +87 -0
- package/skills/erp-kit-module-3-plan/references/model-extraction.md +72 -0
- package/skills/erp-kit-module-3-plan/references/query-extraction.md +59 -0
- package/skills/erp-kit-module-4-plan-review/SKILL.md +158 -0
- package/skills/erp-kit-module-4-plan-review/references/command-model-consistency.md +46 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-command-parity.md +97 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-model-parity.md +47 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-query-parity.md +70 -0
- package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +52 -0
- package/skills/erp-kit-module-5-impl/SKILL.md +118 -0
- package/skills/erp-kit-module-5-impl/references/command-impl.md +68 -0
- package/skills/erp-kit-module-5-impl/references/exports.md +10 -0
- package/skills/erp-kit-module-5-impl/references/model-impl.md +45 -0
- package/skills/erp-kit-module-5-impl/references/query-impl.md +53 -0
- package/skills/erp-kit-module-6-impl-review/SKILL.md +187 -0
- package/skills/erp-kit-module-6-impl-review/references/command-doc-code-parity.md +92 -0
- package/skills/erp-kit-module-6-impl-review/references/command-doc-test-parity.md +93 -0
- package/skills/erp-kit-module-6-impl-review/references/error-implementation-parity.md +95 -0
- package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/errors.md +1 -1
- package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +52 -0
- package/skills/erp-kit-module-6-impl-review/references/model-doc-code-parity.md +80 -0
- package/skills/erp-kit-module-shared/SKILL.md +1 -1
- package/skills/erp-kit-module-shared/references/commands.md +1 -1
- package/skills/erp-kit-module-shared/references/errors.md +12 -9
- package/skills/erp-kit-module-shared/references/queries.md +109 -36
- package/skills/erp-kit-module-shared/references/testing.md +10 -0
- package/skills/erp-kit-update/SKILL.md +2 -2
- package/src/app.ts +1 -1
- package/src/commands/check.ts +1 -1
- package/src/commands/index.ts +16 -5
- package/src/commands/init.test.ts +22 -69
- package/src/commands/init.ts +28 -115
- package/src/commands/lib/distribute.test.ts +126 -0
- package/src/commands/lib/distribute.ts +129 -0
- package/src/commands/parse-doc-test-cases.ts +55 -0
- package/src/commands/scaffold.test.ts +74 -33
- package/src/commands/scaffold.ts +54 -18
- package/src/commands/sync-check.test.ts +173 -0
- package/src/commands/sync-check.ts +103 -2
- package/src/commands/update.test.ts +87 -0
- package/src/commands/update.ts +41 -0
- package/src/generator/generate-code.test.ts +23 -12
- package/src/generator/generate-code.ts +22 -16
- package/src/integration.test.ts +1 -1
- package/src/module.ts +20 -65
- package/src/modules/item-management/README.md +8 -0
- package/src/modules/item-management/command/activateItem.generated.ts +1 -1
- package/src/modules/item-management/command/activateItem.test.ts +12 -18
- package/src/modules/item-management/command/activateItem.ts +9 -5
- package/src/modules/item-management/command/assignItemToTaxonomy.generated.ts +1 -1
- package/src/modules/item-management/command/assignItemToTaxonomy.test.ts +10 -24
- package/src/modules/item-management/command/assignItemToTaxonomy.ts +19 -16
- package/src/modules/item-management/command/createItem.generated.ts +1 -1
- package/src/modules/item-management/command/createItem.test.ts +11 -11
- package/src/modules/item-management/command/createItem.ts +16 -7
- package/src/modules/item-management/command/createTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/createTaxonomyNode.test.ts +9 -9
- package/src/modules/item-management/command/createTaxonomyNode.ts +33 -14
- package/src/modules/item-management/command/deactivateItem.generated.ts +1 -1
- package/src/modules/item-management/command/deactivateItem.test.ts +12 -18
- package/src/modules/item-management/command/deactivateItem.ts +9 -5
- package/src/modules/item-management/command/deleteItem.generated.ts +1 -1
- package/src/modules/item-management/command/deleteItem.test.ts +10 -16
- package/src/modules/item-management/command/deleteItem.ts +9 -5
- package/src/modules/item-management/command/deleteTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/deleteTaxonomyNode.test.ts +10 -16
- package/src/modules/item-management/command/deleteTaxonomyNode.ts +22 -12
- package/src/modules/item-management/command/moveTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/moveTaxonomyNode.test.ts +10 -10
- package/src/modules/item-management/command/moveTaxonomyNode.ts +63 -19
- package/src/modules/item-management/command/reactivateItem.generated.ts +1 -1
- package/src/modules/item-management/command/reactivateItem.test.ts +12 -18
- package/src/modules/item-management/command/reactivateItem.ts +9 -5
- package/src/modules/item-management/command/removeItemFromTaxonomy.generated.ts +1 -1
- package/src/modules/item-management/command/removeItemFromTaxonomy.test.ts +9 -16
- package/src/modules/item-management/command/removeItemFromTaxonomy.ts +11 -6
- package/src/modules/item-management/command/updateItem.generated.ts +1 -1
- package/src/modules/item-management/command/updateItem.test.ts +16 -16
- package/src/modules/item-management/command/updateItem.ts +11 -6
- package/src/modules/item-management/command/updateTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/updateTaxonomyNode.test.ts +14 -20
- package/src/modules/item-management/command/updateTaxonomyNode.ts +9 -6
- package/src/modules/item-management/docs/commands/ActivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/AssignItemToTaxonomy.md +7 -0
- package/src/modules/item-management/docs/commands/CreateItem.md +10 -0
- package/src/modules/item-management/docs/commands/CreateTaxonomyNode.md +9 -0
- package/src/modules/item-management/docs/commands/DeactivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/DeleteItem.md +7 -0
- package/src/modules/item-management/docs/commands/DeleteTaxonomyNode.md +7 -0
- package/src/modules/item-management/docs/commands/MoveTaxonomyNode.md +10 -0
- package/src/modules/item-management/docs/commands/ReactivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/RemoveItemFromTaxonomy.md +5 -0
- package/src/modules/item-management/docs/commands/UpdateItem.md +15 -0
- package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +9 -0
- package/src/modules/item-management/docs/queries/CalculateNodeDepth.md +8 -0
- package/src/modules/item-management/docs/queries/CalculateSubtreeDepth.md +7 -0
- package/src/modules/item-management/docs/queries/DetectCircularReference.md +9 -0
- package/src/modules/item-management/docs/queries/GetItem.md +9 -0
- package/src/modules/item-management/docs/queries/GetItemTaxonomyAssignment.md +5 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNode.md +7 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNodeAssignments.md +5 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNodeChildren.md +6 -0
- package/src/modules/item-management/index.ts +0 -51
- package/src/modules/item-management/lib/errors.generated.ts +24 -24
- package/src/modules/item-management/lib/permissions.generated.ts +1 -1
- package/src/modules/item-management/lib/types.ts +1 -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.test.ts +21 -6
- package/src/modules/item-management/query/calculateNodeDepth.ts +2 -2
- package/src/modules/item-management/query/calculateSubtreeDepth.generated.ts +1 -1
- package/src/modules/item-management/query/calculateSubtreeDepth.test.ts +17 -5
- package/src/modules/item-management/query/calculateSubtreeDepth.ts +2 -2
- package/src/modules/item-management/query/detectCircularReference.generated.ts +1 -1
- package/src/modules/item-management/query/detectCircularReference.test.ts +25 -7
- package/src/modules/item-management/query/detectCircularReference.ts +4 -4
- package/src/modules/item-management/query/getItem.generated.ts +1 -1
- package/src/modules/item-management/query/getItem.test.ts +25 -7
- package/src/modules/item-management/query/getItem.ts +2 -2
- package/src/modules/item-management/query/getItemTaxonomyAssignment.generated.ts +1 -1
- package/src/modules/item-management/query/getItemTaxonomyAssignment.test.ts +9 -3
- package/src/modules/item-management/query/getItemTaxonomyAssignment.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNode.test.ts +17 -5
- package/src/modules/item-management/query/getTaxonomyNode.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.test.ts +9 -3
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNodeChildren.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeChildren.test.ts +13 -4
- package/src/modules/item-management/query/getTaxonomyNodeChildren.ts +2 -2
- package/src/modules/item-management/tailor.config.ts +6 -4
- package/src/modules/item-management/tailor.d.ts +13 -0
- package/src/modules/primitives/README.md +8 -0
- package/src/modules/primitives/command/activateCategory.generated.ts +1 -1
- package/src/modules/primitives/command/activateCategory.test.ts +8 -18
- package/src/modules/primitives/command/activateCategory.ts +9 -5
- package/src/modules/primitives/command/activateCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/activateCurrency.test.ts +8 -18
- package/src/modules/primitives/command/activateCurrency.ts +9 -5
- package/src/modules/primitives/command/activateUnit.generated.ts +1 -1
- package/src/modules/primitives/command/activateUnit.test.ts +8 -15
- package/src/modules/primitives/command/activateUnit.ts +9 -5
- package/src/modules/primitives/command/createCategory.generated.ts +1 -1
- package/src/modules/primitives/command/createCategory.test.ts +29 -44
- package/src/modules/primitives/command/createCategory.ts +9 -5
- package/src/modules/primitives/command/createCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/createCurrency.test.ts +53 -78
- package/src/modules/primitives/command/createCurrency.ts +9 -6
- package/src/modules/primitives/command/createExchangeRate.generated.ts +1 -1
- package/src/modules/primitives/command/createExchangeRate.test.ts +59 -97
- package/src/modules/primitives/command/createExchangeRate.ts +13 -7
- package/src/modules/primitives/command/createUnit.generated.ts +1 -1
- package/src/modules/primitives/command/createUnit.test.ts +59 -90
- package/src/modules/primitives/command/createUnit.ts +9 -6
- package/src/modules/primitives/command/deactivateCategory.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateCategory.test.ts +15 -33
- package/src/modules/primitives/command/deactivateCategory.ts +9 -5
- package/src/modules/primitives/command/deactivateCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateCurrency.test.ts +12 -26
- package/src/modules/primitives/command/deactivateCurrency.ts +9 -5
- package/src/modules/primitives/command/deactivateUnit.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateUnit.test.ts +15 -30
- package/src/modules/primitives/command/deactivateUnit.ts +14 -7
- package/src/modules/primitives/command/setBaseCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/setBaseCurrency.test.ts +18 -40
- package/src/modules/primitives/command/setBaseCurrency.ts +15 -7
- package/src/modules/primitives/command/setReferenceUnit.generated.ts +1 -1
- package/src/modules/primitives/command/setReferenceUnit.test.ts +22 -44
- package/src/modules/primitives/command/setReferenceUnit.ts +21 -9
- package/src/modules/primitives/docs/commands/ActivateCategory.md +6 -0
- package/src/modules/primitives/docs/commands/ActivateCurrency.md +6 -0
- package/src/modules/primitives/docs/commands/ActivateUnit.md +6 -0
- package/src/modules/primitives/docs/commands/CreateCategory.md +6 -0
- package/src/modules/primitives/docs/commands/CreateCurrency.md +10 -0
- package/src/modules/primitives/docs/commands/CreateExchangeRate.md +11 -0
- package/src/modules/primitives/docs/commands/CreateUnit.md +10 -0
- package/src/modules/primitives/docs/commands/DeactivateCategory.md +7 -0
- package/src/modules/primitives/docs/commands/DeactivateCurrency.md +7 -0
- package/src/modules/primitives/docs/commands/DeactivateUnit.md +7 -0
- package/src/modules/primitives/docs/commands/SetBaseCurrency.md +7 -0
- package/src/modules/primitives/docs/commands/SetReferenceUnit.md +7 -0
- package/src/modules/primitives/docs/queries/ConvertAmount.md +14 -0
- package/src/modules/primitives/docs/queries/ConvertQuantity.md +13 -0
- package/src/modules/primitives/docs/queries/GetBaseCurrency.md +5 -0
- package/src/modules/primitives/docs/queries/GetCurrency.md +7 -0
- package/src/modules/primitives/docs/queries/GetUnit.md +7 -0
- package/src/modules/primitives/docs/queries/GetUoMCategory.md +7 -0
- package/src/modules/primitives/docs/queries/ListUnitsByCategory.md +15 -5
- package/src/modules/primitives/index.ts +0 -49
- package/src/modules/primitives/lib/errors.generated.ts +23 -23
- package/src/modules/primitives/lib/permissions.generated.ts +1 -1
- package/src/modules/primitives/lib/types.ts +1 -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 +110 -77
- package/src/modules/primitives/query/convertAmount.ts +61 -47
- package/src/modules/primitives/query/convertQuantity.generated.ts +1 -1
- package/src/modules/primitives/query/convertQuantity.test.ts +99 -69
- package/src/modules/primitives/query/convertQuantity.ts +12 -10
- package/src/modules/primitives/query/getBaseCurrency.generated.ts +1 -1
- package/src/modules/primitives/query/getBaseCurrency.test.ts +10 -4
- package/src/modules/primitives/query/getBaseCurrency.ts +2 -2
- package/src/modules/primitives/query/getCurrency.generated.ts +1 -1
- package/src/modules/primitives/query/getCurrency.test.ts +17 -5
- package/src/modules/primitives/query/getCurrency.ts +2 -2
- package/src/modules/primitives/query/getUnit.generated.ts +1 -1
- package/src/modules/primitives/query/getUnit.test.ts +17 -5
- package/src/modules/primitives/query/getUnit.ts +2 -2
- package/src/modules/primitives/query/getUoMCategory.generated.ts +1 -1
- package/src/modules/primitives/query/getUoMCategory.test.ts +17 -5
- package/src/modules/primitives/query/getUoMCategory.ts +2 -2
- package/src/modules/primitives/query/listUnitsByCategory.generated.ts +1 -1
- package/src/modules/primitives/query/listUnitsByCategory.test.ts +80 -0
- package/src/modules/primitives/query/listUnitsByCategory.ts +19 -3
- package/src/modules/primitives/tailor.config.ts +6 -4
- package/src/modules/primitives/tailor.d.ts +13 -0
- package/src/modules/product-management/README.md +52 -0
- package/src/modules/product-management/command/activateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/activateProduct.test.ts +40 -0
- package/src/modules/product-management/command/activateProduct.ts +42 -0
- package/src/modules/product-management/command/assignProductToCategory.generated.ts +6 -0
- package/src/modules/product-management/command/assignProductToCategory.test.ts +90 -0
- package/src/modules/product-management/command/assignProductToCategory.ts +62 -0
- package/src/modules/product-management/command/createProduct.generated.ts +6 -0
- package/src/modules/product-management/command/createProduct.test.ts +149 -0
- package/src/modules/product-management/command/createProduct.ts +73 -0
- package/src/modules/product-management/command/createProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/createProductAttribute.test.ts +70 -0
- package/src/modules/product-management/command/createProductAttribute.ts +53 -0
- package/src/modules/product-management/command/createProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/createProductAttributeValue.test.ts +68 -0
- package/src/modules/product-management/command/createProductAttributeValue.ts +63 -0
- package/src/modules/product-management/command/createProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/createProductCategory.test.ts +135 -0
- package/src/modules/product-management/command/createProductCategory.ts +82 -0
- package/src/modules/product-management/command/deactivateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/deactivateProduct.test.ts +40 -0
- package/src/modules/product-management/command/deactivateProduct.ts +42 -0
- package/src/modules/product-management/command/deleteProduct.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProduct.test.ts +42 -0
- package/src/modules/product-management/command/deleteProduct.ts +42 -0
- package/src/modules/product-management/command/deleteProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductAttribute.test.ts +49 -0
- package/src/modules/product-management/command/deleteProductAttribute.ts +45 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.test.ts +71 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.ts +68 -0
- package/src/modules/product-management/command/deleteProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductCategory.test.ts +74 -0
- package/src/modules/product-management/command/deleteProductCategory.ts +53 -0
- package/src/modules/product-management/command/generateVariants.generated.ts +6 -0
- package/src/modules/product-management/command/generateVariants.test.ts +365 -0
- package/src/modules/product-management/command/generateVariants.ts +168 -0
- package/src/modules/product-management/command/moveProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/moveProductCategory.test.ts +170 -0
- package/src/modules/product-management/command/moveProductCategory.ts +124 -0
- package/src/modules/product-management/command/reactivateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/reactivateProduct.test.ts +40 -0
- package/src/modules/product-management/command/reactivateProduct.ts +42 -0
- package/src/modules/product-management/command/removeProductFromCategory.generated.ts +6 -0
- package/src/modules/product-management/command/removeProductFromCategory.test.ts +42 -0
- package/src/modules/product-management/command/removeProductFromCategory.ts +32 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.generated.ts +6 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.test.ts +206 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.ts +102 -0
- package/src/modules/product-management/command/updateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/updateProduct.test.ts +168 -0
- package/src/modules/product-management/command/updateProduct.ts +95 -0
- package/src/modules/product-management/command/updateProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductAttribute.test.ts +101 -0
- package/src/modules/product-management/command/updateProductAttribute.ts +68 -0
- package/src/modules/product-management/command/updateProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductAttributeValue.test.ts +80 -0
- package/src/modules/product-management/command/updateProductAttributeValue.ts +58 -0
- package/src/modules/product-management/command/updateProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductCategory.test.ts +80 -0
- package/src/modules/product-management/command/updateProductCategory.ts +66 -0
- package/src/modules/product-management/db/product.ts +47 -0
- package/src/modules/product-management/db/productAttribute.ts +26 -0
- package/src/modules/product-management/db/productAttributeAssignment.ts +58 -0
- package/src/modules/product-management/db/productAttributeValue.ts +39 -0
- package/src/modules/product-management/db/productCategory.ts +34 -0
- package/src/modules/product-management/db/productCategoryAssignment.ts +49 -0
- package/src/modules/product-management/db/productVariant.ts +52 -0
- package/src/modules/product-management/docs/commands/ActivateProduct.md +39 -0
- package/src/modules/product-management/docs/commands/AssignProductToCategory.md +43 -0
- package/src/modules/product-management/docs/commands/CreateProduct.md +48 -0
- package/src/modules/product-management/docs/commands/CreateProductAttribute.md +39 -0
- package/src/modules/product-management/docs/commands/CreateProductAttributeValue.md +42 -0
- package/src/modules/product-management/docs/commands/CreateProductCategory.md +54 -0
- package/src/modules/product-management/docs/commands/DeactivateProduct.md +39 -0
- package/src/modules/product-management/docs/commands/DeleteProduct.md +42 -0
- package/src/modules/product-management/docs/commands/DeleteProductAttribute.md +39 -0
- package/src/modules/product-management/docs/commands/DeleteProductAttributeValue.md +42 -0
- package/src/modules/product-management/docs/commands/DeleteProductCategory.md +43 -0
- package/src/modules/product-management/docs/commands/GenerateVariants.md +68 -0
- package/src/modules/product-management/docs/commands/MoveProductCategory.md +54 -0
- package/src/modules/product-management/docs/commands/ReactivateProduct.md +38 -0
- package/src/modules/product-management/docs/commands/RemoveProductFromCategory.md +34 -0
- package/src/modules/product-management/docs/commands/SetProductAttributeAssignment.md +62 -0
- package/src/modules/product-management/docs/commands/UpdateProduct.md +61 -0
- package/src/modules/product-management/docs/commands/UpdateProductAttribute.md +46 -0
- package/src/modules/product-management/docs/commands/UpdateProductAttributeValue.md +47 -0
- package/src/modules/product-management/docs/commands/UpdateProductCategory.md +46 -0
- package/src/modules/product-management/docs/features/attribute-management.md +48 -0
- package/src/modules/product-management/docs/features/product-category.md +71 -0
- package/src/modules/product-management/docs/features/product-lifecycle.md +66 -0
- package/src/modules/product-management/docs/features/variant-generation.md +77 -0
- package/src/modules/product-management/docs/models/Product.md +58 -0
- package/src/modules/product-management/docs/models/ProductAttribute.md +37 -0
- package/src/modules/product-management/docs/models/ProductAttributeAssignment.md +41 -0
- package/src/modules/product-management/docs/models/ProductAttributeValue.md +40 -0
- package/src/modules/product-management/docs/models/ProductCategory.md +46 -0
- package/src/modules/product-management/docs/models/ProductCategoryAssignment.md +37 -0
- package/src/modules/product-management/docs/models/ProductVariant.md +41 -0
- package/src/modules/product-management/docs/queries/CalculateCategoryDepth.md +47 -0
- package/src/modules/product-management/docs/queries/DetectCategoryCircularReference.md +51 -0
- package/src/modules/product-management/docs/queries/GetProduct.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductAttribute.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductAttributeAssignment.md +34 -0
- package/src/modules/product-management/docs/queries/GetProductAttributeValue.md +40 -0
- package/src/modules/product-management/docs/queries/GetProductCategory.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductCategoryAssignment.md +34 -0
- package/src/modules/product-management/docs/queries/GetProductVariant.md +41 -0
- package/src/modules/product-management/docs/queries/ListAttributeAssignmentsByAttribute.md +34 -0
- package/src/modules/product-management/docs/queries/ListCategoryAssignmentsByProduct.md +35 -0
- package/src/modules/product-management/docs/queries/ListProductAttributeAssignments.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductAttributeValues.md +36 -0
- package/src/modules/product-management/docs/queries/ListProductCategoryAssignments.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductCategoryChildren.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductVariants.md +34 -0
- package/src/modules/product-management/generated/enums.ts +9 -0
- package/src/modules/product-management/generated/kysely-tailordb.ts +100 -0
- package/src/modules/product-management/index.ts +2 -0
- package/src/modules/product-management/lib/_db_deps.ts +17 -0
- package/src/modules/product-management/lib/errors.generated.ts +152 -0
- package/src/modules/product-management/lib/permissions.generated.ts +25 -0
- package/src/modules/product-management/lib/types.ts +51 -0
- package/src/modules/product-management/module.ts +201 -0
- package/src/modules/product-management/query/calculateCategoryDepth.generated.ts +5 -0
- package/src/modules/product-management/query/calculateCategoryDepth.test.ts +72 -0
- package/src/modules/product-management/query/calculateCategoryDepth.ts +37 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.generated.ts +5 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.test.ts +72 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.ts +44 -0
- package/src/modules/product-management/query/getProduct.generated.ts +5 -0
- package/src/modules/product-management/query/getProduct.test.ts +59 -0
- package/src/modules/product-management/query/getProduct.ts +18 -0
- package/src/modules/product-management/query/getProductAttribute.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttribute.test.ts +59 -0
- package/src/modules/product-management/query/getProductAttribute.ts +18 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.test.ts +37 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.ts +18 -0
- package/src/modules/product-management/query/getProductAttributeValue.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttributeValue.test.ts +31 -0
- package/src/modules/product-management/query/getProductAttributeValue.ts +16 -0
- package/src/modules/product-management/query/getProductCategory.generated.ts +5 -0
- package/src/modules/product-management/query/getProductCategory.test.ts +59 -0
- package/src/modules/product-management/query/getProductCategory.ts +18 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.generated.ts +5 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.test.ts +37 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.ts +18 -0
- package/src/modules/product-management/query/getProductVariant.generated.ts +5 -0
- package/src/modules/product-management/query/getProductVariant.test.ts +43 -0
- package/src/modules/product-management/query/getProductVariant.ts +20 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.generated.ts +5 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.test.ts +31 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.ts +16 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.generated.ts +5 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.test.ts +31 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.ts +16 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.generated.ts +5 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.test.ts +31 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.ts +16 -0
- package/src/modules/product-management/query/listProductAttributeValues.generated.ts +5 -0
- package/src/modules/product-management/query/listProductAttributeValues.test.ts +31 -0
- package/src/modules/product-management/query/listProductAttributeValues.ts +17 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.generated.ts +5 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.test.ts +31 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.ts +16 -0
- package/src/modules/product-management/query/listProductCategoryChildren.generated.ts +5 -0
- package/src/modules/product-management/query/listProductCategoryChildren.test.ts +31 -0
- package/src/modules/product-management/query/listProductCategoryChildren.ts +16 -0
- package/src/modules/product-management/query/listProductVariants.generated.ts +5 -0
- package/src/modules/product-management/query/listProductVariants.test.ts +31 -0
- package/src/modules/product-management/query/listProductVariants.ts +16 -0
- package/src/modules/product-management/tailor.config.ts +13 -0
- package/src/modules/product-management/tailor.d.ts +13 -0
- package/src/modules/product-management/testing/fixtures.ts +151 -0
- package/src/modules/user-management/README.md +9 -3
- package/src/modules/user-management/command/activateUser.generated.ts +1 -1
- package/src/modules/user-management/command/activateUser.test.ts +12 -65
- package/src/modules/user-management/command/activateUser.ts +5 -20
- package/src/modules/user-management/command/assignPermissionToRole.generated.ts +1 -1
- package/src/modules/user-management/command/assignPermissionToRole.test.ts +25 -60
- package/src/modules/user-management/command/assignPermissionToRole.ts +5 -24
- package/src/modules/user-management/command/assignRoleToUser.generated.ts +1 -1
- package/src/modules/user-management/command/assignRoleToUser.test.ts +35 -87
- package/src/modules/user-management/command/assignRoleToUser.ts +5 -24
- package/src/modules/user-management/command/createPermission.generated.ts +1 -1
- package/src/modules/user-management/command/createPermission.test.ts +23 -33
- package/src/modules/user-management/command/createPermission.ts +4 -5
- package/src/modules/user-management/command/createRole.generated.ts +1 -1
- package/src/modules/user-management/command/createRole.test.ts +17 -27
- package/src/modules/user-management/command/createRole.ts +4 -5
- package/src/modules/user-management/command/createUser.generated.ts +1 -1
- package/src/modules/user-management/command/createUser.test.ts +31 -118
- package/src/modules/user-management/command/createUser.ts +7 -25
- package/src/modules/user-management/command/deactivateUser.generated.ts +1 -1
- package/src/modules/user-management/command/deactivateUser.test.ts +12 -65
- package/src/modules/user-management/command/deactivateUser.ts +6 -21
- package/src/modules/user-management/command/reactivateUser.generated.ts +1 -1
- package/src/modules/user-management/command/reactivateUser.test.ts +13 -66
- package/src/modules/user-management/command/reactivateUser.ts +5 -20
- package/src/modules/user-management/command/revokePermissionFromRole.generated.ts +1 -1
- package/src/modules/user-management/command/revokePermissionFromRole.test.ts +24 -62
- package/src/modules/user-management/command/revokePermissionFromRole.ts +5 -24
- package/src/modules/user-management/command/revokeRoleFromUser.generated.ts +1 -1
- package/src/modules/user-management/command/revokeRoleFromUser.test.ts +24 -60
- package/src/modules/user-management/command/revokeRoleFromUser.ts +5 -24
- package/src/modules/user-management/docs/commands/ActivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/AssignPermissionToRole.md +7 -0
- package/src/modules/user-management/docs/commands/AssignRoleToUser.md +9 -0
- package/src/modules/user-management/docs/commands/CreatePermission.md +12 -0
- package/src/modules/user-management/docs/commands/CreateRole.md +9 -0
- package/src/modules/user-management/docs/commands/CreateUser.md +11 -0
- package/src/modules/user-management/docs/commands/DeactivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/ReactivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/RevokePermissionFromRole.md +7 -0
- package/src/modules/user-management/docs/commands/RevokeRoleFromUser.md +7 -0
- package/src/modules/user-management/index.ts +0 -30
- package/src/modules/user-management/lib/errors.generated.ts +14 -14
- package/src/modules/user-management/lib/permissions.generated.ts +1 -2
- package/src/modules/user-management/lib/recomputeUserPermissions.ts +4 -3
- package/src/modules/user-management/lib/types.ts +1 -1
- package/src/modules/user-management/module.ts +2 -7
- package/src/modules/user-management/tailor.config.ts +6 -4
- package/src/modules/user-management/tailor.d.ts +13 -0
- package/src/modules/user-management/testing/fixtures.ts +1 -20
- package/src/schemas.ts +1 -1
- package/src/{modules/shared → shared}/defineCommand.test.ts +23 -7
- package/src/{modules/shared → shared}/defineCommand.ts +19 -10
- package/src/{modules/shared/internal.ts → shared/index.ts} +9 -1
- package/src/shared/pagination.test.ts +43 -0
- package/src/shared/pagination.ts +22 -0
- package/src/{modules/shared → shared}/types.ts +13 -0
- package/src/{modules/testing → testing}/index.ts +14 -7
- package/src/testing.ts +1 -1
- package/src/util.ts +8 -0
- package/templates/config/license.config.json +4 -0
- package/templates/scaffold/app/backend/.env.example +1 -0
- package/templates/scaffold/app/backend/__dot__gitignore +4 -0
- package/templates/scaffold/app/backend/eslint.config.js +32 -0
- package/templates/scaffold/app/backend/package.json +31 -0
- package/templates/scaffold/app/backend/seed/data/AuditEvent.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Permission.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Permission.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/Role.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Role.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/RolePermission.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/RolePermission.schema.ts +24 -0
- package/templates/scaffold/app/backend/seed/data/User.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/User.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/UserRole.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/UserRole.schema.ts +24 -0
- package/templates/scaffold/app/backend/seed/data/_User.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/_User.schema.ts +30 -0
- package/templates/scaffold/app/backend/seed/exec.mjs +659 -0
- package/templates/scaffold/app/backend/src/executors/permissionCreated.ts +3 -0
- package/templates/scaffold/app/backend/src/executors/permissionDeleted.ts +3 -0
- package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +83 -0
- package/templates/scaffold/app/backend/src/modules.ts +9 -0
- package/templates/scaffold/app/backend/src/resolvers/createUser.ts +46 -0
- package/templates/scaffold/app/backend/tailor.config.ts +68 -0
- package/templates/scaffold/app/backend/tailor.d.ts +15 -0
- package/templates/scaffold/app/backend/tsconfig.json +19 -0
- package/templates/scaffold/app/docs/actors/.gitkeep +0 -0
- package/templates/scaffold/app/docs/business-flow/.gitkeep +0 -0
- package/templates/scaffold/app/docs/resolver/.gitkeep +0 -0
- package/templates/scaffold/app/docs/screen/.gitkeep +0 -0
- package/templates/scaffold/app/frontend/.env.example +2 -0
- package/templates/scaffold/app/frontend/__dot__gitignore +3 -0
- package/templates/scaffold/app/frontend/components.json +23 -0
- package/templates/scaffold/app/frontend/eslint.config.js +48 -0
- package/templates/scaffold/app/frontend/index.html +13 -0
- package/templates/scaffold/app/frontend/package.json +53 -0
- package/templates/scaffold/app/frontend/scripts/generate-graphql.mjs +6 -0
- package/templates/scaffold/app/frontend/src/App.tsx +58 -0
- package/templates/scaffold/app/frontend/src/components/composed/empty-state.tsx +26 -0
- package/templates/scaffold/app/frontend/src/components/composed/error-fallback.tsx +28 -0
- package/templates/scaffold/app/frontend/src/components/composed/loading.tsx +13 -0
- package/templates/scaffold/app/frontend/src/components/ui/badge.tsx +39 -0
- package/templates/scaffold/app/frontend/src/components/ui/button.tsx +60 -0
- package/templates/scaffold/app/frontend/src/components/ui/card.tsx +75 -0
- package/templates/scaffold/app/frontend/src/components/ui/form.tsx +152 -0
- package/templates/scaffold/app/frontend/src/components/ui/input.tsx +21 -0
- package/templates/scaffold/app/frontend/src/components/ui/label.tsx +21 -0
- package/templates/scaffold/app/frontend/src/components/ui/spinner.tsx +16 -0
- package/templates/scaffold/app/frontend/src/components/ui/table.tsx +90 -0
- package/templates/scaffold/app/frontend/src/graphql/generated/graphql-env.d.ts +103 -0
- package/templates/scaffold/app/frontend/src/graphql/generated/schema.graphql +1235 -0
- package/templates/scaffold/app/frontend/src/graphql/index.ts +15 -0
- package/templates/scaffold/app/frontend/src/index.css +5 -0
- package/templates/scaffold/app/frontend/src/lib/auth-client.ts +17 -0
- package/templates/scaffold/app/frontend/src/lib/utils.ts +6 -0
- package/templates/scaffold/app/frontend/src/main.tsx +10 -0
- package/templates/scaffold/app/frontend/src/pages/page.tsx +20 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/page.tsx +97 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-detail.tsx +58 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/page.tsx +51 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/components/users-table.tsx +101 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +99 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/page.tsx +61 -0
- package/templates/scaffold/app/frontend/src/providers/graphql-provider.tsx +21 -0
- package/templates/scaffold/app/frontend/tsconfig.app.json +35 -0
- package/templates/scaffold/app/frontend/tsconfig.json +16 -0
- package/templates/scaffold/app/frontend/tsconfig.node.json +23 -0
- package/templates/scaffold/app/frontend/vite.config.ts +23 -0
- package/templates/scaffold/module/command/.gitkeep +0 -0
- package/templates/scaffold/module/db/.gitkeep +0 -0
- package/templates/scaffold/module/executor/.gitkeep +0 -0
- package/templates/scaffold/module/generated/.gitkeep +0 -0
- package/templates/scaffold/module/index.ts +2 -0
- package/templates/scaffold/module/lib/errors.ts +1 -0
- package/templates/scaffold/module/lib/types.ts +4 -0
- package/templates/scaffold/module/module.ts +7 -0
- package/templates/scaffold/module/permissions.ts +3 -0
- package/templates/scaffold/module/query/.gitkeep +0 -0
- package/templates/scaffold/module/tailor.config.ts +13 -0
- package/templates/scaffold/module/testing/fixtures.ts +1 -0
- package/templates/workflows/erp-kit-check.yml +37 -0
- package/dist/cli.js +0 -1654
- package/skills/erp-kit-app-1-requirements/references/structure.md +0 -27
- package/skills/erp-kit-app-2-breakdown/SKILL.md +0 -95
- package/skills/erp-kit-app-2-breakdown/references/screen-detailview.md +0 -106
- package/skills/erp-kit-app-2-breakdown/references/screen-form.md +0 -139
- package/skills/erp-kit-app-2-breakdown/references/screen-listview.md +0 -153
- package/skills/erp-kit-app-2-breakdown/references/structure.md +0 -27
- package/skills/erp-kit-app-3-doc-review/SKILL.md +0 -116
- package/skills/erp-kit-app-3-doc-review/references/structure.md +0 -27
- package/skills/erp-kit-app-4-design/SKILL.md +0 -256
- package/skills/erp-kit-app-4-design/references/component.md +0 -50
- package/skills/erp-kit-app-4-design/references/screen-detailview.md +0 -106
- package/skills/erp-kit-app-4-design/references/screen-form.md +0 -139
- package/skills/erp-kit-app-4-design/references/screen-listview.md +0 -153
- package/skills/erp-kit-app-4-design/references/structure.md +0 -27
- package/skills/erp-kit-app-5-design-review/SKILL.md +0 -290
- package/skills/erp-kit-app-5-design-review/references/component.md +0 -50
- package/skills/erp-kit-app-5-design-review/references/screen-detailview.md +0 -106
- package/skills/erp-kit-app-5-design-review/references/screen-form.md +0 -139
- package/skills/erp-kit-app-5-design-review/references/screen-listview.md +0 -153
- package/skills/erp-kit-app-6-impl-spec/SKILL.md +0 -127
- package/skills/erp-kit-app-6-impl-spec/references/auth.md +0 -72
- package/skills/erp-kit-app-6-impl-spec/references/structure.md +0 -27
- package/skills/erp-kit-module-1-docs/SKILL.md +0 -111
- package/skills/erp-kit-module-2-feature-breakdown/SKILL.md +0 -76
- package/skills/erp-kit-module-3-doc-review/SKILL.md +0 -294
- package/skills/erp-kit-module-4-tdd/SKILL.md +0 -94
- package/skills/erp-kit-module-4-tdd/references/exports.md +0 -8
- package/skills/erp-kit-module-5-impl-review/SKILL.md +0 -410
- package/src/commands/scaffold-templates.ts +0 -65
- package/src/modules/shared/index.ts +0 -1
- package/src/modules/user-management/command/logAuditEvent.generated.ts +0 -6
- package/src/modules/user-management/command/logAuditEvent.test.ts +0 -187
- package/src/modules/user-management/command/logAuditEvent.ts +0 -56
- package/src/modules/user-management/db/auditEvent.ts +0 -47
- package/src/modules/user-management/docs/commands/LogAuditEvent.md +0 -37
- package/src/modules/user-management/docs/features/audit-trail.md +0 -80
- package/src/modules/user-management/docs/models/AuditEvent.md +0 -36
- /package/skills/{erp-kit-module-2-feature-breakdown → erp-kit-module-3-plan}/references/naming.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/cross-module-dependency.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/db-relations.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/generated-code.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/models.md +0 -0
- /package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/commands.md +0 -0
- /package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/testing.md +0 -0
- /package/src/modules/{product-management → audit}/.gitkeep +0 -0
- /package/src/{modules/shared → shared}/createContext.test.ts +0 -0
- /package/src/{modules/shared → shared}/createContext.ts +0 -0
- /package/src/{modules/shared → shared}/definePermissions.test.ts +0 -0
- /package/src/{modules/shared → shared}/definePermissions.ts +0 -0
- /package/src/{modules/shared → shared}/defineQuery.test.ts +0 -0
- /package/src/{modules/shared → shared}/defineQuery.ts +0 -0
- /package/src/{modules/shared → shared}/entityTypes.ts +0 -0
- /package/src/{modules/shared → shared}/errors.ts +0 -0
- /package/src/{modules/shared → shared}/requirePermission.test.ts +0 -0
- /package/src/{modules/shared → shared}/requirePermission.ts +0 -0
- /package/src/{modules/shared → shared}/result.ts +0 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# CreateProductCategory
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
createProductCategory creates a new category node in the hierarchical product category tree. Categories can be root nodes (no parent) or child nodes referencing an existing parent. The category tree is used to classify products for commercial and marketing purposes.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Category code is required, must be globally unique, and is immutable after creation
|
|
10
|
+
- Category name is required and must be non-empty
|
|
11
|
+
- Parent ID is optional — omitting it creates a root category
|
|
12
|
+
- If parent ID is provided, the parent category must exist
|
|
13
|
+
- Creating a child category must not exceed the configurable maximum tree depth
|
|
14
|
+
- Categories are created without any product assignments
|
|
15
|
+
|
|
16
|
+
## Process Flow
|
|
17
|
+
|
|
18
|
+
```mermaid
|
|
19
|
+
flowchart TD
|
|
20
|
+
A[Receive create request] --> B{Code provided and unique?}
|
|
21
|
+
B -->|No| C[Return error: DUPLICATE_CODE or MISSING_REQUIRED_FIELD]
|
|
22
|
+
B -->|Yes| D{Name provided?}
|
|
23
|
+
D -->|No| E[Return error: MISSING_REQUIRED_FIELD]
|
|
24
|
+
D -->|Yes| F{Parent ID provided?}
|
|
25
|
+
F -->|No| G[Create as root category]
|
|
26
|
+
F -->|Yes| H{Parent exists?}
|
|
27
|
+
H -->|No| I[Return error: PARENT_NOT_FOUND]
|
|
28
|
+
H -->|Yes| J{Depth within limit?}
|
|
29
|
+
J -->|No| K[Return error: MAX_DEPTH_EXCEEDED]
|
|
30
|
+
J -->|Yes| L[Create as child category]
|
|
31
|
+
G --> M[Return created category]
|
|
32
|
+
L --> M
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## External Dependencies
|
|
36
|
+
|
|
37
|
+
- None
|
|
38
|
+
|
|
39
|
+
## Error Scenarios
|
|
40
|
+
|
|
41
|
+
- **DUPLICATE_CODE**: A category with the same code already exists
|
|
42
|
+
- **MISSING_REQUIRED_FIELD**: Code or name not provided
|
|
43
|
+
- **PARENT_NOT_FOUND**: Specified parent category ID does not exist
|
|
44
|
+
- **MAX_DEPTH_EXCEEDED**: Adding this child would exceed the configurable maximum tree depth
|
|
45
|
+
|
|
46
|
+
## Test Cases
|
|
47
|
+
|
|
48
|
+
- should return MissingRequiredFieldError when code is empty
|
|
49
|
+
- should return MissingRequiredFieldError when name is empty
|
|
50
|
+
- should return DuplicateCodeError when code already exists
|
|
51
|
+
- should return ParentNotFoundError when parent does not exist
|
|
52
|
+
- should return MaxDepthExceededError when depth exceeds maxDepth
|
|
53
|
+
- should create a root category when no parentId is provided
|
|
54
|
+
- should create a child category when parentId is provided
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# DeactivateProduct
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
deactivateProduct transitions a product from ACTIVE to ARCHIVED status, preventing new variant generation. Existing Items generated from this product's variants remain unaffected and continue to operate independently in item-management.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target product must exist
|
|
10
|
+
- Target product must be in ACTIVE status
|
|
11
|
+
- Deactivating does not delete or deactivate existing generated Items
|
|
12
|
+
- Deactivated products can be reactivated via reactivateProduct
|
|
13
|
+
|
|
14
|
+
## Process Flow
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
flowchart TD
|
|
18
|
+
A[Receive deactivate request] --> B{Product exists?}
|
|
19
|
+
B -->|No| C[Return error: PRODUCT_NOT_FOUND]
|
|
20
|
+
B -->|Yes| D{Status is ACTIVE?}
|
|
21
|
+
D -->|No| E[Return error: INVALID_STATE_TRANSITION]
|
|
22
|
+
D -->|Yes| F[Update status to ARCHIVED]
|
|
23
|
+
F --> G[Return deactivated product]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## External Dependencies
|
|
27
|
+
|
|
28
|
+
- None
|
|
29
|
+
|
|
30
|
+
## Error Scenarios
|
|
31
|
+
|
|
32
|
+
- **PRODUCT_NOT_FOUND**: Specified product ID does not exist
|
|
33
|
+
- **INVALID_STATE_TRANSITION**: Product is not in ACTIVE status
|
|
34
|
+
|
|
35
|
+
## Test Cases
|
|
36
|
+
|
|
37
|
+
- returns error when product not found
|
|
38
|
+
- returns error when not in ACTIVE status
|
|
39
|
+
- deactivates ACTIVE product to ARCHIVED
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# DeleteProduct
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
deleteProduct permanently removes a product from the system. Only products in DRAFT status can be deleted, as ACTIVE and ARCHIVED products may have generated variants and associated Items that must be preserved for traceability and audit purposes.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target product must exist
|
|
10
|
+
- Target product must be in DRAFT status
|
|
11
|
+
- ACTIVE and ARCHIVED products cannot be deleted
|
|
12
|
+
- Deleting a product removes all associated attribute value assignments (ProductAttributeAssignments)
|
|
13
|
+
- Deleting a product removes all associated category assignments (ProductCategoryAssignments)
|
|
14
|
+
|
|
15
|
+
## Process Flow
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart TD
|
|
19
|
+
A[Receive delete request] --> B{Product exists?}
|
|
20
|
+
B -->|No| C[Return error: PRODUCT_NOT_FOUND]
|
|
21
|
+
B -->|Yes| D{Status is DRAFT?}
|
|
22
|
+
D -->|No| E[Return error: DELETE_NOT_ALLOWED]
|
|
23
|
+
D -->|Yes| F[Remove attribute value assignments]
|
|
24
|
+
F --> G[Remove category assignments]
|
|
25
|
+
G --> H[Delete product record]
|
|
26
|
+
H --> I[Return success]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## External Dependencies
|
|
30
|
+
|
|
31
|
+
- None
|
|
32
|
+
|
|
33
|
+
## Error Scenarios
|
|
34
|
+
|
|
35
|
+
- **PRODUCT_NOT_FOUND**: Specified product ID does not exist
|
|
36
|
+
- **DELETE_NOT_ALLOWED**: Product is not in DRAFT status and cannot be deleted
|
|
37
|
+
|
|
38
|
+
## Test Cases
|
|
39
|
+
|
|
40
|
+
- returns error when product not found
|
|
41
|
+
- returns error when not DRAFT
|
|
42
|
+
- deletes DRAFT product and associated records
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# DeleteProductAttribute
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
deleteProductAttribute permanently removes a product attribute from the system. An attribute can only be deleted if it is not currently assigned to any product. This prevents orphaning attribute references on existing products.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target attribute must exist
|
|
10
|
+
- Attribute deletion is blocked if the attribute is assigned to any product (has any ProductAttributeAssignment records)
|
|
11
|
+
- Deleting an attribute also removes all associated ProductAttributeValues
|
|
12
|
+
|
|
13
|
+
## Process Flow
|
|
14
|
+
|
|
15
|
+
```mermaid
|
|
16
|
+
flowchart TD
|
|
17
|
+
A[Receive delete request] --> B{Attribute exists?}
|
|
18
|
+
B -->|No| C[Return error: ATTRIBUTE_NOT_FOUND]
|
|
19
|
+
B -->|Yes| D{Assigned to any product?}
|
|
20
|
+
D -->|Yes| E[Return error: ATTRIBUTE_IN_USE]
|
|
21
|
+
D -->|No| F[Remove attribute values]
|
|
22
|
+
F --> G[Delete attribute record]
|
|
23
|
+
G --> H[Return success]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## External Dependencies
|
|
27
|
+
|
|
28
|
+
- None
|
|
29
|
+
|
|
30
|
+
## Error Scenarios
|
|
31
|
+
|
|
32
|
+
- **ATTRIBUTE_NOT_FOUND**: Specified attribute ID does not exist
|
|
33
|
+
- **ATTRIBUTE_IN_USE**: Attribute is assigned to one or more products and cannot be deleted
|
|
34
|
+
|
|
35
|
+
## Test Cases
|
|
36
|
+
|
|
37
|
+
- returns error when attribute not found
|
|
38
|
+
- returns error when attribute is in use
|
|
39
|
+
- deletes attribute and values successfully
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# DeleteProductAttributeValue
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
deleteProductAttributeValue deletes a predefined value from an existing attribute. Deletion is blocked if the value is currently in use on any ACTIVE product, preventing the invalidation of existing variant configurations.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target attribute value must exist
|
|
10
|
+
- Value deletion is blocked if the value is in use on any ACTIVE product
|
|
11
|
+
- Values used only on DRAFT products can be deleted
|
|
12
|
+
- Deleting a value also removes any ProductAttributeAssignment records referencing it on DRAFT products
|
|
13
|
+
|
|
14
|
+
## Process Flow
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
flowchart TD
|
|
18
|
+
A[Receive delete value request] --> B{Attribute value exists?}
|
|
19
|
+
B -->|No| C[Return error: VALUE_NOT_FOUND]
|
|
20
|
+
B -->|Yes| D{Value in use on ACTIVE product?}
|
|
21
|
+
D -->|Yes| E[Return error: VALUE_IN_USE]
|
|
22
|
+
D -->|No| F[Delete product attribute assignment references on DRAFT products]
|
|
23
|
+
F --> G[Delete attribute value record]
|
|
24
|
+
G --> H[Return success]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## External Dependencies
|
|
28
|
+
|
|
29
|
+
- None
|
|
30
|
+
|
|
31
|
+
## Error Scenarios
|
|
32
|
+
|
|
33
|
+
- **VALUE_NOT_FOUND**: Specified attribute value ID does not exist
|
|
34
|
+
- **ATTRIBUTE_NOT_FOUND**: Parent attribute of the value does not exist (data integrity check)
|
|
35
|
+
- **VALUE_IN_USE**: Value is in use on one or more ACTIVE products
|
|
36
|
+
|
|
37
|
+
## Test Cases
|
|
38
|
+
|
|
39
|
+
- returns error when value not found
|
|
40
|
+
- returns error when parent attribute does not exist
|
|
41
|
+
- returns error when value is in use on ACTIVE product
|
|
42
|
+
- deletes value and cleans up DRAFT product assignments
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# DeleteProductCategory
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
deleteProductCategory permanently removes a category from the tree. Only leaf categories (no children) with no product assignments can be deleted. This prevents orphaning child categories or breaking product classification.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target category must exist
|
|
10
|
+
- Category must have no child categories
|
|
11
|
+
- Category must have no product assignments (no ProductCategoryAssignment records)
|
|
12
|
+
- Deletion is permanent and cannot be undone
|
|
13
|
+
|
|
14
|
+
## Process Flow
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
flowchart TD
|
|
18
|
+
A[Receive delete request] --> B{Category exists?}
|
|
19
|
+
B -->|No| C[Return error: CATEGORY_NOT_FOUND]
|
|
20
|
+
B -->|Yes| D{Has child categories?}
|
|
21
|
+
D -->|Yes| E[Return error: HAS_CHILDREN]
|
|
22
|
+
D -->|No| F{Has product assignments?}
|
|
23
|
+
F -->|Yes| G[Return error: HAS_ASSIGNMENTS]
|
|
24
|
+
F -->|No| H[Delete category record]
|
|
25
|
+
H --> I[Return success]
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## External Dependencies
|
|
29
|
+
|
|
30
|
+
- None
|
|
31
|
+
|
|
32
|
+
## Error Scenarios
|
|
33
|
+
|
|
34
|
+
- **CATEGORY_NOT_FOUND**: Specified category ID does not exist
|
|
35
|
+
- **HAS_CHILDREN**: Category has child categories and cannot be deleted
|
|
36
|
+
- **HAS_ASSIGNMENTS**: Category has product assignments and cannot be deleted
|
|
37
|
+
|
|
38
|
+
## Test Cases
|
|
39
|
+
|
|
40
|
+
- should return CategoryNotFoundError when category does not exist
|
|
41
|
+
- should return HasChildrenError when category has children
|
|
42
|
+
- should return HasAssignmentsError when category has assignments
|
|
43
|
+
- should delete leaf category successfully
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# GenerateVariants
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
generateVariants creates product variants from the cartesian product of attribute values assigned to an ACTIVE product. Each new variant creates a corresponding Item in item-management with a SKU produced by the injectable SKU generation strategy (default: sequential numbering based on product code). Generation is idempotent — existing axis value combinations are skipped.
|
|
6
|
+
|
|
7
|
+
The SKU generation strategy is injectable at module configuration time. The default strategy produces SKUs like `CLASSIC-TSHIRT-001`, `CLASSIC-TSHIRT-002` using sequential numbering per product. This avoids coupling SKUs to attribute value labels, ensuring label changes do not create inconsistencies. Custom strategies can implement any pattern (attribute-value slug, brand prefix, hash-based, etc.).
|
|
8
|
+
|
|
9
|
+
## Business Rules
|
|
10
|
+
|
|
11
|
+
- Target product must exist and be in ACTIVE status
|
|
12
|
+
- Product must have at least one attribute with assigned values
|
|
13
|
+
- Each unique combination of attribute values produces one variant
|
|
14
|
+
- Existing combinations are skipped (idempotent generation)
|
|
15
|
+
- Each new variant creates exactly one Item in item-management via createItem
|
|
16
|
+
- Generated Items are created in DRAFT status
|
|
17
|
+
- Generated Items inherit the product's configured UoM
|
|
18
|
+
- SKU is produced by the configured SKU generation strategy (receives product code, axis values, and current variant count for sequential numbering)
|
|
19
|
+
- ProductVariant records store productId, axis value combination, and generated itemId
|
|
20
|
+
- Generation fails atomically if any Item creation fails (no partial generation)
|
|
21
|
+
|
|
22
|
+
## Process Flow
|
|
23
|
+
|
|
24
|
+
```mermaid
|
|
25
|
+
flowchart TD
|
|
26
|
+
A[Receive generate request] --> B{Product exists?}
|
|
27
|
+
B -->|No| C[Return error: PRODUCT_NOT_FOUND]
|
|
28
|
+
B -->|Yes| D{Status is ACTIVE?}
|
|
29
|
+
D -->|No| E[Return error: INVALID_PRODUCT_STATUS]
|
|
30
|
+
D -->|Yes| F[Collect all attribute assignments and values]
|
|
31
|
+
F --> G{Any attributes assigned?}
|
|
32
|
+
G -->|No| H[Return error: NO_VARIANT_AXES]
|
|
33
|
+
G -->|Yes| I[Compute cartesian product of attribute values]
|
|
34
|
+
I --> J{For each combination}
|
|
35
|
+
J --> K{Variant already exists?}
|
|
36
|
+
K -->|Yes| L[Skip]
|
|
37
|
+
K -->|No| M[Generate SKU via strategy]
|
|
38
|
+
M --> N[Create Item in item-management]
|
|
39
|
+
N --> O[Create ProductVariant record]
|
|
40
|
+
O --> J
|
|
41
|
+
J -->|All done| P[Return generated variants]
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## External Dependencies
|
|
45
|
+
|
|
46
|
+
- [item-management::createItem](../../../item-management/docs/commands/CreateItem.md) - Creates an Item for each new variant with generated SKU and inherited UoM
|
|
47
|
+
|
|
48
|
+
## Error Scenarios
|
|
49
|
+
|
|
50
|
+
- **PRODUCT_NOT_FOUND**: Specified product ID does not exist
|
|
51
|
+
- **INVALID_PRODUCT_STATUS**: Product is not in ACTIVE status (DRAFT or ARCHIVED)
|
|
52
|
+
- **NO_VARIANT_AXES**: Product has no attributes with assigned values
|
|
53
|
+
- **ATTRIBUTE_NOT_FOUND**: Referenced attribute no longer exists (data integrity check)
|
|
54
|
+
- **ATTRIBUTE_VALUE_NOT_FOUND**: Referenced attribute value no longer exists (data integrity check)
|
|
55
|
+
- **ITEM_CREATION_FAILED**: Item creation in item-management failed (e.g., duplicate SKU) — entire generation is rolled back
|
|
56
|
+
|
|
57
|
+
## Test Cases
|
|
58
|
+
|
|
59
|
+
- should return ProductNotFoundError when product does not exist
|
|
60
|
+
- should return InvalidProductStatusError when product is not ACTIVE
|
|
61
|
+
- should return NoVariantAxesError when no attribute assignments exist
|
|
62
|
+
- should return AttributeNotFoundError when referenced attribute no longer exists
|
|
63
|
+
- should return AttributeValueNotFoundError when referenced value no longer exists
|
|
64
|
+
- should skip existing variant combinations (idempotency)
|
|
65
|
+
- should return ItemCreationFailedError when item creation fails
|
|
66
|
+
- should generate multi-axis cartesian product variants
|
|
67
|
+
- should only generate new combinations when some already exist
|
|
68
|
+
- should generate variants successfully
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# MoveProductCategory
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
moveProductCategory reparents a category node within the hierarchical tree. The category and all its descendants move to the new location. Moving to null parent promotes the category to a root node. Circular references are prevented — a category cannot be moved under one of its own descendants.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target category must exist
|
|
10
|
+
- If new parent ID is provided, the new parent must exist
|
|
11
|
+
- A category cannot be moved under itself or any of its descendants (circular reference prevention)
|
|
12
|
+
- Moving must not cause any descendant to exceed the configurable maximum tree depth
|
|
13
|
+
- Moving a category preserves all product assignments and child categories
|
|
14
|
+
- Moving a category updates the paths of all descendant categories to reflect the new hierarchy
|
|
15
|
+
- Moving to null parent makes the category a root node
|
|
16
|
+
|
|
17
|
+
## Process Flow
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
flowchart TD
|
|
21
|
+
A[Receive move request] --> B{Category exists?}
|
|
22
|
+
B -->|No| C[Return error: CATEGORY_NOT_FOUND]
|
|
23
|
+
B -->|Yes| D{New parent provided?}
|
|
24
|
+
D -->|Yes| E{New parent exists?}
|
|
25
|
+
E -->|No| F[Return error: PARENT_NOT_FOUND]
|
|
26
|
+
E -->|Yes| G{Circular reference?}
|
|
27
|
+
G -->|Yes| H[Return error: CIRCULAR_REFERENCE]
|
|
28
|
+
G -->|No| I{Depth within limit?}
|
|
29
|
+
I -->|No| J[Return error: MAX_DEPTH_EXCEEDED]
|
|
30
|
+
I -->|Yes| K[Update parent reference]
|
|
31
|
+
D -->|No| K
|
|
32
|
+
K --> K2[Update descendant paths]
|
|
33
|
+
K2 --> L[Return moved category]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## External Dependencies
|
|
37
|
+
|
|
38
|
+
- None
|
|
39
|
+
|
|
40
|
+
## Error Scenarios
|
|
41
|
+
|
|
42
|
+
- **CATEGORY_NOT_FOUND**: Specified category ID does not exist
|
|
43
|
+
- **PARENT_NOT_FOUND**: Specified new parent category ID does not exist
|
|
44
|
+
- **CIRCULAR_REFERENCE**: Moving the category would create a circular reference (new parent is a descendant)
|
|
45
|
+
- **MAX_DEPTH_EXCEEDED**: Moving would cause descendants to exceed the maximum tree depth
|
|
46
|
+
|
|
47
|
+
## Test Cases
|
|
48
|
+
|
|
49
|
+
- should return CategoryNotFoundError when category does not exist
|
|
50
|
+
- should return ParentNotFoundError when new parent does not exist
|
|
51
|
+
- should return CircularReferenceError when move would create a cycle
|
|
52
|
+
- should return MaxDepthExceededError when move would exceed max depth
|
|
53
|
+
- should move category to new parent successfully
|
|
54
|
+
- should promote category to root when newParentId is null
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# ReactivateProduct
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
reactivateProduct transitions a product from ARCHIVED back to ACTIVE status, allowing new variant generation with updated attribute values. This supports product relaunch scenarios where a previously discontinued product line is brought back.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target product must exist
|
|
10
|
+
- Target product must be in ARCHIVED status
|
|
11
|
+
- After reactivation, the product behaves as any other ACTIVE product (variant generation is permitted)
|
|
12
|
+
|
|
13
|
+
## Process Flow
|
|
14
|
+
|
|
15
|
+
```mermaid
|
|
16
|
+
flowchart TD
|
|
17
|
+
A[Receive reactivate request] --> B{Product exists?}
|
|
18
|
+
B -->|No| C[Return error: PRODUCT_NOT_FOUND]
|
|
19
|
+
B -->|Yes| D{Status is ARCHIVED?}
|
|
20
|
+
D -->|No| E[Return error: INVALID_STATE_TRANSITION]
|
|
21
|
+
D -->|Yes| F[Update status to ACTIVE]
|
|
22
|
+
F --> G[Return reactivated product]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## External Dependencies
|
|
26
|
+
|
|
27
|
+
- None
|
|
28
|
+
|
|
29
|
+
## Error Scenarios
|
|
30
|
+
|
|
31
|
+
- **PRODUCT_NOT_FOUND**: Specified product ID does not exist
|
|
32
|
+
- **INVALID_STATE_TRANSITION**: Product is not in ARCHIVED status
|
|
33
|
+
|
|
34
|
+
## Test Cases
|
|
35
|
+
|
|
36
|
+
- returns error when product not found
|
|
37
|
+
- returns error when not in ARCHIVED status
|
|
38
|
+
- reactivates ARCHIVED product to ACTIVE
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# RemoveProductFromCategory
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
removeProductFromCategory removes the many-to-many link between a product and a product category. This does not delete either the product or the category — it only removes the classification relationship.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- The assignment (productId, categoryId) must exist
|
|
10
|
+
- Removal only affects the assignment record, not the product or category themselves
|
|
11
|
+
- Products in any status (DRAFT, ACTIVE, ARCHIVED) can have category assignments removed
|
|
12
|
+
|
|
13
|
+
## Process Flow
|
|
14
|
+
|
|
15
|
+
```mermaid
|
|
16
|
+
flowchart TD
|
|
17
|
+
A[Receive remove request] --> B{Assignment exists?}
|
|
18
|
+
B -->|No| C[Return error: ASSIGNMENT_NOT_FOUND]
|
|
19
|
+
B -->|Yes| D[Delete assignment record]
|
|
20
|
+
D --> E[Return success]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## External Dependencies
|
|
24
|
+
|
|
25
|
+
- None
|
|
26
|
+
|
|
27
|
+
## Error Scenarios
|
|
28
|
+
|
|
29
|
+
- **ASSIGNMENT_NOT_FOUND**: No assignment exists for the specified product and category combination
|
|
30
|
+
|
|
31
|
+
## Test Cases
|
|
32
|
+
|
|
33
|
+
- should return AssignmentNotFoundError when assignment does not exist
|
|
34
|
+
- should remove assignment successfully
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# SetProductAttributeAssignment
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
setProductAttributeAssignment adds an attribute value assignment to a product. A product can have multiple values per attribute (e.g., Color=Red, Color=Blue). Each record is uniquely identified by (productId, attributeId, valueId). If the exact triple already exists, the operation is a no-op (idempotent).
|
|
6
|
+
|
|
7
|
+
Since all attributes are variant axes, an additive-only policy applies for non-DRAFT products.
|
|
8
|
+
|
|
9
|
+
## Business Rules
|
|
10
|
+
|
|
11
|
+
- Target product must exist
|
|
12
|
+
- Target attribute must exist
|
|
13
|
+
- The value must reference a valid ProductAttributeValue belonging to the attribute
|
|
14
|
+
- On DRAFT products: all operations are allowed (add values, add new attributes)
|
|
15
|
+
- On ACTIVE products: adding new values to an already-assigned attribute is allowed (additive-only); assigning a new attribute (one not yet assigned to the product) is blocked — the attribute structure is locked once activated
|
|
16
|
+
- On ARCHIVED products: all assignment changes are blocked
|
|
17
|
+
- If the exact (productId, attributeId, valueId) assignment already exists, the command returns success without changes (idempotent)
|
|
18
|
+
|
|
19
|
+
## Process Flow
|
|
20
|
+
|
|
21
|
+
```mermaid
|
|
22
|
+
flowchart TD
|
|
23
|
+
A[Receive set value request] --> B{Product exists?}
|
|
24
|
+
B -->|No| C[Return error: PRODUCT_NOT_FOUND]
|
|
25
|
+
B -->|Yes| D{Attribute exists?}
|
|
26
|
+
D -->|No| E[Return error: ATTRIBUTE_NOT_FOUND]
|
|
27
|
+
D -->|Yes| F{Value valid?}
|
|
28
|
+
F -->|No| M[Return error: INVALID_VALUE]
|
|
29
|
+
F -->|Yes| G{Already assigned?}
|
|
30
|
+
G -->|Yes| O[Return existing assignment - no-op]
|
|
31
|
+
G -->|No| H{Product in DRAFT?}
|
|
32
|
+
H -->|Yes| N[Create assignment record]
|
|
33
|
+
H -->|No| H2{Product ARCHIVED?}
|
|
34
|
+
H2 -->|Yes| P[Return error: PRODUCT_ARCHIVED]
|
|
35
|
+
H2 -->|No| I{New attribute for this product?}
|
|
36
|
+
I -->|Yes| J[Return error: AXIS_STRUCTURE_LOCKED]
|
|
37
|
+
I -->|No| N
|
|
38
|
+
N --> O2[Return assignment]
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## External Dependencies
|
|
42
|
+
|
|
43
|
+
- None
|
|
44
|
+
|
|
45
|
+
## Error Scenarios
|
|
46
|
+
|
|
47
|
+
- **PRODUCT_NOT_FOUND**: Specified product ID does not exist
|
|
48
|
+
- **ATTRIBUTE_NOT_FOUND**: Specified attribute ID does not exist
|
|
49
|
+
- **PRODUCT_ARCHIVED**: Archived products do not allow any assignment changes
|
|
50
|
+
- **AXIS_STRUCTURE_LOCKED**: A new attribute cannot be assigned to an ACTIVE product — the set of attributes is fixed once activated
|
|
51
|
+
- **INVALID_VALUE**: Value does not reference a valid ProductAttributeValue for the attribute
|
|
52
|
+
|
|
53
|
+
## Test Cases
|
|
54
|
+
|
|
55
|
+
- returns error when product not found
|
|
56
|
+
- returns error when attribute not found
|
|
57
|
+
- returns error when value not found for attribute
|
|
58
|
+
- returns error when product is ARCHIVED
|
|
59
|
+
- returns existing assignment when exact triple already exists (idempotent no-op)
|
|
60
|
+
- returns error when adding new attribute to ACTIVE product
|
|
61
|
+
- creates new assignment on DRAFT product
|
|
62
|
+
- adds new value to existing attribute on ACTIVE product (additive-only)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# UpdateProduct
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateProduct modifies mutable fields of an existing product — name, description, and UoM. Product code is immutable and cannot be changed. The set of updatable fields may depend on the product's lifecycle status: UoM can only be updated in DRAFT status, while name and description can be updated in any status.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target product must exist
|
|
10
|
+
- Product code is immutable — any attempt to change code returns an error
|
|
11
|
+
- Name can be updated in any status (DRAFT, ACTIVE, ARCHIVED); must remain non-empty
|
|
12
|
+
- Description can be updated in any status
|
|
13
|
+
- UoM can be updated only in DRAFT status — once activated, UoM is locked to preserve variant consistency
|
|
14
|
+
- UoM must reference an existing active Unit from the primitives module
|
|
15
|
+
- At least one field must be provided for update
|
|
16
|
+
|
|
17
|
+
## Process Flow
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
flowchart TD
|
|
21
|
+
A[Receive update request] --> B{Product exists?}
|
|
22
|
+
B -->|No| C[Return error: PRODUCT_NOT_FOUND]
|
|
23
|
+
B -->|Yes| D{Code change attempted?}
|
|
24
|
+
D -->|Yes| E[Return error: CODE_IMMUTABLE]
|
|
25
|
+
D -->|No| F{Any field provided?}
|
|
26
|
+
F -->|No| G[Return error: NO_FIELDS_TO_UPDATE]
|
|
27
|
+
F -->|Yes| H{UoM change requested?}
|
|
28
|
+
H -->|Yes| I{Status is DRAFT?}
|
|
29
|
+
I -->|No| J[Return error: UOM_LOCKED]
|
|
30
|
+
I -->|Yes| K{UoM valid and active?}
|
|
31
|
+
K -->|No| L[Return error: INVALID_UOM]
|
|
32
|
+
K -->|Yes| M[Apply updates]
|
|
33
|
+
H -->|No| M
|
|
34
|
+
M --> N[Return updated product]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## External Dependencies
|
|
38
|
+
|
|
39
|
+
- [primitives::Unit](../../../primitives/docs/models/Unit.md) - Validates that the referenced UoM exists and is active (when UoM is being updated)
|
|
40
|
+
|
|
41
|
+
## Error Scenarios
|
|
42
|
+
|
|
43
|
+
- **PRODUCT_NOT_FOUND**: Specified product ID does not exist
|
|
44
|
+
- **CODE_IMMUTABLE**: Attempt to change the product code
|
|
45
|
+
- **MISSING_REQUIRED_FIELD**: Name is empty or blank when provided
|
|
46
|
+
- **NO_FIELDS_TO_UPDATE**: No updatable fields were provided in the request
|
|
47
|
+
- **UOM_LOCKED**: UoM cannot be changed after product has been activated
|
|
48
|
+
- **INVALID_UOM**: Referenced unit does not exist or is inactive
|
|
49
|
+
|
|
50
|
+
## Test Cases
|
|
51
|
+
|
|
52
|
+
- returns error when product not found
|
|
53
|
+
- returns error when code change attempted
|
|
54
|
+
- returns error when no fields provided
|
|
55
|
+
- returns error when name is empty
|
|
56
|
+
- returns error when UoM locked on non-DRAFT
|
|
57
|
+
- returns error when UoM is invalid
|
|
58
|
+
- updates description successfully
|
|
59
|
+
- updates UoM successfully on DRAFT product
|
|
60
|
+
- updates name successfully
|
|
61
|
+
- passes custom fields through
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# UpdateProductAttribute
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateProductAttribute modifies the display name of an existing product attribute. In extensible module configurations, consumer-defined custom fields may also be updated through this command. Attribute code is immutable through this command.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Target attribute must exist
|
|
10
|
+
- Attribute code is immutable — cannot be changed
|
|
11
|
+
- At least one updatable field must be provided
|
|
12
|
+
- Name must remain non-empty when provided
|
|
13
|
+
- Consumer-defined custom fields may be updated
|
|
14
|
+
|
|
15
|
+
## Process Flow
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart TD
|
|
19
|
+
A[Receive update request] --> B{Attribute exists?}
|
|
20
|
+
B -->|No| C[Return error: ATTRIBUTE_NOT_FOUND]
|
|
21
|
+
B -->|Yes| D{Code change attempted?}
|
|
22
|
+
D -->|Yes| E[Return error: CODE_IMMUTABLE]
|
|
23
|
+
D -->|No| F{Any updatable fields provided?}
|
|
24
|
+
F -->|No| G[Return error: MISSING_REQUIRED_FIELD]
|
|
25
|
+
F -->|Yes| H[Apply name and/or custom field updates]
|
|
26
|
+
H --> I[Return updated attribute]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## External Dependencies
|
|
30
|
+
|
|
31
|
+
- None
|
|
32
|
+
|
|
33
|
+
## Error Scenarios
|
|
34
|
+
|
|
35
|
+
- **ATTRIBUTE_NOT_FOUND**: Specified attribute ID does not exist
|
|
36
|
+
- **CODE_IMMUTABLE**: Attempt to change the attribute code
|
|
37
|
+
- **MISSING_REQUIRED_FIELD**: No updatable fields were provided, or name is empty when provided without any custom field updates
|
|
38
|
+
|
|
39
|
+
## Test Cases
|
|
40
|
+
|
|
41
|
+
- returns error when attribute not found
|
|
42
|
+
- returns error when trying to change code
|
|
43
|
+
- returns error when no fields provided
|
|
44
|
+
- returns error when name is empty string
|
|
45
|
+
- passes custom fields through to update
|
|
46
|
+
- updates name successfully
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# UpdateProductAttributeValue
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateProductAttributeValue updates the display label of an existing attribute value. Only the label (display name) can be changed; the value's identity (ID) remains immutable, preserving all existing references from ProductVariant records, ProductAttributeAssignment records, and generated Items.
|
|
6
|
+
|
|
7
|
+
This command enables corrections (e.g., fixing a typo "Rd" to "Red") and localization changes (e.g., renaming a value from one language to another) without disrupting variant structure or SKU integrity.
|
|
8
|
+
|
|
9
|
+
## Business Rules
|
|
10
|
+
|
|
11
|
+
- Target attribute value must exist
|
|
12
|
+
- New label is required and must be non-empty
|
|
13
|
+
- New label must be unique within the parent attribute (no duplicate labels)
|
|
14
|
+
- The value's ID and parent attribute reference are immutable
|
|
15
|
+
- Updating the label does not affect any existing ProductVariant records or generated Item SKUs
|
|
16
|
+
|
|
17
|
+
## Process Flow
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
flowchart TD
|
|
21
|
+
A[Receive update value request] --> B{Attribute value exists?}
|
|
22
|
+
B -->|No| C[Return error: VALUE_NOT_FOUND]
|
|
23
|
+
B -->|Yes| D{New label non-empty?}
|
|
24
|
+
D -->|No| E[Return error: INVALID_LABEL]
|
|
25
|
+
D -->|Yes| F{Label unique within attribute?}
|
|
26
|
+
F -->|No| G[Return error: DUPLICATE_VALUE]
|
|
27
|
+
F -->|Yes| H[Update attribute value label]
|
|
28
|
+
H --> I[Return updated value]
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## External Dependencies
|
|
32
|
+
|
|
33
|
+
- None
|
|
34
|
+
|
|
35
|
+
## Error Scenarios
|
|
36
|
+
|
|
37
|
+
- **VALUE_NOT_FOUND**: Specified attribute value ID does not exist
|
|
38
|
+
- **INVALID_LABEL**: Label is empty or blank
|
|
39
|
+
- **DUPLICATE_VALUE**: A value with the same label already exists for this attribute
|
|
40
|
+
|
|
41
|
+
## Test Cases
|
|
42
|
+
|
|
43
|
+
- returns error when value not found
|
|
44
|
+
- returns error when label is empty
|
|
45
|
+
- returns error when label already exists on same attribute
|
|
46
|
+
- returns error when label is whitespace only
|
|
47
|
+
- updates label successfully
|