@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
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Transaction } from "../generated/kysely-tailordb";
|
|
2
2
|
import {
|
|
3
3
|
ProductNotFoundError,
|
|
4
|
-
CodeImmutableError,
|
|
5
4
|
NoFieldsToUpdateError,
|
|
6
5
|
UomLockedError,
|
|
7
6
|
InvalidUomError,
|
|
@@ -10,63 +9,81 @@ import {
|
|
|
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 UpdateProductInput = (
|
|
13
|
+
| {
|
|
14
|
+
id: string;
|
|
15
|
+
}
|
|
16
|
+
| {
|
|
17
|
+
code: string;
|
|
18
|
+
}
|
|
19
|
+
) & {
|
|
16
20
|
name?: string;
|
|
17
21
|
description?: string;
|
|
18
22
|
unitId?: string;
|
|
19
|
-
}
|
|
23
|
+
};
|
|
20
24
|
|
|
21
25
|
/**
|
|
22
26
|
* Function: updateProduct
|
|
23
27
|
*
|
|
24
28
|
* Updates mutable fields of an existing product.
|
|
29
|
+
* The product can be looked up by id or code. UoM can only be changed in DRAFT status.
|
|
25
30
|
*/
|
|
26
31
|
export async function run<CF extends Record<string, unknown>>(
|
|
27
32
|
db: Transaction,
|
|
28
|
-
input: UpdateProductInput & CF
|
|
33
|
+
input: UpdateProductInput & Omit<Partial<CF>, "status">,
|
|
29
34
|
ctx: CommandContext,
|
|
30
35
|
primitivesQueries: Pick<PrimitivesQueries, "getUnit">,
|
|
31
36
|
) {
|
|
32
|
-
const {
|
|
33
|
-
|
|
34
|
-
// Check product exists (with lock)
|
|
35
|
-
const product = await db
|
|
36
|
-
.selectFrom("Product")
|
|
37
|
-
.selectAll()
|
|
38
|
-
.where("id", "=", id)
|
|
39
|
-
.forUpdate()
|
|
40
|
-
.executeTakeFirst();
|
|
37
|
+
const { name, description, unitId } = input;
|
|
41
38
|
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
const KNOWN_KEYS = new Set(["id", "code", "name", "description", "unitId"]);
|
|
40
|
+
const customFields: Record<string, unknown> = {};
|
|
41
|
+
for (const [key, value] of Object.entries(input as Record<string, unknown>)) {
|
|
42
|
+
if (!KNOWN_KEYS.has(key)) {
|
|
43
|
+
customFields[key] = value;
|
|
44
|
+
}
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
// 1. Check product exists (lookup by id or code)
|
|
48
|
+
const product =
|
|
49
|
+
"id" in input
|
|
50
|
+
? await db
|
|
51
|
+
.selectFrom("Product")
|
|
52
|
+
.selectAll()
|
|
53
|
+
.where("id", "=", (input as { id: string }).id)
|
|
54
|
+
.forUpdate()
|
|
55
|
+
.executeTakeFirst()
|
|
56
|
+
: await db
|
|
57
|
+
.selectFrom("Product")
|
|
58
|
+
.selectAll()
|
|
59
|
+
.where("code", "=", (input as { code: string }).code)
|
|
60
|
+
.forUpdate()
|
|
61
|
+
.executeTakeFirst();
|
|
62
|
+
|
|
63
|
+
if (!product) {
|
|
64
|
+
const key = "id" in input ? (input as { id: string }).id : (input as { code: string }).code;
|
|
65
|
+
return err(new ProductNotFoundError(key));
|
|
49
66
|
}
|
|
50
67
|
|
|
51
|
-
// Check if any fields to update
|
|
68
|
+
// 2. Check if any fields to update
|
|
52
69
|
const hasNameUpdate = name !== undefined;
|
|
53
70
|
const hasDescriptionUpdate = description !== undefined;
|
|
54
71
|
const hasUnitUpdate = unitId !== undefined;
|
|
55
72
|
const hasCustomFields = Object.keys(customFields).length > 0;
|
|
56
73
|
|
|
57
74
|
if (!hasNameUpdate && !hasDescriptionUpdate && !hasUnitUpdate && !hasCustomFields) {
|
|
58
|
-
return err(new NoFieldsToUpdateError(id));
|
|
75
|
+
return err(new NoFieldsToUpdateError(product.id));
|
|
59
76
|
}
|
|
60
77
|
|
|
61
|
-
// Validate name if provided
|
|
78
|
+
// 3. Validate name if provided
|
|
62
79
|
if (hasNameUpdate && !name?.trim()) {
|
|
63
80
|
return err(new MissingRequiredFieldError("name"));
|
|
64
81
|
}
|
|
65
82
|
|
|
66
|
-
// UoM can only be updated in DRAFT status
|
|
83
|
+
// 4. UoM can only be updated in DRAFT status
|
|
67
84
|
if (hasUnitUpdate) {
|
|
68
85
|
if (product.status !== "DRAFT") {
|
|
69
|
-
return err(new UomLockedError(id));
|
|
86
|
+
return err(new UomLockedError(product.id));
|
|
70
87
|
}
|
|
71
88
|
const unitResult = await primitivesQueries.getUnit(db, { id: unitId }, ctx);
|
|
72
89
|
if (!unitResult.ok) return err(new InvalidUomError(unitId));
|
|
@@ -75,9 +92,9 @@ export async function run<CF extends Record<string, unknown>>(
|
|
|
75
92
|
}
|
|
76
93
|
}
|
|
77
94
|
|
|
78
|
-
// Build update payload
|
|
95
|
+
// 5. Build update payload
|
|
79
96
|
const updates: Record<string, unknown> = {
|
|
80
|
-
...
|
|
97
|
+
...customFields,
|
|
81
98
|
updatedAt: new Date(),
|
|
82
99
|
};
|
|
83
100
|
if (hasNameUpdate) updates.name = name;
|
|
@@ -87,7 +104,7 @@ export async function run<CF extends Record<string, unknown>>(
|
|
|
87
104
|
const updated = await db
|
|
88
105
|
.updateTable("Product")
|
|
89
106
|
.set(updates)
|
|
90
|
-
.where("id", "=", id)
|
|
107
|
+
.where("id", "=", product.id)
|
|
91
108
|
.returningAll()
|
|
92
109
|
.executeTakeFirst();
|
|
93
110
|
|
|
@@ -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
|
-
AttributeNotFoundError,
|
|
6
|
-
CodeImmutableError,
|
|
7
|
-
MissingRequiredFieldError,
|
|
8
|
-
} from "../lib/errors.generated";
|
|
4
|
+
import { AttributeNotFoundError, MissingRequiredFieldError } from "../lib/errors.generated";
|
|
9
5
|
import { baseColorAttribute } from "../testing/fixtures";
|
|
10
6
|
import { run } from "./updateProductAttribute";
|
|
11
7
|
|
|
@@ -22,22 +18,6 @@ describe("updateProductAttribute", () => {
|
|
|
22
18
|
}
|
|
23
19
|
});
|
|
24
20
|
|
|
25
|
-
it("returns error when trying to change code", async () => {
|
|
26
|
-
const { db, spies } = createMockDb<Transaction>();
|
|
27
|
-
spies.select.mockReturnValueOnce(baseColorAttribute);
|
|
28
|
-
|
|
29
|
-
const result = await run(db, {
|
|
30
|
-
id: baseColorAttribute.id,
|
|
31
|
-
code: "NEW-CODE",
|
|
32
|
-
name: "Color",
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
expect(result.ok).toBe(false);
|
|
36
|
-
if (!result.ok) {
|
|
37
|
-
expect(result.error).toBeInstanceOf(CodeImmutableError);
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
|
|
41
21
|
it("returns error when no fields provided", async () => {
|
|
42
22
|
const { db, spies } = createMockDb<Transaction>();
|
|
43
23
|
spies.select.mockReturnValueOnce(baseColorAttribute);
|
|
@@ -98,4 +78,19 @@ describe("updateProductAttribute", () => {
|
|
|
98
78
|
}
|
|
99
79
|
expect(spies.update).toHaveBeenCalled();
|
|
100
80
|
});
|
|
81
|
+
|
|
82
|
+
it("looks up attribute by code and updates name", async () => {
|
|
83
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
84
|
+
const updatedAttribute = { ...baseColorAttribute, name: "Updated Color" };
|
|
85
|
+
|
|
86
|
+
spies.select.mockReturnValueOnce(baseColorAttribute);
|
|
87
|
+
spies.update.mockReturnValue(updatedAttribute);
|
|
88
|
+
|
|
89
|
+
const result = await run(db, { code: baseColorAttribute.code, name: "Updated Color" });
|
|
90
|
+
|
|
91
|
+
expect(result.ok).toBe(true);
|
|
92
|
+
if (result.ok) {
|
|
93
|
+
expect(result.value.attribute.name).toBe("Updated Color");
|
|
94
|
+
}
|
|
95
|
+
});
|
|
101
96
|
});
|
|
@@ -1,50 +1,64 @@
|
|
|
1
1
|
import { Transaction } from "../generated/kysely-tailordb";
|
|
2
|
-
import {
|
|
3
|
-
AttributeNotFoundError,
|
|
4
|
-
CodeImmutableError,
|
|
5
|
-
MissingRequiredFieldError,
|
|
6
|
-
} from "../lib/errors.generated";
|
|
2
|
+
import { AttributeNotFoundError, MissingRequiredFieldError } from "../lib/errors.generated";
|
|
7
3
|
import { ok, err } from "@tailor-platform/erp-kit/module";
|
|
8
4
|
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
export type UpdateProductAttributeInput = (
|
|
6
|
+
| {
|
|
7
|
+
id: string;
|
|
8
|
+
}
|
|
9
|
+
| {
|
|
10
|
+
code: string;
|
|
11
|
+
}
|
|
12
|
+
) & {
|
|
12
13
|
name?: string;
|
|
13
|
-
}
|
|
14
|
+
};
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Function: updateProductAttribute
|
|
17
18
|
*
|
|
18
|
-
* Updates the display name of an existing attribute.
|
|
19
|
+
* Updates the display name of an existing product attribute.
|
|
20
|
+
* The attribute can be looked up by id or code.
|
|
19
21
|
*/
|
|
20
22
|
export async function run<CF extends Record<string, unknown>>(
|
|
21
23
|
db: Transaction,
|
|
22
|
-
input: UpdateProductAttributeInput & CF
|
|
24
|
+
input: UpdateProductAttributeInput & Omit<Partial<CF>, "status">,
|
|
23
25
|
) {
|
|
24
|
-
const {
|
|
26
|
+
const { name } = input;
|
|
25
27
|
|
|
26
|
-
const
|
|
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
|
+
}
|
|
34
|
+
}
|
|
27
35
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
// 1. Check attribute exists (lookup by id or code)
|
|
37
|
+
const attribute =
|
|
38
|
+
"id" in input
|
|
39
|
+
? await db
|
|
40
|
+
.selectFrom("ProductAttribute")
|
|
41
|
+
.selectAll()
|
|
42
|
+
.where("id", "=", (input as { id: string }).id)
|
|
43
|
+
.forUpdate()
|
|
44
|
+
.executeTakeFirst()
|
|
45
|
+
: await db
|
|
46
|
+
.selectFrom("ProductAttribute")
|
|
47
|
+
.selectAll()
|
|
48
|
+
.where("code", "=", (input as { code: string }).code)
|
|
49
|
+
.forUpdate()
|
|
50
|
+
.executeTakeFirst();
|
|
34
51
|
|
|
35
52
|
if (!attribute) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (code !== undefined) {
|
|
40
|
-
return err(new CodeImmutableError(id));
|
|
53
|
+
const key = "id" in input ? (input as { id: string }).id : (input as { code: string }).code;
|
|
54
|
+
return err(new AttributeNotFoundError(key));
|
|
41
55
|
}
|
|
42
56
|
|
|
43
57
|
const hasNameUpdate = name !== undefined;
|
|
44
58
|
const hasCustomFields = Object.keys(customFields).length > 0;
|
|
45
59
|
|
|
46
60
|
if (!hasNameUpdate && !hasCustomFields) {
|
|
47
|
-
return err(new MissingRequiredFieldError(id));
|
|
61
|
+
return err(new MissingRequiredFieldError(attribute.id));
|
|
48
62
|
}
|
|
49
63
|
|
|
50
64
|
if (hasNameUpdate && !name?.trim()) {
|
|
@@ -60,7 +74,7 @@ export async function run<CF extends Record<string, unknown>>(
|
|
|
60
74
|
const updated = await db
|
|
61
75
|
.updateTable("ProductAttribute")
|
|
62
76
|
.set(updates)
|
|
63
|
-
.where("id", "=", id)
|
|
77
|
+
.where("id", "=", attribute.id)
|
|
64
78
|
.returningAll()
|
|
65
79
|
.executeTakeFirst();
|
|
66
80
|
|
|
@@ -6,11 +6,10 @@ import {
|
|
|
6
6
|
} from "../lib/errors.generated";
|
|
7
7
|
import { ok, err } from "@tailor-platform/erp-kit/module";
|
|
8
8
|
|
|
9
|
-
export
|
|
9
|
+
export type UpdateProductAttributeValueInput = {
|
|
10
10
|
id: string;
|
|
11
11
|
label: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
12
|
+
};
|
|
14
13
|
/**
|
|
15
14
|
* Function: updateProductAttributeValue
|
|
16
15
|
*
|
|
@@ -2,11 +2,7 @@ import { describe, expect, it } from "vitest";
|
|
|
2
2
|
import { createMockDb } from "../../../testing/index";
|
|
3
3
|
import type { Transaction } from "../generated/kysely-tailordb";
|
|
4
4
|
import { baseRootCategory } from "../testing/fixtures";
|
|
5
|
-
import {
|
|
6
|
-
CategoryNotFoundError,
|
|
7
|
-
CodeImmutableError,
|
|
8
|
-
MissingRequiredFieldError,
|
|
9
|
-
} from "../lib/errors.generated";
|
|
5
|
+
import { CategoryNotFoundError, MissingRequiredFieldError } from "../lib/errors.generated";
|
|
10
6
|
import { run } from "./updateProductCategory";
|
|
11
7
|
|
|
12
8
|
describe("updateProductCategory", () => {
|
|
@@ -21,20 +17,6 @@ describe("updateProductCategory", () => {
|
|
|
21
17
|
}
|
|
22
18
|
});
|
|
23
19
|
|
|
24
|
-
it("should return CodeImmutableError when code is provided", async () => {
|
|
25
|
-
const { db, spies } = createMockDb<Transaction>();
|
|
26
|
-
spies.select.mockReturnValueOnce(baseRootCategory);
|
|
27
|
-
const input = {
|
|
28
|
-
id: baseRootCategory.id,
|
|
29
|
-
code: "NEW-CODE",
|
|
30
|
-
};
|
|
31
|
-
const result = await run(db, input);
|
|
32
|
-
expect(result.ok).toBe(false);
|
|
33
|
-
if (!result.ok) {
|
|
34
|
-
expect(result.error).toBeInstanceOf(CodeImmutableError);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
|
|
38
20
|
it("should return MissingRequiredFieldError when no fields are provided", async () => {
|
|
39
21
|
const { db, spies } = createMockDb<Transaction>();
|
|
40
22
|
spies.select.mockReturnValueOnce(baseRootCategory);
|
|
@@ -77,4 +59,17 @@ describe("updateProductCategory", () => {
|
|
|
77
59
|
expect(result.value.category.name).toBe("Apparel");
|
|
78
60
|
}
|
|
79
61
|
});
|
|
62
|
+
|
|
63
|
+
it("should look up category by code and update name", async () => {
|
|
64
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
65
|
+
spies.select.mockReturnValueOnce(baseRootCategory);
|
|
66
|
+
const updatedCategory = { ...baseRootCategory, name: "Apparel", updatedAt: new Date() };
|
|
67
|
+
spies.update.mockReturnValueOnce(updatedCategory);
|
|
68
|
+
|
|
69
|
+
const result = await run(db, { code: baseRootCategory.code, name: "Apparel" });
|
|
70
|
+
expect(result.ok).toBe(true);
|
|
71
|
+
if (result.ok) {
|
|
72
|
+
expect(result.value.category.name).toBe("Apparel");
|
|
73
|
+
}
|
|
74
|
+
});
|
|
80
75
|
});
|
|
@@ -1,48 +1,64 @@
|
|
|
1
1
|
import { Transaction } from "../generated/kysely-tailordb";
|
|
2
|
-
import {
|
|
3
|
-
CategoryNotFoundError,
|
|
4
|
-
CodeImmutableError,
|
|
5
|
-
MissingRequiredFieldError,
|
|
6
|
-
} from "../lib/errors.generated";
|
|
2
|
+
import { CategoryNotFoundError, MissingRequiredFieldError } from "../lib/errors.generated";
|
|
7
3
|
import { ok, err } from "@tailor-platform/erp-kit/module";
|
|
8
4
|
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
export type UpdateProductCategoryInput = (
|
|
6
|
+
| {
|
|
7
|
+
id: string;
|
|
8
|
+
}
|
|
9
|
+
| {
|
|
10
|
+
code: string;
|
|
11
|
+
}
|
|
12
|
+
) & {
|
|
12
13
|
name?: string;
|
|
13
|
-
}
|
|
14
|
+
};
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Function: updateProductCategory
|
|
17
18
|
*
|
|
18
|
-
* Updates the display name of an existing category.
|
|
19
|
+
* Updates the display name of an existing product category.
|
|
20
|
+
* The category can be looked up by id or code.
|
|
19
21
|
*/
|
|
20
22
|
export async function run<CF extends Record<string, unknown>>(
|
|
21
23
|
db: Transaction,
|
|
22
|
-
input: UpdateProductCategoryInput & CF
|
|
24
|
+
input: UpdateProductCategoryInput & Omit<Partial<CF>, "status">,
|
|
23
25
|
) {
|
|
24
|
-
const {
|
|
25
|
-
|
|
26
|
-
const category = await db
|
|
27
|
-
.selectFrom("ProductCategory")
|
|
28
|
-
.selectAll()
|
|
29
|
-
.where("id", "=", id)
|
|
30
|
-
.forUpdate()
|
|
31
|
-
.executeTakeFirst();
|
|
26
|
+
const { name } = input;
|
|
32
27
|
|
|
33
|
-
|
|
34
|
-
|
|
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
|
+
}
|
|
35
34
|
}
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
// 1. Check category exists (lookup by id or code)
|
|
37
|
+
const category =
|
|
38
|
+
"id" in input
|
|
39
|
+
? await db
|
|
40
|
+
.selectFrom("ProductCategory")
|
|
41
|
+
.selectAll()
|
|
42
|
+
.where("id", "=", (input as { id: string }).id)
|
|
43
|
+
.forUpdate()
|
|
44
|
+
.executeTakeFirst()
|
|
45
|
+
: await db
|
|
46
|
+
.selectFrom("ProductCategory")
|
|
47
|
+
.selectAll()
|
|
48
|
+
.where("code", "=", (input as { code: string }).code)
|
|
49
|
+
.forUpdate()
|
|
50
|
+
.executeTakeFirst();
|
|
51
|
+
|
|
52
|
+
if (!category) {
|
|
53
|
+
const key = "id" in input ? (input as { id: string }).id : (input as { code: string }).code;
|
|
54
|
+
return err(new CategoryNotFoundError(key));
|
|
39
55
|
}
|
|
40
56
|
|
|
41
57
|
const hasNameUpdate = name !== undefined;
|
|
42
58
|
const hasCustomFields = Object.keys(customFields).length > 0;
|
|
43
59
|
|
|
44
60
|
if (!hasNameUpdate && !hasCustomFields) {
|
|
45
|
-
return err(new MissingRequiredFieldError(id));
|
|
61
|
+
return err(new MissingRequiredFieldError(category.id));
|
|
46
62
|
}
|
|
47
63
|
|
|
48
64
|
if (hasNameUpdate && !name?.trim()) {
|
|
@@ -50,7 +66,7 @@ export async function run<CF extends Record<string, unknown>>(
|
|
|
50
66
|
}
|
|
51
67
|
|
|
52
68
|
const updates: Record<string, unknown> = {
|
|
53
|
-
...
|
|
69
|
+
...customFields,
|
|
54
70
|
updatedAt: new Date(),
|
|
55
71
|
};
|
|
56
72
|
if (hasNameUpdate) updates.name = name;
|
|
@@ -58,7 +74,7 @@ export async function run<CF extends Record<string, unknown>>(
|
|
|
58
74
|
const updated = await db
|
|
59
75
|
.updateTable("ProductCategory")
|
|
60
76
|
.set(updates)
|
|
61
|
-
.where("id", "=", id)
|
|
77
|
+
.where("id", "=", category.id)
|
|
62
78
|
.returningAll()
|
|
63
79
|
.executeTakeFirst();
|
|
64
80
|
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
updateProduct modifies mutable fields of an existing product — name, description, and UoM.
|
|
5
|
+
updateProduct modifies mutable fields of an existing product — name, description, and UoM. The product can be looked up by `id` or `code`. 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
6
|
|
|
7
7
|
## Business Rules
|
|
8
8
|
|
|
9
|
-
- Target product must exist
|
|
10
|
-
- Product code is immutable — any attempt to change code returns an error
|
|
9
|
+
- Target product must exist (looked up by `id` or `code`)
|
|
11
10
|
- Name can be updated in any status (DRAFT, ACTIVE, ARCHIVED); must remain non-empty
|
|
12
11
|
- Description can be updated in any status
|
|
13
12
|
- UoM can be updated only in DRAFT status — once activated, UoM is locked to preserve variant consistency
|
|
@@ -18,20 +17,18 @@ updateProduct modifies mutable fields of an existing product — name, descripti
|
|
|
18
17
|
|
|
19
18
|
```mermaid
|
|
20
19
|
flowchart TD
|
|
21
|
-
A[Receive update request] --> B{
|
|
22
|
-
B -->|
|
|
23
|
-
B -->|
|
|
24
|
-
D -->|
|
|
25
|
-
D -->|
|
|
26
|
-
F -->|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
I -->|No| J[Return error:
|
|
30
|
-
I -->|Yes| K
|
|
31
|
-
|
|
32
|
-
K
|
|
33
|
-
H -->|No| M
|
|
34
|
-
M --> N[Return updated product]
|
|
20
|
+
A[Receive update request] --> B{Lookup by id or code}
|
|
21
|
+
B -->|Not found| C[Return error: PRODUCT_NOT_FOUND]
|
|
22
|
+
B -->|Found| D{Any field provided?}
|
|
23
|
+
D -->|No| E[Return error: NO_FIELDS_TO_UPDATE]
|
|
24
|
+
D -->|Yes| F{UoM change requested?}
|
|
25
|
+
F -->|Yes| G{Status is DRAFT?}
|
|
26
|
+
G -->|No| H[Return error: UOM_LOCKED]
|
|
27
|
+
G -->|Yes| I{UoM valid and active?}
|
|
28
|
+
I -->|No| J[Return error: INVALID_UOM]
|
|
29
|
+
I -->|Yes| K[Apply updates]
|
|
30
|
+
F -->|No| K
|
|
31
|
+
K --> L[Return updated product]
|
|
35
32
|
```
|
|
36
33
|
|
|
37
34
|
## External Dependencies
|
|
@@ -40,8 +37,7 @@ flowchart TD
|
|
|
40
37
|
|
|
41
38
|
## Error Scenarios
|
|
42
39
|
|
|
43
|
-
- **PRODUCT_NOT_FOUND**: Specified product
|
|
44
|
-
- **CODE_IMMUTABLE**: Attempt to change the product code
|
|
40
|
+
- **PRODUCT_NOT_FOUND**: Specified product does not exist
|
|
45
41
|
- **MISSING_REQUIRED_FIELD**: Name is empty or blank when provided
|
|
46
42
|
- **NO_FIELDS_TO_UPDATE**: No updatable fields were provided in the request
|
|
47
43
|
- **UOM_LOCKED**: UoM cannot be changed after product has been activated
|
|
@@ -50,7 +46,6 @@ flowchart TD
|
|
|
50
46
|
## Test Cases
|
|
51
47
|
|
|
52
48
|
- returns error when product not found
|
|
53
|
-
- returns error when code change attempted
|
|
54
49
|
- returns error when no fields provided
|
|
55
50
|
- returns error when name is empty
|
|
56
51
|
- returns error when UoM locked on non-DRAFT
|
|
@@ -58,4 +53,5 @@ flowchart TD
|
|
|
58
53
|
- updates description successfully
|
|
59
54
|
- updates UoM successfully on DRAFT product
|
|
60
55
|
- updates name successfully
|
|
56
|
+
- looks up product by code and updates name
|
|
61
57
|
- passes custom fields through
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
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.
|
|
5
|
+
updateProductAttribute modifies the display name of an existing product attribute. The attribute can be looked up by `id` or `code`. In extensible module configurations, consumer-defined custom fields may also be updated through this command.
|
|
6
6
|
|
|
7
7
|
## Business Rules
|
|
8
8
|
|
|
9
|
-
- Target attribute must exist
|
|
10
|
-
- Attribute code is immutable — cannot be changed
|
|
9
|
+
- Target attribute must exist (looked up by `id` or `code`)
|
|
11
10
|
- At least one updatable field must be provided
|
|
12
11
|
- Name must remain non-empty when provided
|
|
13
12
|
- Consumer-defined custom fields may be updated
|
|
@@ -16,14 +15,12 @@ updateProductAttribute modifies the display name of an existing product attribut
|
|
|
16
15
|
|
|
17
16
|
```mermaid
|
|
18
17
|
flowchart TD
|
|
19
|
-
A[Receive update request] --> B{
|
|
20
|
-
B -->|
|
|
21
|
-
B -->|
|
|
22
|
-
D -->|
|
|
23
|
-
D -->|
|
|
24
|
-
F
|
|
25
|
-
F -->|Yes| H[Apply name and/or custom field updates]
|
|
26
|
-
H --> I[Return updated attribute]
|
|
18
|
+
A[Receive update request] --> B{Lookup by id or code}
|
|
19
|
+
B -->|Not found| C[Return error: ATTRIBUTE_NOT_FOUND]
|
|
20
|
+
B -->|Found| D{Any updatable fields provided?}
|
|
21
|
+
D -->|No| E[Return error: MISSING_REQUIRED_FIELD]
|
|
22
|
+
D -->|Yes| F[Apply name and/or custom field updates]
|
|
23
|
+
F --> G[Return updated attribute]
|
|
27
24
|
```
|
|
28
25
|
|
|
29
26
|
## External Dependencies
|
|
@@ -32,15 +29,14 @@ flowchart TD
|
|
|
32
29
|
|
|
33
30
|
## Error Scenarios
|
|
34
31
|
|
|
35
|
-
- **ATTRIBUTE_NOT_FOUND**: Specified attribute
|
|
36
|
-
- **CODE_IMMUTABLE**: Attempt to change the attribute code
|
|
32
|
+
- **ATTRIBUTE_NOT_FOUND**: Specified attribute does not exist
|
|
37
33
|
- **MISSING_REQUIRED_FIELD**: No updatable fields were provided, or name is empty when provided without any custom field updates
|
|
38
34
|
|
|
39
35
|
## Test Cases
|
|
40
36
|
|
|
41
37
|
- returns error when attribute not found
|
|
42
|
-
- returns error when trying to change code
|
|
43
38
|
- returns error when no fields provided
|
|
44
39
|
- returns error when name is empty string
|
|
45
40
|
- passes custom fields through to update
|
|
46
41
|
- updates name successfully
|
|
42
|
+
- looks up attribute by code and updates name
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
updateProductCategory modifies the display name of an existing product category. In extensible module configurations, consumer-defined custom fields may also be updated through this command.
|
|
5
|
+
updateProductCategory modifies the display name of an existing product category. The category can be looked up by `id` or `code`. In extensible module configurations, consumer-defined custom fields may also be updated through this command. Use moveProductCategory to change the parent.
|
|
6
6
|
|
|
7
7
|
## Business Rules
|
|
8
8
|
|
|
9
|
-
- Target category must exist
|
|
10
|
-
- Category code is immutable — cannot be changed
|
|
9
|
+
- Target category must exist (looked up by `id` or `code`)
|
|
11
10
|
- At least one updatable field must be provided
|
|
12
11
|
- Name must remain non-empty when provided
|
|
13
12
|
- Consumer-defined custom fields may be updated
|
|
@@ -17,14 +16,12 @@ updateProductCategory modifies the display name of an existing product category.
|
|
|
17
16
|
|
|
18
17
|
```mermaid
|
|
19
18
|
flowchart TD
|
|
20
|
-
A[Receive update request] --> B{
|
|
21
|
-
B -->|
|
|
22
|
-
B -->|
|
|
23
|
-
D -->|
|
|
24
|
-
D -->|
|
|
25
|
-
F
|
|
26
|
-
F -->|Yes| H[Apply name and/or custom field updates]
|
|
27
|
-
H --> I[Return updated category]
|
|
19
|
+
A[Receive update request] --> B{Lookup by id or code}
|
|
20
|
+
B -->|Not found| C[Return error: CATEGORY_NOT_FOUND]
|
|
21
|
+
B -->|Found| D{Any updatable fields provided?}
|
|
22
|
+
D -->|No| E[Return error: MISSING_REQUIRED_FIELD]
|
|
23
|
+
D -->|Yes| F[Apply name and/or custom field updates]
|
|
24
|
+
F --> G[Return updated category]
|
|
28
25
|
```
|
|
29
26
|
|
|
30
27
|
## External Dependencies
|
|
@@ -33,14 +30,13 @@ flowchart TD
|
|
|
33
30
|
|
|
34
31
|
## Error Scenarios
|
|
35
32
|
|
|
36
|
-
- **CATEGORY_NOT_FOUND**: Specified category
|
|
37
|
-
- **CODE_IMMUTABLE**: Attempt to change the category code
|
|
33
|
+
- **CATEGORY_NOT_FOUND**: Specified category does not exist
|
|
38
34
|
- **MISSING_REQUIRED_FIELD**: No updatable fields were provided, or name is empty when provided without any custom field updates
|
|
39
35
|
|
|
40
36
|
## Test Cases
|
|
41
37
|
|
|
42
38
|
- should return CategoryNotFoundError when category does not exist
|
|
43
|
-
- should return CodeImmutableError when code is provided
|
|
44
39
|
- should return MissingRequiredFieldError when no fields are provided
|
|
45
40
|
- should pass custom fields through to update
|
|
46
41
|
- should update category name successfully
|
|
42
|
+
- should look up category by code and update name
|
|
@@ -17,12 +17,11 @@ import {
|
|
|
17
17
|
} from "../lib/domain";
|
|
18
18
|
import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
19
19
|
|
|
20
|
-
export
|
|
20
|
+
export type UpdateGoodsReceiptInput = {
|
|
21
21
|
id: string;
|
|
22
22
|
receiptDate?: Date;
|
|
23
23
|
lines?: GoodsReceiptLineInput[];
|
|
24
|
-
}
|
|
25
|
-
|
|
24
|
+
};
|
|
26
25
|
export async function run(db: Transaction, input: UpdateGoodsReceiptInput, ctx: CommandContext) {
|
|
27
26
|
void ctx;
|
|
28
27
|
const goodsReceipt = await selectOne(db, "GoodsReceipt", "id", input.id, true);
|
|
@@ -17,13 +17,12 @@ import {
|
|
|
17
17
|
} from "../lib/domain";
|
|
18
18
|
import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
19
19
|
|
|
20
|
-
export
|
|
20
|
+
export type UpdatePurchaseBillInput = {
|
|
21
21
|
id: string;
|
|
22
22
|
invoiceNumber?: string;
|
|
23
23
|
invoiceDate?: Date;
|
|
24
24
|
lines?: PurchaseBillLineInput[];
|
|
25
|
-
}
|
|
26
|
-
|
|
25
|
+
};
|
|
27
26
|
export async function run(db: Transaction, input: UpdatePurchaseBillInput, ctx: CommandContext) {
|
|
28
27
|
void ctx;
|
|
29
28
|
const purchaseBill = await db
|