@tailor-platform/erp-kit 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +8 -4
- package/dist/cli.mjs +70 -70
- package/package.json +1 -1
- package/skills/erp-kit-app-5-impl-backend/SKILL.md +5 -5
- package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -1
- package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +37 -12
- package/skills/erp-kit-app-6-impl-frontend/SKILL.md +3 -1
- package/skills/erp-kit-app-6-impl-frontend/references/component.md +90 -0
- package/skills/erp-kit-app-6-impl-frontend/references/detail-view.md +255 -0
- package/skills/erp-kit-app-6-impl-frontend/references/pages.md +1 -5
- package/skills/erp-kit-app-7-impl-review/SKILL.md +3 -2
- package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +14 -8
- package/skills/erp-kit-module-6-impl-review/SKILL.md +16 -19
- package/skills/erp-kit-module-shared/references/commands.md +68 -1
- package/src/commands/index.ts +8 -2
- package/src/commands/init.test.ts +24 -8
- package/src/commands/init.ts +5 -12
- package/src/commands/lib/distribute.test.ts +1 -20
- package/src/commands/lib/distribute.ts +0 -14
- package/src/commands/update.test.ts +1 -1
- package/src/generator/scaffold.ts +25 -4
- package/src/module.ts +4 -1
- package/src/modules/accounting/README.md +63 -0
- package/src/modules/accounting/command/activateBudget.generated.ts +6 -0
- package/src/modules/accounting/command/activateBudget.test.ts +119 -0
- package/src/modules/accounting/command/activateBudget.ts +77 -0
- package/src/modules/accounting/command/activateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/activateCostElement.test.ts +59 -0
- package/src/modules/accounting/command/activateCostElement.ts +41 -0
- package/src/modules/accounting/command/activateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/activateProfitCenter.test.ts +60 -0
- package/src/modules/accounting/command/activateProfitCenter.ts +38 -0
- package/src/modules/accounting/command/approveBudget.generated.ts +6 -0
- package/src/modules/accounting/command/approveBudget.test.ts +69 -0
- package/src/modules/accounting/command/approveBudget.ts +47 -0
- package/src/modules/accounting/command/assignCostCenterToHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/assignCostCenterToHierarchyNode.test.ts +112 -0
- package/src/modules/accounting/command/assignCostCenterToHierarchyNode.ts +67 -0
- package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.test.ts +123 -0
- package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.ts +71 -0
- package/src/modules/accounting/command/closeBudget.generated.ts +6 -0
- package/src/modules/accounting/command/closeBudget.test.ts +93 -0
- package/src/modules/accounting/command/closeBudget.ts +40 -0
- package/src/modules/accounting/command/closeInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/closeInternalOrder.test.ts +74 -0
- package/src/modules/accounting/command/closeInternalOrder.ts +38 -0
- package/src/modules/accounting/command/consumeCommitment.generated.ts +6 -0
- package/src/modules/accounting/command/consumeCommitment.test.ts +123 -0
- package/src/modules/accounting/command/consumeCommitment.ts +62 -0
- package/src/modules/accounting/command/createAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/createAllocationCycle.test.ts +166 -0
- package/src/modules/accounting/command/createAllocationCycle.ts +68 -0
- package/src/modules/accounting/command/createAllocationRule.generated.ts +6 -0
- package/src/modules/accounting/command/createAllocationRule.test.ts +195 -0
- package/src/modules/accounting/command/createAllocationRule.ts +103 -0
- package/src/modules/accounting/command/createBudget.generated.ts +6 -0
- package/src/modules/accounting/command/createBudget.test.ts +159 -0
- package/src/modules/accounting/command/createBudget.ts +100 -0
- package/src/modules/accounting/command/createBudgetLineItem.generated.ts +6 -0
- package/src/modules/accounting/command/createBudgetLineItem.test.ts +178 -0
- package/src/modules/accounting/command/createBudgetLineItem.ts +104 -0
- package/src/modules/accounting/command/createCostCenter.generated.ts +6 -0
- package/src/modules/accounting/command/createCostCenter.test.ts +179 -0
- package/src/modules/accounting/command/createCostCenter.ts +112 -0
- package/src/modules/accounting/command/createCostCenterHierarchy.generated.ts +6 -0
- package/src/modules/accounting/command/createCostCenterHierarchy.test.ts +91 -0
- package/src/modules/accounting/command/createCostCenterHierarchy.ts +48 -0
- package/src/modules/accounting/command/createCostCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/createCostCenterHierarchyNode.test.ts +171 -0
- package/src/modules/accounting/command/createCostCenterHierarchyNode.ts +117 -0
- package/src/modules/accounting/command/createCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/createCostElement.test.ts +317 -0
- package/src/modules/accounting/command/createCostElement.ts +149 -0
- package/src/modules/accounting/command/createInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/createInternalOrder.test.ts +206 -0
- package/src/modules/accounting/command/createInternalOrder.ts +104 -0
- package/src/modules/accounting/command/createPlanVersion.generated.ts +6 -0
- package/src/modules/accounting/command/createPlanVersion.test.ts +230 -0
- package/src/modules/accounting/command/createPlanVersion.ts +71 -0
- package/src/modules/accounting/command/createProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/createProfitCenter.test.ts +227 -0
- package/src/modules/accounting/command/createProfitCenter.ts +81 -0
- package/src/modules/accounting/command/createProfitCenterHierarchy.generated.ts +6 -0
- package/src/modules/accounting/command/createProfitCenterHierarchy.test.ts +91 -0
- package/src/modules/accounting/command/createProfitCenterHierarchy.ts +46 -0
- package/src/modules/accounting/command/createProfitCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/createProfitCenterHierarchyNode.test.ts +160 -0
- package/src/modules/accounting/command/createProfitCenterHierarchyNode.ts +109 -0
- package/src/modules/accounting/command/deactivateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/deactivateCostElement.test.ts +59 -0
- package/src/modules/accounting/command/deactivateCostElement.ts +41 -0
- package/src/modules/accounting/command/deactivateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/deactivateProfitCenter.test.ts +60 -0
- package/src/modules/accounting/command/deactivateProfitCenter.ts +42 -0
- package/src/modules/accounting/command/deleteAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/deleteAllocationCycle.test.ts +90 -0
- package/src/modules/accounting/command/deleteAllocationCycle.ts +39 -0
- package/src/modules/accounting/command/deleteAllocationRule.generated.ts +6 -0
- package/src/modules/accounting/command/deleteAllocationRule.test.ts +98 -0
- package/src/modules/accounting/command/deleteAllocationRule.ts +40 -0
- package/src/modules/accounting/command/deleteBudget.generated.ts +6 -0
- package/src/modules/accounting/command/deleteBudget.test.ts +90 -0
- package/src/modules/accounting/command/deleteBudget.ts +35 -0
- package/src/modules/accounting/command/deleteBudgetLineItem.generated.ts +6 -0
- package/src/modules/accounting/command/deleteBudgetLineItem.test.ts +85 -0
- package/src/modules/accounting/command/deleteBudgetLineItem.ts +50 -0
- package/src/modules/accounting/command/deleteCostCenter.generated.ts +6 -0
- package/src/modules/accounting/command/deleteCostCenter.test.ts +79 -0
- package/src/modules/accounting/command/deleteCostCenter.ts +67 -0
- package/src/modules/accounting/command/deleteCostCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/deleteCostCenterHierarchyNode.test.ts +59 -0
- package/src/modules/accounting/command/deleteCostCenterHierarchyNode.ts +58 -0
- package/src/modules/accounting/command/deleteCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/deleteCostElement.test.ts +58 -0
- package/src/modules/accounting/command/deleteCostElement.ts +33 -0
- package/src/modules/accounting/command/deleteInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/deleteInternalOrder.test.ts +81 -0
- package/src/modules/accounting/command/deleteInternalOrder.ts +37 -0
- package/src/modules/accounting/command/deleteProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/deleteProfitCenter.test.ts +68 -0
- package/src/modules/accounting/command/deleteProfitCenter.ts +39 -0
- package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.test.ts +72 -0
- package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.ts +61 -0
- package/src/modules/accounting/command/executeAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/executeAllocationCycle.test.ts +167 -0
- package/src/modules/accounting/command/executeAllocationCycle.ts +94 -0
- package/src/modules/accounting/command/finalizeVarianceReport.generated.ts +6 -0
- package/src/modules/accounting/command/finalizeVarianceReport.test.ts +60 -0
- package/src/modules/accounting/command/finalizeVarianceReport.ts +45 -0
- package/src/modules/accounting/command/generateVarianceReport.generated.ts +6 -0
- package/src/modules/accounting/command/generateVarianceReport.test.ts +386 -0
- package/src/modules/accounting/command/generateVarianceReport.ts +219 -0
- package/src/modules/accounting/command/invalidateAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/invalidateAllocationCycle.test.ts +84 -0
- package/src/modules/accounting/command/invalidateAllocationCycle.ts +45 -0
- package/src/modules/accounting/command/moveCostCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/moveCostCenterHierarchyNode.test.ts +135 -0
- package/src/modules/accounting/command/moveCostCenterHierarchyNode.ts +81 -0
- package/src/modules/accounting/command/postAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/postAllocationCycle.test.ts +98 -0
- package/src/modules/accounting/command/postAllocationCycle.ts +65 -0
- package/src/modules/accounting/command/reactivateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/reactivateCostElement.test.ts +59 -0
- package/src/modules/accounting/command/reactivateCostElement.ts +41 -0
- package/src/modules/accounting/command/reactivateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/reactivateProfitCenter.test.ts +60 -0
- package/src/modules/accounting/command/reactivateProfitCenter.ts +42 -0
- package/src/modules/accounting/command/recordCommitment.generated.ts +6 -0
- package/src/modules/accounting/command/recordCommitment.test.ts +157 -0
- package/src/modules/accounting/command/recordCommitment.ts +113 -0
- package/src/modules/accounting/command/rejectBudget.generated.ts +6 -0
- package/src/modules/accounting/command/rejectBudget.test.ts +105 -0
- package/src/modules/accounting/command/rejectBudget.ts +51 -0
- package/src/modules/accounting/command/releaseCommitment.generated.ts +6 -0
- package/src/modules/accounting/command/releaseCommitment.test.ts +94 -0
- package/src/modules/accounting/command/releaseCommitment.ts +51 -0
- package/src/modules/accounting/command/releaseInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/releaseInternalOrder.test.ts +74 -0
- package/src/modules/accounting/command/releaseInternalOrder.ts +38 -0
- package/src/modules/accounting/command/reverseAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/reverseAllocationCycle.test.ts +124 -0
- package/src/modules/accounting/command/reverseAllocationCycle.ts +63 -0
- package/src/modules/accounting/command/submitBudget.generated.ts +6 -0
- package/src/modules/accounting/command/submitBudget.test.ts +60 -0
- package/src/modules/accounting/command/submitBudget.ts +51 -0
- package/src/modules/accounting/command/technicallyCompleteInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/technicallyCompleteInternalOrder.test.ts +74 -0
- package/src/modules/accounting/command/technicallyCompleteInternalOrder.ts +42 -0
- package/src/modules/accounting/command/updateAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/updateAllocationCycle.test.ts +112 -0
- package/src/modules/accounting/command/updateAllocationCycle.ts +41 -0
- package/src/modules/accounting/command/updateBudget.generated.ts +6 -0
- package/src/modules/accounting/command/updateBudget.test.ts +112 -0
- package/src/modules/accounting/command/updateBudget.ts +44 -0
- package/src/modules/accounting/command/updateCostCenter.generated.ts +6 -0
- package/src/modules/accounting/command/updateCostCenter.test.ts +105 -0
- package/src/modules/accounting/command/updateCostCenter.ts +79 -0
- package/src/modules/accounting/command/updateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/updateCostElement.test.ts +265 -0
- package/src/modules/accounting/command/updateCostElement.ts +158 -0
- package/src/modules/accounting/command/updateInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/updateInternalOrder.test.ts +209 -0
- package/src/modules/accounting/command/updateInternalOrder.ts +88 -0
- package/src/modules/accounting/command/updateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/updateProfitCenter.test.ts +162 -0
- package/src/modules/accounting/command/updateProfitCenter.ts +73 -0
- package/src/modules/accounting/command/validateAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/validateAllocationCycle.test.ts +141 -0
- package/src/modules/accounting/command/validateAllocationCycle.ts +80 -0
- package/src/modules/accounting/db/allocationCycle.ts +59 -0
- package/src/modules/accounting/db/allocationResult.ts +58 -0
- package/src/modules/accounting/db/allocationRule.ts +48 -0
- package/src/modules/accounting/db/budget.ts +84 -0
- package/src/modules/accounting/db/budgetLineItem.ts +64 -0
- package/src/modules/accounting/db/commitment.ts +60 -0
- package/src/modules/accounting/db/costCenter.ts +73 -0
- package/src/modules/accounting/db/costCenterHierarchy.ts +37 -0
- package/src/modules/accounting/db/costCenterHierarchyNode.ts +48 -0
- package/src/modules/accounting/db/costElement.ts +56 -0
- package/src/modules/accounting/db/internalOrder.ts +69 -0
- package/src/modules/accounting/db/planVersion.ts +47 -0
- package/src/modules/accounting/db/profitCenter.ts +52 -0
- package/src/modules/accounting/db/profitCenterHierarchy.ts +36 -0
- package/src/modules/accounting/db/profitCenterHierarchyAssignment.ts +62 -0
- package/src/modules/accounting/db/profitCenterHierarchyNode.ts +48 -0
- package/src/modules/accounting/db/varianceReport.ts +54 -0
- package/src/modules/accounting/db/varianceReportLine.ts +62 -0
- package/src/modules/accounting/docs/commands/ActivateBudget.md +54 -0
- package/src/modules/accounting/docs/commands/ActivateCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/ActivateProfitCenter.md +43 -0
- package/src/modules/accounting/docs/commands/ApproveBudget.md +46 -0
- package/src/modules/accounting/docs/commands/AssignCostCenterToHierarchyNode.md +46 -0
- package/src/modules/accounting/docs/commands/AssignProfitCenterToHierarchyNode.md +47 -0
- package/src/modules/accounting/docs/commands/CloseBudget.md +47 -0
- package/src/modules/accounting/docs/commands/CloseInternalOrder.md +45 -0
- package/src/modules/accounting/docs/commands/ConsumeCommitment.md +53 -0
- package/src/modules/accounting/docs/commands/CreateAllocationCycle.md +55 -0
- package/src/modules/accounting/docs/commands/CreateAllocationRule.md +60 -0
- package/src/modules/accounting/docs/commands/CreateBudget.md +65 -0
- package/src/modules/accounting/docs/commands/CreateBudgetLineItem.md +66 -0
- package/src/modules/accounting/docs/commands/CreateCostCenter.md +64 -0
- package/src/modules/accounting/docs/commands/CreateCostCenterHierarchy.md +45 -0
- package/src/modules/accounting/docs/commands/CreateCostCenterHierarchyNode.md +61 -0
- package/src/modules/accounting/docs/commands/CreateCostElement.md +91 -0
- package/src/modules/accounting/docs/commands/CreateInternalOrder.md +72 -0
- package/src/modules/accounting/docs/commands/CreatePlanVersion.md +59 -0
- package/src/modules/accounting/docs/commands/CreateProfitCenter.md +63 -0
- package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchy.md +45 -0
- package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchyNode.md +60 -0
- package/src/modules/accounting/docs/commands/DeactivateCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/DeactivateProfitCenter.md +44 -0
- package/src/modules/accounting/docs/commands/DeleteAllocationCycle.md +46 -0
- package/src/modules/accounting/docs/commands/DeleteAllocationRule.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteBudget.md +46 -0
- package/src/modules/accounting/docs/commands/DeleteBudgetLineItem.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteCostCenter.md +50 -0
- package/src/modules/accounting/docs/commands/DeleteCostCenterHierarchyNode.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/DeleteInternalOrder.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteProfitCenter.md +46 -0
- package/src/modules/accounting/docs/commands/DeleteProfitCenterHierarchyNode.md +46 -0
- package/src/modules/accounting/docs/commands/ExecuteAllocationCycle.md +54 -0
- package/src/modules/accounting/docs/commands/FinalizeVarianceReport.md +44 -0
- package/src/modules/accounting/docs/commands/GenerateVarianceReport.md +83 -0
- package/src/modules/accounting/docs/commands/InvalidateAllocationCycle.md +45 -0
- package/src/modules/accounting/docs/commands/MoveCostCenterHierarchyNode.md +51 -0
- package/src/modules/accounting/docs/commands/PostAllocationCycle.md +58 -0
- package/src/modules/accounting/docs/commands/ReactivateCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/ReactivateProfitCenter.md +43 -0
- package/src/modules/accounting/docs/commands/RecordCommitment.md +60 -0
- package/src/modules/accounting/docs/commands/RejectBudget.md +49 -0
- package/src/modules/accounting/docs/commands/ReleaseCommitment.md +45 -0
- package/src/modules/accounting/docs/commands/ReleaseInternalOrder.md +44 -0
- package/src/modules/accounting/docs/commands/ReverseAllocationCycle.md +55 -0
- package/src/modules/accounting/docs/commands/SubmitBudget.md +47 -0
- package/src/modules/accounting/docs/commands/TechnicallyCompleteInternalOrder.md +44 -0
- package/src/modules/accounting/docs/commands/UpdateAllocationCycle.md +45 -0
- package/src/modules/accounting/docs/commands/UpdateBudget.md +47 -0
- package/src/modules/accounting/docs/commands/UpdateCostCenter.md +50 -0
- package/src/modules/accounting/docs/commands/UpdateCostElement.md +82 -0
- package/src/modules/accounting/docs/commands/UpdateInternalOrder.md +62 -0
- package/src/modules/accounting/docs/commands/UpdateProfitCenter.md +56 -0
- package/src/modules/accounting/docs/commands/ValidateAllocationCycle.md +57 -0
- package/src/modules/accounting/docs/features/budget-management.md +147 -0
- package/src/modules/accounting/docs/features/cost-allocation.md +129 -0
- package/src/modules/accounting/docs/features/cost-center-management.md +118 -0
- package/src/modules/accounting/docs/features/cost-element-management.md +114 -0
- package/src/modules/accounting/docs/features/internal-order-management.md +111 -0
- package/src/modules/accounting/docs/features/profit-center-management.md +120 -0
- package/src/modules/accounting/docs/features/variance-analysis.md +130 -0
- package/src/modules/accounting/docs/models/AllocationCycle.md +81 -0
- package/src/modules/accounting/docs/models/AllocationResult.md +37 -0
- package/src/modules/accounting/docs/models/AllocationRule.md +41 -0
- package/src/modules/accounting/docs/models/Budget.md +77 -0
- package/src/modules/accounting/docs/models/BudgetLineItem.md +40 -0
- package/src/modules/accounting/docs/models/Commitment.md +45 -0
- package/src/modules/accounting/docs/models/CostCenter.md +51 -0
- package/src/modules/accounting/docs/models/CostCenterHierarchy.md +38 -0
- package/src/modules/accounting/docs/models/CostCenterHierarchyNode.md +41 -0
- package/src/modules/accounting/docs/models/CostElement.md +66 -0
- package/src/modules/accounting/docs/models/InternalOrder.md +67 -0
- package/src/modules/accounting/docs/models/PlanVersion.md +36 -0
- package/src/modules/accounting/docs/models/ProfitCenter.md +66 -0
- package/src/modules/accounting/docs/models/ProfitCenterHierarchy.md +36 -0
- package/src/modules/accounting/docs/models/ProfitCenterHierarchyAssignment.md +36 -0
- package/src/modules/accounting/docs/models/ProfitCenterHierarchyNode.md +39 -0
- package/src/modules/accounting/docs/models/VarianceReport.md +58 -0
- package/src/modules/accounting/docs/models/VarianceReportLine.md +43 -0
- package/src/modules/accounting/docs/queries/CalculateBudgetAvailability.md +64 -0
- package/src/modules/accounting/docs/queries/GetAllocationCycle.md +43 -0
- package/src/modules/accounting/docs/queries/GetBudget.md +42 -0
- package/src/modules/accounting/docs/queries/GetCostCenter.md +38 -0
- package/src/modules/accounting/docs/queries/GetCostCenterHierarchy.md +45 -0
- package/src/modules/accounting/docs/queries/GetCostElement.md +39 -0
- package/src/modules/accounting/docs/queries/GetInternalOrder.md +42 -0
- package/src/modules/accounting/docs/queries/GetProfitCenter.md +38 -0
- package/src/modules/accounting/docs/queries/GetProfitCenterHierarchy.md +46 -0
- package/src/modules/accounting/docs/queries/GetVarianceReport.md +45 -0
- package/src/modules/accounting/docs/queries/ListAllocationCycles.md +63 -0
- package/src/modules/accounting/docs/queries/ListBudgets.md +70 -0
- package/src/modules/accounting/docs/queries/ListCostCenters.md +55 -0
- package/src/modules/accounting/docs/queries/ListCostElements.md +63 -0
- package/src/modules/accounting/docs/queries/ListInternalOrders.md +62 -0
- package/src/modules/accounting/docs/queries/ListProfitCenters.md +49 -0
- package/src/modules/accounting/generated/enums.ts +110 -0
- package/src/modules/accounting/generated/kysely-tailordb.ts +302 -0
- package/src/modules/accounting/index.ts +2 -0
- package/src/modules/accounting/lib/_db_deps.ts +70 -0
- package/src/modules/accounting/lib/actualAmounts.ts +93 -0
- package/src/modules/accounting/lib/allocationPosting.ts +152 -0
- package/src/modules/accounting/lib/errors.generated.ts +432 -0
- package/src/modules/accounting/lib/permissions.generated.ts +61 -0
- package/src/modules/accounting/lib/types.ts +114 -0
- package/src/modules/accounting/module.ts +428 -0
- package/src/modules/accounting/permissions.ts +3 -0
- package/src/modules/accounting/query/calculateBudgetAvailability.generated.ts +5 -0
- package/src/modules/accounting/query/calculateBudgetAvailability.test.ts +229 -0
- package/src/modules/accounting/query/calculateBudgetAvailability.ts +147 -0
- package/src/modules/accounting/query/getAllocationCycle.generated.ts +5 -0
- package/src/modules/accounting/query/getAllocationCycle.test.ts +94 -0
- package/src/modules/accounting/query/getAllocationCycle.ts +37 -0
- package/src/modules/accounting/query/getBudget.generated.ts +5 -0
- package/src/modules/accounting/query/getBudget.test.ts +80 -0
- package/src/modules/accounting/query/getBudget.ts +31 -0
- package/src/modules/accounting/query/getCostCenter.generated.ts +5 -0
- package/src/modules/accounting/query/getCostCenter.test.ts +50 -0
- package/src/modules/accounting/query/getCostCenter.ts +33 -0
- package/src/modules/accounting/query/getCostCenterHierarchy.generated.ts +5 -0
- package/src/modules/accounting/query/getCostCenterHierarchy.test.ts +100 -0
- package/src/modules/accounting/query/getCostCenterHierarchy.ts +80 -0
- package/src/modules/accounting/query/getCostElement.generated.ts +5 -0
- package/src/modules/accounting/query/getCostElement.test.ts +57 -0
- package/src/modules/accounting/query/getCostElement.ts +21 -0
- package/src/modules/accounting/query/getInternalOrder.generated.ts +5 -0
- package/src/modules/accounting/query/getInternalOrder.test.ts +73 -0
- package/src/modules/accounting/query/getInternalOrder.ts +21 -0
- package/src/modules/accounting/query/getProfitCenter.generated.ts +5 -0
- package/src/modules/accounting/query/getProfitCenter.test.ts +65 -0
- package/src/modules/accounting/query/getProfitCenter.ts +31 -0
- package/src/modules/accounting/query/getProfitCenterHierarchy.generated.ts +5 -0
- package/src/modules/accounting/query/getProfitCenterHierarchy.test.ts +97 -0
- package/src/modules/accounting/query/getProfitCenterHierarchy.ts +87 -0
- package/src/modules/accounting/query/getVarianceReport.generated.ts +5 -0
- package/src/modules/accounting/query/getVarianceReport.test.ts +108 -0
- package/src/modules/accounting/query/getVarianceReport.ts +31 -0
- package/src/modules/accounting/query/listAllocationCycles.generated.ts +5 -0
- package/src/modules/accounting/query/listAllocationCycles.test.ts +152 -0
- package/src/modules/accounting/query/listAllocationCycles.ts +96 -0
- package/src/modules/accounting/query/listBudgets.generated.ts +5 -0
- package/src/modules/accounting/query/listBudgets.test.ts +150 -0
- package/src/modules/accounting/query/listBudgets.ts +85 -0
- package/src/modules/accounting/query/listCostCenters.generated.ts +5 -0
- package/src/modules/accounting/query/listCostCenters.test.ts +111 -0
- package/src/modules/accounting/query/listCostCenters.ts +71 -0
- package/src/modules/accounting/query/listCostElements.generated.ts +5 -0
- package/src/modules/accounting/query/listCostElements.test.ts +138 -0
- package/src/modules/accounting/query/listCostElements.ts +105 -0
- package/src/modules/accounting/query/listInternalOrders.generated.ts +5 -0
- package/src/modules/accounting/query/listInternalOrders.test.ts +129 -0
- package/src/modules/accounting/query/listInternalOrders.ts +94 -0
- package/src/modules/accounting/query/listProfitCenters.generated.ts +5 -0
- package/src/modules/accounting/query/listProfitCenters.test.ts +94 -0
- package/src/modules/accounting/query/listProfitCenters.ts +56 -0
- package/src/modules/accounting/seed/index.ts +19 -0
- package/src/modules/accounting/tailor.config.ts +13 -0
- package/src/modules/accounting/testing/commandTestUtils.ts +35 -0
- package/src/modules/accounting/testing/fixtures.ts +502 -0
- package/src/modules/audit/command/logAuditEvent.ts +43 -38
- package/src/modules/audit/command/updateAuditPolicy.ts +2 -2
- package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +1 -1
- package/src/modules/audit/module.ts +4 -0
- package/src/modules/business-partner/command/updateContactPerson.ts +3 -4
- package/src/modules/business-partner/command/updatePartner.ts +13 -6
- package/src/modules/business-partner/command/updatePartnerAddress.ts +13 -6
- package/src/modules/business-partner/command/updatePartnerBankAccount.ts +3 -4
- package/src/modules/business-partner/command/updatePartnerIdentification.ts +3 -4
- package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +3 -3
- package/src/modules/business-partner/docs/commands/UpdatePartner.md +2 -2
- package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +2 -2
- package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +2 -2
- package/src/modules/coa-management/command/updateAccount.ts +3 -3
- package/src/modules/coa-management/command/updateAccountGroup.test.ts +22 -0
- package/src/modules/coa-management/command/updateAccountGroup.ts +30 -18
- package/src/modules/coa-management/command/updateChartOfAccounts.ts +3 -4
- package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +4 -3
- package/src/modules/finance-ledger/command/updateFiscalYear.ts +2 -3
- package/src/modules/finance-ledger/command/updateJournalEntry.test.ts +0 -17
- package/src/modules/finance-ledger/command/updateJournalEntry.ts +2 -10
- package/src/modules/finance-ledger/command/updateJournalLine.ts +2 -3
- package/src/modules/finance-ledger/docs/commands/UpdateJournalEntry.md +1 -4
- package/src/modules/inventory/command/updateLot.test.ts +1 -1
- package/src/modules/inventory/command/updateLot.ts +2 -3
- package/src/modules/inventory/command/updateStockMovement.ts +2 -3
- package/src/modules/inventory/command/updateStorageLocation.ts +12 -17
- package/src/modules/inventory/command/updateValuationPolicy.ts +2 -3
- package/src/modules/inventory/command/updateWarehouse.ts +2 -3
- package/src/modules/inventory/docs/commands/UpdateLot.md +3 -3
- package/src/modules/inventory/docs/commands/UpdateStorageLocation.md +6 -6
- package/src/modules/inventory/docs/commands/UpdateWarehouse.md +2 -2
- package/src/modules/item-management/command/updateItem.test.ts +16 -12
- package/src/modules/item-management/command/updateItem.ts +47 -31
- package/src/modules/item-management/command/updateTaxonomyNode.test.ts +15 -16
- package/src/modules/item-management/command/updateTaxonomyNode.ts +42 -29
- package/src/modules/item-management/docs/commands/UpdateItem.md +7 -11
- package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +10 -14
- package/src/modules/manufacturing/command/updateBillOfMaterial.ts +3 -4
- package/src/modules/manufacturing/command/updateProductionOrder.ts +3 -4
- package/src/modules/manufacturing/command/updateRouting.ts +3 -4
- package/src/modules/manufacturing/command/updateWorkCenter.test.ts +16 -7
- package/src/modules/manufacturing/command/updateWorkCenter.ts +41 -38
- package/src/modules/manufacturing/docs/commands/ActivateWorkCenter.md +2 -0
- package/src/modules/manufacturing/docs/commands/CompleteWorkOrder.md +2 -0
- package/src/modules/manufacturing/docs/commands/CreateBillOfMaterial.md +1 -0
- package/src/modules/manufacturing/docs/commands/ReviewManufacturingCostSummary.md +1 -0
- package/src/modules/manufacturing/docs/commands/UpdateWorkCenter.md +6 -5
- package/src/modules/manufacturing/docs/models/BillOfMaterialLine.md +42 -0
- package/src/modules/manufacturing/docs/models/CostVarianceLine.md +36 -0
- package/src/modules/manufacturing/docs/models/ManufacturingCostLine.md +37 -0
- package/src/modules/manufacturing/docs/models/ManufacturingCostSettlementRecord.md +34 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderBomSnapshot.md +35 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderCostBaseline.md +36 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderMaterialRequirement.md +35 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderRoutingSnapshot.md +34 -0
- package/src/modules/manufacturing/docs/models/RoutingOperation.md +40 -0
- package/src/modules/manufacturing/docs/models/WorkOrderExecutionEvent.md +38 -0
- package/src/modules/manufacturing/docs/queries/ExplodeBillOfMaterial.md +1 -0
- package/src/modules/manufacturing/docs/queries/ListWorkCentersBySite.md +1 -0
- package/src/modules/organization/command/updateCompany.test.ts +6 -6
- package/src/modules/organization/command/updateCompany.ts +3 -4
- package/src/modules/organization/command/updateDepartment.test.ts +7 -7
- package/src/modules/organization/command/updateDepartment.ts +13 -12
- package/src/modules/organization/command/updateSite.test.ts +10 -10
- package/src/modules/organization/command/updateSite.ts +3 -4
- package/src/modules/organization/docs/commands/UpdateCompany.md +6 -6
- package/src/modules/organization/docs/commands/UpdateDepartment.md +9 -10
- package/src/modules/organization/docs/commands/UpdateSite.md +12 -12
- package/src/modules/product-management/command/updateProduct.test.ts +17 -11
- package/src/modules/product-management/command/updateProduct.ts +45 -28
- package/src/modules/product-management/command/updateProductAttribute.test.ts +16 -21
- package/src/modules/product-management/command/updateProductAttribute.ts +40 -26
- package/src/modules/product-management/command/updateProductAttributeValue.ts +2 -3
- package/src/modules/product-management/command/updateProductCategory.test.ts +14 -19
- package/src/modules/product-management/command/updateProductCategory.ts +42 -26
- package/src/modules/product-management/docs/commands/UpdateProduct.md +16 -20
- package/src/modules/product-management/docs/commands/UpdateProductAttribute.md +10 -14
- package/src/modules/product-management/docs/commands/UpdateProductCategory.md +10 -14
- package/src/modules/purchase/command/updateGoodsReceipt.ts +2 -3
- package/src/modules/purchase/command/updatePurchaseBill.ts +2 -3
- package/src/modules/purchase/command/updatePurchaseOrder.ts +2 -3
- package/src/modules/purchase/command/updatePurchasePaymentTerm.ts +2 -3
- package/src/modules/purchase/command/updatePurchasePriceList.ts +2 -3
- package/src/modules/purchase/command/updatePurchasePriceRule.ts +2 -3
- package/src/modules/sales/command/updateChannel.test.ts +4 -4
- package/src/modules/sales/command/updateChannel.ts +2 -3
- package/src/modules/sales/command/updateListing.test.ts +2 -2
- package/src/modules/sales/command/updateListing.ts +2 -3
- package/src/modules/sales/command/updateSalesCreditNote.test.ts +2 -2
- package/src/modules/sales/command/updateSalesCreditNote.ts +2 -3
- package/src/modules/sales/command/updateSalesInvoice.test.ts +2 -2
- package/src/modules/sales/command/updateSalesInvoice.ts +2 -3
- package/src/modules/sales/command/updateSalesOrder.test.ts +3 -3
- package/src/modules/sales/command/updateSalesOrder.ts +2 -3
- package/src/modules/sales/command/updateSalesPaymentTerm.test.ts +2 -2
- package/src/modules/sales/command/updateSalesPaymentTerm.ts +2 -3
- package/src/modules/sales/command/updateSalesPriceList.test.ts +3 -3
- package/src/modules/sales/command/updateSalesPriceList.ts +2 -3
- package/src/modules/sales/command/updateSalesPriceRule.test.ts +3 -3
- package/src/modules/sales/command/updateSalesPriceRule.ts +2 -3
- package/src/modules/sales/command/updateShipment.test.ts +2 -2
- package/src/modules/sales/command/updateShipment.ts +2 -3
- package/src/modules/sales/docs/commands/UpdateChannel.md +4 -4
- package/src/modules/sales/docs/commands/UpdateListing.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesCreditNote.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesInvoice.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesOrder.md +3 -3
- package/src/modules/sales/docs/commands/UpdateSalesPaymentTerm.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesPriceList.md +3 -3
- package/src/modules/sales/docs/commands/UpdateSalesPriceRule.md +3 -3
- package/src/modules/sales/docs/commands/UpdateShipment.md +2 -2
- package/src/modules/user-management/README.md +2 -1
- package/src/modules/user-management/command/updateOwnProfile.generated.ts +6 -0
- package/src/modules/user-management/command/updateOwnProfile.test.ts +191 -0
- package/src/modules/user-management/command/updateOwnProfile.ts +82 -0
- package/src/modules/user-management/command/updateUser.generated.ts +6 -0
- package/src/modules/user-management/command/updateUser.test.ts +195 -0
- package/src/modules/user-management/command/updateUser.ts +76 -0
- package/src/modules/user-management/docs/commands/UpdateOwnProfile.md +68 -0
- package/src/modules/user-management/docs/commands/UpdateUser.md +67 -0
- package/src/modules/user-management/docs/features/user-account-management.md +28 -3
- package/src/modules/user-management/docs/models/User.md +2 -0
- package/src/modules/user-management/lib/errors.generated.ts +5 -0
- package/src/modules/user-management/lib/permissions.generated.ts +2 -0
- package/src/modules/user-management/module.ts +5 -0
- package/src/modules/user-management/seed/index.ts +19 -0
- package/templates/scaffold/app/backend/seed/data/AuditEntry.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/AuditPolicy.jsonl +7 -0
- package/templates/scaffold/app/backend/seed/data/AuditPolicy.schema.ts +15 -0
- package/templates/scaffold/app/backend/seed/data/AuditableEntity.jsonl +4 -0
- package/templates/scaffold/app/backend/seed/data/AuditableEntity.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/ChangeDetail.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/Company.schema.ts +15 -0
- package/templates/scaffold/app/backend/seed/data/Permission.jsonl +13 -0
- package/templates/scaffold/app/backend/seed/data/Permission.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/PolicyFieldRule.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/Role.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/Role.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/RolePermission.jsonl +13 -0
- package/templates/scaffold/app/backend/seed/data/RolePermission.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/User.jsonl +1 -1
- package/templates/scaffold/app/backend/seed/data/User.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/UserRole.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/UserRole.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/_User.jsonl +1 -1
- package/templates/scaffold/app/backend/seed/exec.mjs +12 -0
- package/templates/scaffold/app/backend/src/executors/permissionCreated.ts +2 -2
- package/templates/scaffold/app/backend/src/executors/permissionDeleted.ts +2 -2
- package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +62 -0
- package/templates/scaffold/app/backend/src/modules-db.ts +13 -0
- package/templates/scaffold/app/backend/src/modules.ts +3 -5
- package/templates/scaffold/app/backend/src/resolvers/assignPermissionToRole.ts +70 -0
- package/templates/scaffold/app/backend/src/resolvers/assignRoleToUser.ts +72 -0
- package/templates/scaffold/app/backend/src/resolvers/createRole.ts +92 -0
- package/templates/scaffold/app/backend/src/resolvers/createUser.ts +113 -13
- package/templates/scaffold/app/backend/src/resolvers/deactivateUser.ts +67 -0
- package/templates/scaffold/app/backend/src/resolvers/reactivateUser.ts +63 -0
- package/templates/scaffold/app/backend/src/resolvers/revokePermissionFromRole.ts +72 -0
- package/templates/scaffold/app/backend/src/resolvers/revokeRoleFromUser.ts +72 -0
- package/templates/scaffold/app/backend/src/resolvers/updateOwnProfile.ts +107 -0
- package/templates/scaffold/app/backend/src/resolvers/updateUserProfile.ts +107 -0
- package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log-detail.test.ts +79 -0
- package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log.test.ts +86 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--assign-role-to-user.test.ts +103 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--create-role.test.ts +61 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--remove-role-from-user.test.ts +89 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--update-role-permissions.test.ts +125 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--browse-user-list.test.ts +91 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--create-user-account.test.ts +97 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--toggle-user-status.test.ts +131 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-own-profile.test.ts +85 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-user-profile.test.ts +158 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-own-profile.test.ts +30 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-user-detail.test.ts +98 -0
- package/templates/scaffold/app/backend/tailor.config.ts +6 -2
- package/templates/scaffold/app/docs/actors/user.md +11 -0
- package/templates/scaffold/app/docs/business-flow/audit-log/README.md +31 -0
- package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log-detail.md +35 -0
- package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log.md +44 -0
- package/templates/scaffold/app/docs/business-flow/role-management/README.md +33 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--assign-role-to-user.md +35 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--create-role.md +41 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--remove-role-from-user.md +33 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--update-role-permissions.md +41 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/README.md +48 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--browse-user-list.md +38 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--create-user-account.md +45 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--toggle-user-status.md +38 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-own-profile.md +36 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-user-profile.md +41 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-own-profile.md +30 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-user-detail.md +33 -0
- package/templates/scaffold/app/docs/resolver/assignPermissionToRole.md +16 -0
- package/templates/scaffold/app/docs/resolver/assignRoleToUser.md +17 -0
- package/templates/scaffold/app/docs/resolver/createRole.md +17 -0
- package/templates/scaffold/app/docs/resolver/createUser.md +23 -0
- package/templates/scaffold/app/docs/resolver/deactivateUser.md +17 -0
- package/templates/scaffold/app/docs/resolver/reactivateUser.md +16 -0
- package/templates/scaffold/app/docs/resolver/revokePermissionFromRole.md +17 -0
- package/templates/scaffold/app/docs/resolver/revokeRoleFromUser.md +17 -0
- package/templates/scaffold/app/docs/resolver/updateOwnProfile.md +20 -0
- package/templates/scaffold/app/docs/resolver/updateUserProfile.md +19 -0
- package/templates/scaffold/app/docs/screen/audit-entry-detail.md +30 -0
- package/templates/scaffold/app/docs/screen/audit-entry-list.md +25 -0
- package/templates/scaffold/app/docs/screen/my-profile-edit-form.md +22 -0
- package/templates/scaffold/app/docs/screen/my-profile.md +27 -0
- package/templates/scaffold/app/docs/screen/role-create-form.md +23 -0
- package/templates/scaffold/app/docs/screen/role-detail.md +27 -0
- package/templates/scaffold/app/docs/screen/role-edit-form.md +21 -0
- package/templates/scaffold/app/docs/screen/role-list.md +23 -0
- package/templates/scaffold/app/docs/screen/user-create-form.md +23 -0
- package/templates/scaffold/app/docs/screen/user-detail.md +33 -0
- package/templates/scaffold/app/docs/screen/user-edit-form.md +22 -0
- package/templates/scaffold/app/docs/screen/user-list.md +24 -0
- package/templates/scaffold/app/frontend/package.json +1 -1
- package/templates/scaffold/app/frontend/src/App.tsx +4 -0
- package/templates/scaffold/app/frontend/src/components/composed/error-fallback.tsx +1 -1
- package/templates/scaffold/app/frontend/src/graphql/generated/graphql-env.d.ts +59 -31
- package/templates/scaffold/app/frontend/src/graphql/generated/schema.graphql +1411 -688
- package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +1 -1
- package/templates/scaffold/app/frontend/src/lib/permission-groups.ts +59 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/[id]/components/audit-entry-detail.tsx +102 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/[id]/page.tsx +65 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/components/audit-entries-table.tsx +90 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/page.tsx +52 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/components/edit-profile-form.tsx +125 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/page.tsx +41 -21
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-actions.tsx +26 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-detail.tsx +69 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/components/edit-role-form.tsx +192 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/page.tsx +51 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/page.tsx +56 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/components/roles-table.tsx +85 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/create/components/create-role-form.tsx +204 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/create/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/page.tsx +60 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-actions.tsx +216 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-detail.tsx +97 -33
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/components/edit-user-form.tsx +115 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/page.tsx +51 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/page.tsx +8 -2
- package/templates/scaffold/app/frontend/src/pages/user-management/user/components/users-table.tsx +43 -42
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +120 -45
- package/templates/scaffold/app/frontend/src/pages/user-management/user/page.tsx +3 -4
- package/templates/scaffold/app/frontend/src/providers/graphql-provider.tsx +8 -1
- package/templates/scaffold/module/eslint.config.js +8 -0
- package/templates/scaffold/project/__dot__gitignore +1 -0
- package/templates/scaffold/project/__pnpm-workspace.yaml +3 -0
- package/templates/scaffold/project/apps/.gitkeep +0 -0
- package/templates/scaffold/project/modules/.gitkeep +0 -0
- package/templates/scaffold/project/package.json +15 -0
- package/templates/workflows/erp-kit-check.yml +10 -4
- package/templates/scaffold/app/frontend/src/components/ui/badge.tsx +0 -39
- package/templates/scaffold/app/frontend/src/components/ui/button.tsx +0 -60
- package/templates/scaffold/app/frontend/src/components/ui/card.tsx +0 -75
- package/templates/scaffold/app/frontend/src/components/ui/input.tsx +0 -21
- package/templates/scaffold/app/frontend/src/components/ui/table.tsx +0 -90
- /package/src/modules/{supplier-portal → accounting/executor}/.gitkeep +0 -0
- /package/templates/scaffold/app/{docs/actors/.gitkeep → backend/seed/data/AuditEntry.jsonl} +0 -0
- /package/templates/scaffold/app/{docs/business-flow/.gitkeep → backend/seed/data/ChangeDetail.jsonl} +0 -0
- /package/templates/scaffold/app/{docs/resolver/.gitkeep → backend/seed/data/Company.jsonl} +0 -0
- /package/templates/scaffold/app/{docs/screen/.gitkeep → backend/seed/data/PolicyFieldRule.jsonl} +0 -0
- /package/templates/{config → scaffold/project}/license.config.json +0 -0
|
@@ -2,19 +2,17 @@ import type { Transaction } from "../generated/kysely-tailordb";
|
|
|
2
2
|
import { StorageLocationNotFoundError, DuplicateLocationNameError } from "../lib/errors.generated";
|
|
3
3
|
import { ok, err, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
4
4
|
|
|
5
|
-
export
|
|
5
|
+
export type UpdateStorageLocationInput = {
|
|
6
6
|
id: string;
|
|
7
7
|
name?: string;
|
|
8
|
-
code?: string;
|
|
9
8
|
storageCondition?: string | null;
|
|
10
9
|
capacity?: number | null;
|
|
11
|
-
}
|
|
12
|
-
|
|
10
|
+
};
|
|
13
11
|
/**
|
|
14
12
|
* Function: updateStorageLocation
|
|
15
13
|
*
|
|
16
|
-
* Modifies the mutable fields of a storage location, including name,
|
|
17
|
-
* storageCondition, and capacity. warehouseId, parentId, and
|
|
14
|
+
* Modifies the mutable fields of a storage location, including name,
|
|
15
|
+
* storageCondition, and capacity. warehouseId, parentId, locationType, and code
|
|
18
16
|
* are immutable after creation.
|
|
19
17
|
*/
|
|
20
18
|
export async function run(
|
|
@@ -22,34 +20,32 @@ export async function run(
|
|
|
22
20
|
input: UpdateStorageLocationInput,
|
|
23
21
|
_ctx: CommandContext,
|
|
24
22
|
) {
|
|
25
|
-
const {
|
|
23
|
+
const { name, storageCondition, capacity } = input;
|
|
26
24
|
|
|
27
25
|
// 1. Check storage location exists
|
|
28
26
|
const location = await db
|
|
29
27
|
.selectFrom("StorageLocation")
|
|
30
28
|
.selectAll()
|
|
31
|
-
.where("id", "=", id)
|
|
29
|
+
.where("id", "=", input.id)
|
|
32
30
|
.forUpdate()
|
|
33
31
|
.executeTakeFirst();
|
|
34
32
|
|
|
35
33
|
if (!location) {
|
|
36
|
-
return err(new StorageLocationNotFoundError(id));
|
|
34
|
+
return err(new StorageLocationNotFoundError(input.id));
|
|
37
35
|
}
|
|
38
36
|
|
|
39
|
-
// 2. If name
|
|
37
|
+
// 2. If name changed, check uniqueness within warehouse
|
|
40
38
|
const nameChanged = name !== undefined && name !== location.name;
|
|
41
|
-
const codeChanged = code !== undefined && code !== location.code;
|
|
42
39
|
|
|
43
|
-
if (nameChanged
|
|
40
|
+
if (nameChanged) {
|
|
44
41
|
const checkName = name ?? location.name;
|
|
45
|
-
const checkCode = code ?? location.code;
|
|
46
42
|
|
|
47
43
|
const duplicate = await db
|
|
48
44
|
.selectFrom("StorageLocation")
|
|
49
45
|
.selectAll()
|
|
50
46
|
.where("warehouseId", "=", location.warehouseId)
|
|
51
|
-
.where("id", "!=", id)
|
|
52
|
-
.where(
|
|
47
|
+
.where("id", "!=", location.id)
|
|
48
|
+
.where("name", "=", checkName)
|
|
53
49
|
.forUpdate()
|
|
54
50
|
.executeTakeFirst();
|
|
55
51
|
|
|
@@ -61,7 +57,6 @@ export async function run(
|
|
|
61
57
|
// 3. Build update set
|
|
62
58
|
const updates: Record<string, unknown> = { updatedAt: new Date() };
|
|
63
59
|
if (name !== undefined) updates.name = name;
|
|
64
|
-
if (code !== undefined) updates.code = code;
|
|
65
60
|
if (storageCondition !== undefined) updates.storageCondition = storageCondition;
|
|
66
61
|
if (capacity !== undefined) updates.capacity = capacity;
|
|
67
62
|
|
|
@@ -69,7 +64,7 @@ export async function run(
|
|
|
69
64
|
const updatedLocation = await db
|
|
70
65
|
.updateTable("StorageLocation")
|
|
71
66
|
.set(updates)
|
|
72
|
-
.where("id", "=", id)
|
|
67
|
+
.where("id", "=", location.id)
|
|
73
68
|
.returningAll()
|
|
74
69
|
.executeTakeFirstOrThrow();
|
|
75
70
|
|
|
@@ -5,13 +5,12 @@ import {
|
|
|
5
5
|
} from "../lib/errors.generated";
|
|
6
6
|
import { ok, err, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
7
7
|
|
|
8
|
-
export
|
|
8
|
+
export type UpdateValuationPolicyInput = {
|
|
9
9
|
id: string;
|
|
10
10
|
name?: string;
|
|
11
11
|
costingMethod?: string;
|
|
12
12
|
standardCostRate?: number | null;
|
|
13
|
-
}
|
|
14
|
-
|
|
13
|
+
};
|
|
15
14
|
/**
|
|
16
15
|
* Function: updateValuationPolicy
|
|
17
16
|
*
|
|
@@ -2,13 +2,12 @@ import type { Transaction } from "../generated/kysely-tailordb";
|
|
|
2
2
|
import { WarehouseNotFoundError, DuplicateWarehouseNameError } from "../lib/errors.generated";
|
|
3
3
|
import { ok, err, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
4
4
|
|
|
5
|
-
export
|
|
5
|
+
export type UpdateWarehouseInput = {
|
|
6
6
|
id: string;
|
|
7
7
|
name?: string;
|
|
8
8
|
storageCondition?: string | null;
|
|
9
9
|
capacity?: number | null;
|
|
10
|
-
}
|
|
11
|
-
|
|
10
|
+
};
|
|
12
11
|
/**
|
|
13
12
|
* Function: updateWarehouse
|
|
14
13
|
*
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
updateLot modifies the mutable fields of a lot record, including manufactureDate, expirationDate, and supplierLotReference.
|
|
5
|
+
updateLot modifies the mutable fields of a lot record, including manufactureDate, expirationDate, and supplierLotReference. `lotNumber` is fixed by the existing record and is not part of the update input.
|
|
6
6
|
|
|
7
7
|
## Business Rules
|
|
8
8
|
|
|
9
9
|
- Lot must exist
|
|
10
10
|
- Lot must not be in FULLY_CONSUMED status
|
|
11
|
-
- lotNumber is
|
|
11
|
+
- lotNumber is not part of the update input
|
|
12
12
|
- Can update manufactureDate, expirationDate, and supplierLotReference
|
|
13
13
|
|
|
14
14
|
## Process Flow
|
|
@@ -38,4 +38,4 @@ flowchart TD
|
|
|
38
38
|
- returns error when lot is FULLY_CONSUMED
|
|
39
39
|
- updates expiration date
|
|
40
40
|
- updates supplier lot reference
|
|
41
|
-
- lot number
|
|
41
|
+
- lot number is not part of the update input
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
updateStorageLocation modifies the mutable fields of a storage location, including name,
|
|
5
|
+
updateStorageLocation modifies the mutable fields of a storage location, including name, storageCondition, and capacity. `warehouseId`, `parentId`, `locationType`, and `code` are fixed by the existing record and are not part of the mutable update payload.
|
|
6
6
|
|
|
7
7
|
## Business Rules
|
|
8
8
|
|
|
9
9
|
- Storage location must exist
|
|
10
|
-
- Name
|
|
11
|
-
- warehouseId, parentId, and
|
|
10
|
+
- Name must remain unique within the warehouse if changed
|
|
11
|
+
- warehouseId, parentId, locationType, and code are not part of the mutable update payload
|
|
12
12
|
|
|
13
13
|
## Process Flow
|
|
14
14
|
|
|
@@ -16,8 +16,8 @@ updateStorageLocation modifies the mutable fields of a storage location, includi
|
|
|
16
16
|
flowchart TD
|
|
17
17
|
A[Receive update request] --> B{Location exists?}
|
|
18
18
|
B -->|No| C[Return error: STORAGE_LOCATION_NOT_FOUND]
|
|
19
|
-
B -->|Yes| D{Name
|
|
20
|
-
D -->|Yes| E{New name
|
|
19
|
+
B -->|Yes| D{Name changed?}
|
|
20
|
+
D -->|Yes| E{New name unique in warehouse?}
|
|
21
21
|
E -->|No| F[Return error: DUPLICATE_LOCATION_NAME]
|
|
22
22
|
E -->|Yes| G[Update location record]
|
|
23
23
|
D -->|No| G
|
|
@@ -31,7 +31,7 @@ flowchart TD
|
|
|
31
31
|
## Error Scenarios
|
|
32
32
|
|
|
33
33
|
- **STORAGE_LOCATION_NOT_FOUND**: Referenced storage location does not exist
|
|
34
|
-
- **DUPLICATE_LOCATION_NAME**: A location with the new name
|
|
34
|
+
- **DUPLICATE_LOCATION_NAME**: A location with the new name already exists in the warehouse
|
|
35
35
|
|
|
36
36
|
## Test Cases
|
|
37
37
|
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
updateWarehouse modifies the mutable fields of an existing warehouse, including name, storageCondition, and capacity.
|
|
5
|
+
updateWarehouse modifies the mutable fields of an existing warehouse, including name, storageCondition, and capacity. `siteId` is fixed by the existing record and is not part of the update input.
|
|
6
6
|
|
|
7
7
|
## Business Rules
|
|
8
8
|
|
|
9
9
|
- Warehouse must exist
|
|
10
10
|
- Name must remain unique within the same site if changed
|
|
11
|
-
- siteId is
|
|
11
|
+
- siteId is not part of the update input
|
|
12
12
|
|
|
13
13
|
## Process Flow
|
|
14
14
|
|
|
@@ -6,7 +6,6 @@ import {
|
|
|
6
6
|
UnitNotFoundError,
|
|
7
7
|
ItemNotFoundError,
|
|
8
8
|
NoFieldsToUpdateError,
|
|
9
|
-
SkuImmutableError,
|
|
10
9
|
UomLockedError,
|
|
11
10
|
} from "../lib/errors.generated";
|
|
12
11
|
import { baseActiveItem, baseDraftItem, baseInactiveItem } from "../testing/fixtures";
|
|
@@ -31,17 +30,6 @@ describe("updateItem", () => {
|
|
|
31
30
|
}
|
|
32
31
|
});
|
|
33
32
|
|
|
34
|
-
it("returns error when attempting to change SKU", async () => {
|
|
35
|
-
const { db, spies } = createMockDb<Transaction>();
|
|
36
|
-
spies.select.mockReturnValueOnce(baseDraftItem);
|
|
37
|
-
|
|
38
|
-
const result = await run(db, { id: baseDraftItem.id, sku: "NEW-SKU" }, ctx, { getUnit });
|
|
39
|
-
expect(result.ok).toBe(false);
|
|
40
|
-
if (!result.ok) {
|
|
41
|
-
expect(result.error).toBeInstanceOf(SkuImmutableError);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
|
|
45
33
|
it("returns error when no fields to update", async () => {
|
|
46
34
|
const { db, spies } = createMockDb<Transaction>();
|
|
47
35
|
spies.select.mockReturnValueOnce(baseDraftItem);
|
|
@@ -118,6 +106,22 @@ describe("updateItem", () => {
|
|
|
118
106
|
expect(spies.update).toHaveBeenCalled();
|
|
119
107
|
});
|
|
120
108
|
|
|
109
|
+
it("looks up item by sku and updates name", async () => {
|
|
110
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
111
|
+
const updatedItem = { ...baseActiveItem, name: "Updated Name" };
|
|
112
|
+
spies.select.mockReturnValueOnce(baseActiveItem);
|
|
113
|
+
spies.update.mockReturnValue(updatedItem);
|
|
114
|
+
|
|
115
|
+
const result = await run(db, { sku: baseActiveItem.sku, name: "Updated Name" }, ctx, {
|
|
116
|
+
getUnit,
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
expect(result.ok).toBe(true);
|
|
120
|
+
if (result.ok) {
|
|
121
|
+
expect(result.value.item.name).toBe("Updated Name");
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
|
|
121
125
|
it("updates barcode in any status", async () => {
|
|
122
126
|
const { db, spies } = createMockDb<Transaction>();
|
|
123
127
|
const updatedItem = { ...baseActiveItem, barcode: "NEW-BAR" };
|
|
@@ -4,68 +4,84 @@ import {
|
|
|
4
4
|
UnitNotFoundError,
|
|
5
5
|
ItemNotFoundError,
|
|
6
6
|
NoFieldsToUpdateError,
|
|
7
|
-
SkuImmutableError,
|
|
8
7
|
UomLockedError,
|
|
9
8
|
} from "../lib/errors.generated";
|
|
10
9
|
import { type PrimitivesQueries } from "../module";
|
|
11
10
|
import { ok, err, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
12
11
|
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
export type UpdateItemInput = (
|
|
13
|
+
| {
|
|
14
|
+
id: string;
|
|
15
|
+
}
|
|
16
|
+
| {
|
|
17
|
+
sku: string;
|
|
18
|
+
}
|
|
19
|
+
) & {
|
|
16
20
|
name?: string;
|
|
17
21
|
barcode?: string | null;
|
|
18
22
|
unitId?: string;
|
|
19
|
-
}
|
|
23
|
+
};
|
|
20
24
|
|
|
21
25
|
/**
|
|
22
26
|
* Function: updateItem
|
|
23
27
|
*
|
|
24
|
-
* Updates mutable fields of an existing item.
|
|
25
|
-
* UoM can only be changed in DRAFT status.
|
|
28
|
+
* Updates mutable fields of an existing item.
|
|
29
|
+
* The item can be looked up by id or sku. UoM can only be changed in DRAFT status.
|
|
26
30
|
*/
|
|
27
31
|
export async function run<CF extends Record<string, unknown>>(
|
|
28
32
|
db: Transaction,
|
|
29
|
-
input: UpdateItemInput & Partial<CF>,
|
|
33
|
+
input: UpdateItemInput & Omit<Partial<CF>, "status">,
|
|
30
34
|
ctx: CommandContext,
|
|
31
35
|
primitivesQueries?: Pick<PrimitivesQueries, "getUnit">,
|
|
32
36
|
) {
|
|
33
|
-
const {
|
|
34
|
-
|
|
35
|
-
// 1. Check item exists
|
|
36
|
-
const item = await db
|
|
37
|
-
.selectFrom("Item")
|
|
38
|
-
.selectAll()
|
|
39
|
-
.where("id", "=", id)
|
|
40
|
-
.forUpdate()
|
|
41
|
-
.executeTakeFirst();
|
|
37
|
+
const { name, barcode, unitId } = input;
|
|
42
38
|
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
const ITEM_OWN_KEYS = new Set(["id", "sku", "name", "barcode", "unitId"]);
|
|
40
|
+
const customFields: Record<string, unknown> = {};
|
|
41
|
+
for (const [key, value] of Object.entries(input as Record<string, unknown>)) {
|
|
42
|
+
if (!ITEM_OWN_KEYS.has(key)) {
|
|
43
|
+
customFields[key] = value;
|
|
44
|
+
}
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
// 1. Check item exists (lookup by id or sku)
|
|
48
|
+
const item =
|
|
49
|
+
"id" in input
|
|
50
|
+
? await db
|
|
51
|
+
.selectFrom("Item")
|
|
52
|
+
.selectAll()
|
|
53
|
+
.where("id", "=", (input as { id: string }).id)
|
|
54
|
+
.forUpdate()
|
|
55
|
+
.executeTakeFirst()
|
|
56
|
+
: await db
|
|
57
|
+
.selectFrom("Item")
|
|
58
|
+
.selectAll()
|
|
59
|
+
.where("sku", "=", (input as { sku: string }).sku)
|
|
60
|
+
.forUpdate()
|
|
61
|
+
.executeTakeFirst();
|
|
62
|
+
|
|
63
|
+
if (!item) {
|
|
64
|
+
const key = "id" in input ? (input as { id: string }).id : (input as { sku: string }).sku;
|
|
65
|
+
return err(new ItemNotFoundError(key));
|
|
50
66
|
}
|
|
51
67
|
|
|
52
|
-
//
|
|
68
|
+
// 2. Check at least one field provided
|
|
53
69
|
const hasName = name !== undefined;
|
|
54
70
|
const hasBarcode = barcode !== undefined;
|
|
55
71
|
const hasUnitId = unitId !== undefined;
|
|
56
72
|
const hasCustomFields = Object.keys(customFields).length > 0;
|
|
57
73
|
|
|
58
74
|
if (!hasName && !hasBarcode && !hasUnitId && !hasCustomFields) {
|
|
59
|
-
return err(new NoFieldsToUpdateError(id));
|
|
75
|
+
return err(new NoFieldsToUpdateError(item.id));
|
|
60
76
|
}
|
|
61
77
|
|
|
62
|
-
//
|
|
78
|
+
// 3. Check barcode uniqueness when provided (non-null)
|
|
63
79
|
if (hasBarcode && barcode !== null) {
|
|
64
80
|
const existingBarcode = await db
|
|
65
81
|
.selectFrom("Item")
|
|
66
82
|
.selectAll()
|
|
67
83
|
.where("barcode", "=", barcode)
|
|
68
|
-
.where("id", "!=", id)
|
|
84
|
+
.where("id", "!=", item.id)
|
|
69
85
|
.forUpdate()
|
|
70
86
|
.executeTakeFirst();
|
|
71
87
|
|
|
@@ -74,10 +90,10 @@ export async function run<CF extends Record<string, unknown>>(
|
|
|
74
90
|
}
|
|
75
91
|
}
|
|
76
92
|
|
|
77
|
-
//
|
|
93
|
+
// 4. UoM can only be changed in DRAFT status
|
|
78
94
|
if (hasUnitId) {
|
|
79
95
|
if (item.status !== "DRAFT") {
|
|
80
|
-
return err(new UomLockedError(id));
|
|
96
|
+
return err(new UomLockedError(item.id));
|
|
81
97
|
}
|
|
82
98
|
|
|
83
99
|
// Validate UoM exists and is active
|
|
@@ -88,9 +104,9 @@ export async function run<CF extends Record<string, unknown>>(
|
|
|
88
104
|
}
|
|
89
105
|
}
|
|
90
106
|
|
|
91
|
-
//
|
|
107
|
+
// 5. Apply updates
|
|
92
108
|
const updates: Record<string, unknown> = {
|
|
93
|
-
...
|
|
109
|
+
...customFields,
|
|
94
110
|
updatedAt: new Date(),
|
|
95
111
|
};
|
|
96
112
|
if (hasName) updates.name = name;
|
|
@@ -100,7 +116,7 @@ export async function run<CF extends Record<string, unknown>>(
|
|
|
100
116
|
const updatedItem = await db
|
|
101
117
|
.updateTable("Item")
|
|
102
118
|
.set(updates)
|
|
103
|
-
.where("id", "=", id)
|
|
119
|
+
.where("id", "=", item.id)
|
|
104
120
|
.returningAll()
|
|
105
121
|
.executeTakeFirstOrThrow();
|
|
106
122
|
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { createMockDb } from "../../../testing/index";
|
|
3
3
|
import { Transaction } from "../generated/kysely-tailordb";
|
|
4
|
-
import {
|
|
5
|
-
CodeImmutableError,
|
|
6
|
-
MissingRequiredFieldsError,
|
|
7
|
-
NodeNotFoundError,
|
|
8
|
-
} from "../lib/errors.generated";
|
|
4
|
+
import { MissingRequiredFieldsError, NodeNotFoundError } from "../lib/errors.generated";
|
|
9
5
|
import { baseRootNode } from "../testing/fixtures";
|
|
10
6
|
import { run } from "./updateTaxonomyNode";
|
|
11
7
|
|
|
@@ -21,17 +17,6 @@ describe("updateTaxonomyNode", () => {
|
|
|
21
17
|
}
|
|
22
18
|
});
|
|
23
19
|
|
|
24
|
-
it("returns error when attempting to change code", async () => {
|
|
25
|
-
const { db, spies } = createMockDb<Transaction>();
|
|
26
|
-
spies.select.mockReturnValueOnce(baseRootNode);
|
|
27
|
-
|
|
28
|
-
const result = await run(db, { id: baseRootNode.id, code: "NEW-CODE" });
|
|
29
|
-
expect(result.ok).toBe(false);
|
|
30
|
-
if (!result.ok) {
|
|
31
|
-
expect(result.error).toBeInstanceOf(CodeImmutableError);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
|
|
35
20
|
it("returns error when name is empty", async () => {
|
|
36
21
|
const { db, spies } = createMockDb<Transaction>();
|
|
37
22
|
spies.select.mockReturnValueOnce(baseRootNode);
|
|
@@ -69,6 +54,20 @@ describe("updateTaxonomyNode", () => {
|
|
|
69
54
|
expect(spies.update).toHaveBeenCalled();
|
|
70
55
|
});
|
|
71
56
|
|
|
57
|
+
it("looks up node by code and updates name", async () => {
|
|
58
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
59
|
+
const updatedNode = { ...baseRootNode, name: "Consumer Electronics" };
|
|
60
|
+
spies.select.mockReturnValueOnce(baseRootNode);
|
|
61
|
+
spies.update.mockReturnValue(updatedNode);
|
|
62
|
+
|
|
63
|
+
const result = await run(db, { code: baseRootNode.code, name: "Consumer Electronics" });
|
|
64
|
+
|
|
65
|
+
expect(result.ok).toBe(true);
|
|
66
|
+
if (result.ok) {
|
|
67
|
+
expect(result.value.node.name).toBe("Consumer Electronics");
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
72
71
|
it("passes custom fields through to set", async () => {
|
|
73
72
|
const { db, spies } = createMockDb<Transaction>();
|
|
74
73
|
const updatedNode = { ...baseRootNode, sortOrder: 5 };
|
|
@@ -1,55 +1,68 @@
|
|
|
1
1
|
import { Transaction } from "../generated/kysely-tailordb";
|
|
2
|
-
import {
|
|
3
|
-
CodeImmutableError,
|
|
4
|
-
MissingRequiredFieldsError,
|
|
5
|
-
NodeNotFoundError,
|
|
6
|
-
} from "../lib/errors.generated";
|
|
2
|
+
import { MissingRequiredFieldsError, NodeNotFoundError } from "../lib/errors.generated";
|
|
7
3
|
import { ok, err } from "@tailor-platform/erp-kit/module";
|
|
8
4
|
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
export type UpdateTaxonomyNodeInput = (
|
|
6
|
+
| {
|
|
7
|
+
id: string;
|
|
8
|
+
}
|
|
9
|
+
| {
|
|
10
|
+
code: string;
|
|
11
|
+
}
|
|
12
|
+
) & {
|
|
12
13
|
name?: string;
|
|
13
|
-
}
|
|
14
|
+
};
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Function: updateTaxonomyNode
|
|
17
18
|
*
|
|
18
19
|
* Updates the display name of an existing taxonomy node.
|
|
19
|
-
*
|
|
20
|
+
* The node can be looked up by id or code.
|
|
20
21
|
*/
|
|
21
22
|
export async function run<CF extends Record<string, unknown>>(
|
|
22
23
|
db: Transaction,
|
|
23
|
-
input: UpdateTaxonomyNodeInput & Partial<CF>,
|
|
24
|
+
input: UpdateTaxonomyNodeInput & Omit<Partial<CF>, "status">,
|
|
24
25
|
) {
|
|
25
|
-
const {
|
|
26
|
-
|
|
27
|
-
// 1. Check node exists
|
|
28
|
-
const node = await db
|
|
29
|
-
.selectFrom("TaxonomyNode")
|
|
30
|
-
.selectAll()
|
|
31
|
-
.where("id", "=", id)
|
|
32
|
-
.forUpdate()
|
|
33
|
-
.executeTakeFirst();
|
|
26
|
+
const { name } = input;
|
|
34
27
|
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
const KNOWN_KEYS = new Set(["id", "code", "name"]);
|
|
29
|
+
const customFields: Record<string, unknown> = {};
|
|
30
|
+
for (const [key, value] of Object.entries(input as Record<string, unknown>)) {
|
|
31
|
+
if (!KNOWN_KEYS.has(key)) {
|
|
32
|
+
customFields[key] = value;
|
|
33
|
+
}
|
|
37
34
|
}
|
|
38
35
|
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
// 1. Check node exists (lookup by id or code)
|
|
37
|
+
const node =
|
|
38
|
+
"id" in input
|
|
39
|
+
? await db
|
|
40
|
+
.selectFrom("TaxonomyNode")
|
|
41
|
+
.selectAll()
|
|
42
|
+
.where("id", "=", (input as { id: string }).id)
|
|
43
|
+
.forUpdate()
|
|
44
|
+
.executeTakeFirst()
|
|
45
|
+
: await db
|
|
46
|
+
.selectFrom("TaxonomyNode")
|
|
47
|
+
.selectAll()
|
|
48
|
+
.where("code", "=", (input as { code: string }).code)
|
|
49
|
+
.forUpdate()
|
|
50
|
+
.executeTakeFirst();
|
|
51
|
+
|
|
52
|
+
if (!node) {
|
|
53
|
+
const key = "id" in input ? (input as { id: string }).id : (input as { code: string }).code;
|
|
54
|
+
return err(new NodeNotFoundError(key));
|
|
42
55
|
}
|
|
43
56
|
|
|
44
|
-
//
|
|
57
|
+
// 2. Name must be provided and non-empty (unless custom fields provided)
|
|
45
58
|
const hasCustomFields = Object.keys(customFields).length > 0;
|
|
46
59
|
if (!name && !hasCustomFields) {
|
|
47
60
|
return err(new MissingRequiredFieldsError("name"));
|
|
48
61
|
}
|
|
49
62
|
|
|
50
|
-
//
|
|
63
|
+
// 3. Update fields
|
|
51
64
|
const updates: Record<string, unknown> = {
|
|
52
|
-
...
|
|
65
|
+
...customFields,
|
|
53
66
|
updatedAt: new Date(),
|
|
54
67
|
};
|
|
55
68
|
if (name) updates.name = name;
|
|
@@ -57,7 +70,7 @@ export async function run<CF extends Record<string, unknown>>(
|
|
|
57
70
|
const updatedNode = await db
|
|
58
71
|
.updateTable("TaxonomyNode")
|
|
59
72
|
.set(updates)
|
|
60
|
-
.where("id", "=", id)
|
|
73
|
+
.where("id", "=", node.id)
|
|
61
74
|
.returningAll()
|
|
62
75
|
.executeTakeFirstOrThrow();
|
|
63
76
|
|
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
updateItem modifies mutable fields of an existing item — name, barcode, and unit of measure (UoM).
|
|
5
|
+
updateItem modifies mutable fields of an existing item — name, barcode, and unit of measure (UoM). The item can be looked up by `id` or `sku`. The set of updatable fields depends on the item's current lifecycle status.
|
|
6
6
|
|
|
7
7
|
This command supports the DRAFT review workflow (correcting barcodes, setting names before activation) as well as post-activation updates to non-transactional fields.
|
|
8
8
|
|
|
9
9
|
## Business Rules
|
|
10
10
|
|
|
11
|
-
- Target item must exist in the system
|
|
12
|
-
- SKU is immutable — any attempt to change SKU returns an error
|
|
11
|
+
- Target item must exist in the system (looked up by `id` or `sku`)
|
|
13
12
|
- Name can be updated in any status (DRAFT, ACTIVE, INACTIVE)
|
|
14
13
|
- Barcode can be updated in any status; must remain unique across all items when provided
|
|
15
14
|
- Barcode can be cleared (set to null) to remove it from the item
|
|
@@ -21,11 +20,9 @@ This command supports the DRAFT review workflow (correcting barcodes, setting na
|
|
|
21
20
|
|
|
22
21
|
```mermaid
|
|
23
22
|
flowchart TD
|
|
24
|
-
A[Receive update request] --> B{
|
|
25
|
-
B -->|
|
|
26
|
-
B -->|
|
|
27
|
-
D -->|Yes| E[Return error: SKU immutable]
|
|
28
|
-
D -->|No| F{Any field provided?}
|
|
23
|
+
A[Receive update request] --> B{Lookup by id or sku}
|
|
24
|
+
B -->|Not found| C[Return error: not found]
|
|
25
|
+
B -->|Found| F{Any field provided?}
|
|
29
26
|
F -->|No| G[Return error: no fields to update]
|
|
30
27
|
F -->|Yes| H{Barcode provided?}
|
|
31
28
|
H -->|Yes| I{Barcode unique?}
|
|
@@ -47,8 +44,7 @@ flowchart TD
|
|
|
47
44
|
|
|
48
45
|
## Error Scenarios
|
|
49
46
|
|
|
50
|
-
- **ITEM_NOT_FOUND**: Specified item
|
|
51
|
-
- **SKU_IMMUTABLE**: Attempt to change the SKU field
|
|
47
|
+
- **ITEM_NOT_FOUND**: Specified item does not exist
|
|
52
48
|
- **DUPLICATE_BARCODE**: An item with the same barcode already exists
|
|
53
49
|
- **UNIT_NOT_FOUND**: Referenced unit does not exist or is inactive
|
|
54
50
|
- **UOM_LOCKED**: UoM cannot be changed after item has been activated (status is ACTIVE or INACTIVE)
|
|
@@ -57,13 +53,13 @@ flowchart TD
|
|
|
57
53
|
## Test Cases
|
|
58
54
|
|
|
59
55
|
- returns error when item does not exist
|
|
60
|
-
- returns error when attempting to change SKU
|
|
61
56
|
- returns error when no fields to update
|
|
62
57
|
- returns error when barcode is duplicate
|
|
63
58
|
- returns error when changing UoM on non-DRAFT item
|
|
64
59
|
- returns error when changing UoM on INACTIVE item
|
|
65
60
|
- returns error when new UoM does not exist
|
|
66
61
|
- updates name in any status
|
|
62
|
+
- looks up item by sku and updates name
|
|
67
63
|
- updates barcode in any status
|
|
68
64
|
- clears barcode by setting to null
|
|
69
65
|
- updates UoM in DRAFT status
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
updateTaxonomyNode modifies the display name of an existing taxonomy node. The node
|
|
5
|
+
updateTaxonomyNode modifies the display name of an existing taxonomy node. The node can be looked up by `id` or `code`. This supports scenarios such as renaming a classification branch to better reflect its contents or aligning terminology across the organization.
|
|
6
6
|
|
|
7
7
|
## Business Rules
|
|
8
8
|
|
|
9
|
-
- Target node must exist in the system
|
|
10
|
-
- Node code is immutable — any attempt to change the code returns an error
|
|
9
|
+
- Target node must exist in the system (looked up by `id` or `code`)
|
|
11
10
|
- Name is required and must not be empty
|
|
12
11
|
- Name update does not affect the node's position in the tree, child nodes, or item assignments
|
|
13
12
|
|
|
@@ -15,14 +14,12 @@ updateTaxonomyNode modifies the display name of an existing taxonomy node. The n
|
|
|
15
14
|
|
|
16
15
|
```mermaid
|
|
17
16
|
flowchart TD
|
|
18
|
-
A[Receive update request] --> B{
|
|
19
|
-
B -->|
|
|
20
|
-
B -->|
|
|
21
|
-
D -->|
|
|
22
|
-
D -->|
|
|
23
|
-
F
|
|
24
|
-
F -->|Yes| H[Update node name]
|
|
25
|
-
H --> I[Return updated node]
|
|
17
|
+
A[Receive update request] --> B{Lookup by id or code}
|
|
18
|
+
B -->|Not found| C[Return error: not found]
|
|
19
|
+
B -->|Found| D{Name provided and non-empty?}
|
|
20
|
+
D -->|No| E[Return error: name required]
|
|
21
|
+
D -->|Yes| F[Update node name]
|
|
22
|
+
F --> G[Return updated node]
|
|
26
23
|
```
|
|
27
24
|
|
|
28
25
|
## External Dependencies
|
|
@@ -31,15 +28,14 @@ flowchart TD
|
|
|
31
28
|
|
|
32
29
|
## Error Scenarios
|
|
33
30
|
|
|
34
|
-
- **NODE_NOT_FOUND**: Specified node
|
|
35
|
-
- **CODE_IMMUTABLE**: Attempt to change the node code
|
|
31
|
+
- **NODE_NOT_FOUND**: Specified node does not exist
|
|
36
32
|
- **MISSING_REQUIRED_FIELDS**: Name not provided or empty
|
|
37
33
|
|
|
38
34
|
## Test Cases
|
|
39
35
|
|
|
40
36
|
- returns error when node does not exist
|
|
41
|
-
- returns error when attempting to change code
|
|
42
37
|
- returns error when name is empty
|
|
43
38
|
- returns error when name is not provided
|
|
44
39
|
- updates node name
|
|
40
|
+
- looks up node by code and updates name
|
|
45
41
|
- passes custom fields through to set
|