@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
|
@@ -74,7 +74,7 @@ describe("runUpdate", () => {
|
|
|
74
74
|
fs.writeFileSync(path.join(wfDir, "erp-kit-check.yml"), "# Old");
|
|
75
75
|
runUpdate(tmpDir, ["workflows"]);
|
|
76
76
|
const content = fs.readFileSync(path.join(wfDir, "erp-kit-check.yml"), "utf-8");
|
|
77
|
-
expect(content).toContain("
|
|
77
|
+
expect(content).toContain("erp-kit Check");
|
|
78
78
|
});
|
|
79
79
|
|
|
80
80
|
it("refreshes .claude/skills when it is a copied directory (not a symlink)", () => {
|
|
@@ -2,24 +2,33 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { PACKAGE_ROOT, readErpKitVersion } from "../util";
|
|
4
4
|
|
|
5
|
+
// Files that need renaming because they cause issues in the repo/pack.
|
|
5
6
|
// npm renames .gitignore during pack (npm/cli#5756).
|
|
6
|
-
//
|
|
7
|
+
// pnpm-workspace.yaml causes the template dir to be treated as a workspace member.
|
|
8
|
+
// prepack copies these to their safe names; scaffold time restores the originals.
|
|
9
|
+
const RENAME_MAP: Record<string, string> = {
|
|
10
|
+
__dot__gitignore: ".gitignore",
|
|
11
|
+
"__pnpm-workspace.yaml": "pnpm-workspace.yaml",
|
|
12
|
+
};
|
|
13
|
+
|
|
7
14
|
export function copyTemplateDir(
|
|
8
15
|
srcDir: string,
|
|
9
16
|
destDir: string,
|
|
10
17
|
replacements: Record<string, string>,
|
|
11
18
|
placeholderFiles: Set<string>,
|
|
19
|
+
excludeDirs = new Set<string>(),
|
|
12
20
|
): void {
|
|
13
21
|
for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
|
|
14
22
|
const srcPath = path.join(srcDir, entry.name);
|
|
15
|
-
const destName = entry.name
|
|
23
|
+
const destName = RENAME_MAP[entry.name] ?? entry.name;
|
|
16
24
|
const destPath = path.join(destDir, destName);
|
|
17
25
|
|
|
18
26
|
if (entry.name === "node_modules") continue;
|
|
27
|
+
if (excludeDirs.has(entry.name)) continue;
|
|
19
28
|
|
|
20
29
|
if (entry.isDirectory()) {
|
|
21
30
|
fs.mkdirSync(destPath, { recursive: true });
|
|
22
|
-
copyTemplateDir(srcPath, destPath, replacements, placeholderFiles);
|
|
31
|
+
copyTemplateDir(srcPath, destPath, replacements, placeholderFiles, excludeDirs);
|
|
23
32
|
} else {
|
|
24
33
|
if (fs.existsSync(destPath)) continue;
|
|
25
34
|
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
@@ -57,5 +66,17 @@ export function scaffoldAppBoilerplate(appDir: string, appName: string): void {
|
|
|
57
66
|
'"workspace:*"': `"${erpKitVersion}"`,
|
|
58
67
|
};
|
|
59
68
|
const placeholderFiles = new Set(["package.json", "tailor.config.ts", "index.html"]);
|
|
60
|
-
|
|
69
|
+
// docs are authored by skills (app-1 through app-4), not scaffolded.
|
|
70
|
+
copyTemplateDir(templateDir, appDir, replacements, placeholderFiles, new Set(["docs"]));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function scaffoldProjectBoilerplate(projectDir: string, projectName: string): void {
|
|
74
|
+
const templateDir = path.join(PACKAGE_ROOT, "templates", "scaffold", "project");
|
|
75
|
+
const erpKitVersion = readErpKitVersion();
|
|
76
|
+
const replacements = {
|
|
77
|
+
"template-project": projectName,
|
|
78
|
+
'"workspace:*"': `"${erpKitVersion}"`,
|
|
79
|
+
};
|
|
80
|
+
const placeholderFiles = new Set(["package.json"]);
|
|
81
|
+
copyTemplateDir(templateDir, projectDir, replacements, placeholderFiles);
|
|
61
82
|
}
|
package/src/module.ts
CHANGED
|
@@ -44,7 +44,10 @@ export {
|
|
|
44
44
|
all as itemManagementAll,
|
|
45
45
|
} from "./modules/item-management/lib/permissions.generated";
|
|
46
46
|
// audit
|
|
47
|
-
export {
|
|
47
|
+
export {
|
|
48
|
+
defineModule as defineAuditModule,
|
|
49
|
+
companyStub as auditCompanyStub,
|
|
50
|
+
} from "./modules/audit/module";
|
|
48
51
|
export {
|
|
49
52
|
permissions as auditPermissions,
|
|
50
53
|
own as auditOwn,
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# README
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The accounting module provides management (internal) accounting capabilities for budgeting, cost allocation, profit center reporting, and variance analysis. It enables organizations to track, allocate, and analyze costs for internal decision-making, complementing the financial accounting capabilities provided by `finance-ledger` and `coa-management`.
|
|
6
|
+
|
|
7
|
+
This module owns cost centers, profit centers, cost elements, budgets, internal orders, and allocation cycles — entities that exist solely for management accounting purposes and are distinct from the general ledger structure.
|
|
8
|
+
|
|
9
|
+
## Key Features
|
|
10
|
+
|
|
11
|
+
- **Cost Center Management** — Create and maintain cost centers with hierarchical grouping for overhead cost accumulation and reporting
|
|
12
|
+
- **Cost Element Management** — Define primary cost elements (mapped to GL accounts) and secondary cost elements (internal allocation only)
|
|
13
|
+
- **Profit Center Management** — Create and maintain profit centers with hierarchical grouping for internal P&L reporting
|
|
14
|
+
- **Budget Management** — Create budgets with line items per cost element, manage approval workflows, track budget versions, and enforce budgetary control with commitment-aware availability checks
|
|
15
|
+
- **Cost Allocation** — Execute allocation cycles (assessment/distribution) to distribute overhead costs from sender to receiver cost objects
|
|
16
|
+
- **Internal Order Management** — Track costs for specific short-to-medium-term activities (projects, campaigns, events) with lifecycle management
|
|
17
|
+
- **Variance Analysis** — Compare planned vs. actual costs by cost object and period, categorize variances, and generate management reports
|
|
18
|
+
|
|
19
|
+
## Module Scope
|
|
20
|
+
|
|
21
|
+
### In Scope
|
|
22
|
+
|
|
23
|
+
- Cost center CRUD and hierarchy management
|
|
24
|
+
- Profit center CRUD and hierarchy management
|
|
25
|
+
- Primary and secondary cost element definition
|
|
26
|
+
- Budget creation, approval workflow, and line item entry per cost element
|
|
27
|
+
- Budgetary control with commitment-aware availability checks (Budget - Actual - Commitments - Encumbrances)
|
|
28
|
+
- Commitment tracking via purchase module event consumption (PO confirmed, received, invoiced, cancelled)
|
|
29
|
+
- Budget vs. actual comparison
|
|
30
|
+
- Cost allocation cycles (assessment and distribution methods)
|
|
31
|
+
- Allocation rule definition and execution
|
|
32
|
+
- Internal order lifecycle (created → released → technically completed → closed)
|
|
33
|
+
- Variance calculation and categorization (plan vs. actual) with cost-element-level detail lines
|
|
34
|
+
- Multi-version planning (budget, forecast)
|
|
35
|
+
- Audit trail for budget changes, allocation runs, and variance postings
|
|
36
|
+
|
|
37
|
+
### Out of Scope
|
|
38
|
+
|
|
39
|
+
- Financial (external) accounting — owned by `finance-ledger`
|
|
40
|
+
- Chart of accounts and GL account management — owned by `coa-management`
|
|
41
|
+
- Fiscal year and accounting period management — owned by `finance-ledger`
|
|
42
|
+
- Activity-based costing (activity types, rate calculation) — future extension
|
|
43
|
+
- Statistical key figures as allocation drivers — future extension
|
|
44
|
+
- Multi-dimensional profitability analysis (CO-PA style) — future extension
|
|
45
|
+
- What-if scenario modeling and simulation — future extension
|
|
46
|
+
- Internal order settlement to receivers — future extension
|
|
47
|
+
- Rolling forecasts beyond fiscal year boundaries — future extension
|
|
48
|
+
- Manufacturing variance calculation — owned by `manufacturing`; this module consumes results
|
|
49
|
+
- Transfer pricing between legal entities — future extension
|
|
50
|
+
|
|
51
|
+
### Scope Decision Rationale
|
|
52
|
+
|
|
53
|
+
The initial scope focuses on the six core entities identified in the roadmap (Budget, BudgetLine, ProfitCenter, CostAllocation, InternalOrder, Variance) plus foundational entities (CostCenter, CostElement) required by all management accounting features. Comprehensive features like activity-based costing and multi-dimensional profitability analysis are deferred as they add significant complexity without being prerequisites for the core budgeting-allocation-variance workflow. The module explicitly does not recreate entities already owned by other modules (fiscal calendar from finance-ledger, GL accounts from coa-management, manufacturing variances from manufacturing).
|
|
54
|
+
|
|
55
|
+
## Module Dependencies
|
|
56
|
+
|
|
57
|
+
- `primitives` — Currency definitions for multi-currency budget amounts and variance values
|
|
58
|
+
- `organization` — Company scoping for all management accounting entities; Department/Site as optional mapping targets for cost centers and profit centers
|
|
59
|
+
- `coa-management` — GL account references for primary cost elements, budget line items, and allocation target accounts
|
|
60
|
+
- `finance-ledger` — Fiscal year/period alignment for budget periods; journal entry data as source of actuals; subledger integration pattern for posting allocation journal entries
|
|
61
|
+
- `purchase` — Commitment event consumption for budgetary control: PO confirmation creates commitments, goods receipt and invoice match consume commitments, PO cancellation releases commitments
|
|
62
|
+
- `user-management` — Permission definitions for budget creation, allocation execution, and report access
|
|
63
|
+
- `audit` — Audit trail for budget lifecycle transitions, allocation runs, and variance postings
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @generated — do not edit
|
|
2
|
+
import { permissions } from "../lib/permissions.generated";
|
|
3
|
+
import { run } from "./activateBudget";
|
|
4
|
+
import { defineCommand } from "@tailor-platform/erp-kit/module";
|
|
5
|
+
|
|
6
|
+
export const activateBudget = defineCommand(permissions.activateBudget, run);
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createMockDb } from "../../../testing/index";
|
|
3
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
4
|
+
import {
|
|
5
|
+
BudgetNotFoundError,
|
|
6
|
+
InvalidStateError,
|
|
7
|
+
DuplicateActiveBudgetError,
|
|
8
|
+
} from "../lib/errors.generated";
|
|
9
|
+
import { approvedBudget, baseBudget, activeBudget, basePlanVersion } from "../testing/fixtures";
|
|
10
|
+
import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
|
|
11
|
+
import { run } from "./activateBudget";
|
|
12
|
+
|
|
13
|
+
const forecastPlanVersion = { ...basePlanVersion, id: "plan-version-forecast", type: "FORECAST" };
|
|
14
|
+
const simulationPlanVersion = { ...basePlanVersion, id: "plan-version-sim", type: "SIMULATION" };
|
|
15
|
+
|
|
16
|
+
describe("activateBudget", () => {
|
|
17
|
+
it("activates an APPROVED budget transitioning it to ACTIVE status", async () => {
|
|
18
|
+
const activatedBudget = { ...approvedBudget, status: "ACTIVE" };
|
|
19
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
20
|
+
spies.select
|
|
21
|
+
.mockReturnValueOnce(approvedBudget)
|
|
22
|
+
.mockReturnValueOnce(basePlanVersion) // plan version type BUDGET
|
|
23
|
+
.mockReturnValueOnce(undefined); // no existing active
|
|
24
|
+
spies.update.mockReturnValueOnce(activatedBudget);
|
|
25
|
+
|
|
26
|
+
const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
|
|
27
|
+
|
|
28
|
+
const value = expectOk(result);
|
|
29
|
+
expect(value.budget.status).toBe("ACTIVE");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("enables funds checking upon activation", async () => {
|
|
33
|
+
const activatedBudget = { ...approvedBudget, status: "ACTIVE" };
|
|
34
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
35
|
+
spies.select
|
|
36
|
+
.mockReturnValueOnce(approvedBudget)
|
|
37
|
+
.mockReturnValueOnce(basePlanVersion)
|
|
38
|
+
.mockReturnValueOnce(undefined);
|
|
39
|
+
spies.update.mockReturnValueOnce(activatedBudget);
|
|
40
|
+
|
|
41
|
+
const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
|
|
42
|
+
|
|
43
|
+
const value = expectOk(result);
|
|
44
|
+
expect(value.budget.status).toBe("ACTIVE");
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("returns error when budget does not exist", async () => {
|
|
48
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
49
|
+
spies.select.mockReturnValueOnce(undefined);
|
|
50
|
+
|
|
51
|
+
const result = await run(db, { budgetId: "missing" }, commandCtx);
|
|
52
|
+
|
|
53
|
+
expectErr(result, BudgetNotFoundError);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("returns error when budget is not in APPROVED status", async () => {
|
|
57
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
58
|
+
spies.select.mockReturnValueOnce(baseBudget); // DRAFT
|
|
59
|
+
|
|
60
|
+
const result = await run(db, { budgetId: baseBudget.id }, commandCtx);
|
|
61
|
+
|
|
62
|
+
expectErr(result, InvalidStateError);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("returns error when another ACTIVE BUDGET exists for the same cost object and fiscal year", async () => {
|
|
66
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
67
|
+
spies.select
|
|
68
|
+
.mockReturnValueOnce(approvedBudget)
|
|
69
|
+
.mockReturnValueOnce(basePlanVersion) // type BUDGET
|
|
70
|
+
.mockReturnValueOnce(activeBudget) // existing active
|
|
71
|
+
.mockReturnValueOnce(basePlanVersion); // existing active's plan version is also BUDGET
|
|
72
|
+
// no update mock needed — should return error
|
|
73
|
+
|
|
74
|
+
const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
|
|
75
|
+
|
|
76
|
+
expectErr(result, DuplicateActiveBudgetError);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("allows multiple ACTIVE FORECAST versions for the same cost object and fiscal year", async () => {
|
|
80
|
+
const forecastApproved = { ...approvedBudget, planVersionId: forecastPlanVersion.id };
|
|
81
|
+
const activatedBudget = { ...forecastApproved, status: "ACTIVE" };
|
|
82
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
83
|
+
spies.select.mockReturnValueOnce(forecastApproved).mockReturnValueOnce(forecastPlanVersion); // type FORECAST — skip uniqueness check
|
|
84
|
+
spies.update.mockReturnValueOnce(activatedBudget);
|
|
85
|
+
|
|
86
|
+
const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
|
|
87
|
+
|
|
88
|
+
const value = expectOk(result);
|
|
89
|
+
expect(value.budget.status).toBe("ACTIVE");
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("allows multiple ACTIVE SIMULATION versions for the same cost object and fiscal year", async () => {
|
|
93
|
+
const simApproved = { ...approvedBudget, planVersionId: simulationPlanVersion.id };
|
|
94
|
+
const activatedBudget = { ...simApproved, status: "ACTIVE" };
|
|
95
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
96
|
+
spies.select.mockReturnValueOnce(simApproved).mockReturnValueOnce(simulationPlanVersion); // type SIMULATION — skip uniqueness check
|
|
97
|
+
spies.update.mockReturnValueOnce(activatedBudget);
|
|
98
|
+
|
|
99
|
+
const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
|
|
100
|
+
|
|
101
|
+
const value = expectOk(result);
|
|
102
|
+
expect(value.budget.status).toBe("ACTIVE");
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("emits audit event recording the status transition and acting user", async () => {
|
|
106
|
+
const activatedBudget = { ...approvedBudget, status: "ACTIVE" };
|
|
107
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
108
|
+
spies.select
|
|
109
|
+
.mockReturnValueOnce(approvedBudget)
|
|
110
|
+
.mockReturnValueOnce(basePlanVersion)
|
|
111
|
+
.mockReturnValueOnce(undefined);
|
|
112
|
+
spies.update.mockReturnValueOnce(activatedBudget);
|
|
113
|
+
|
|
114
|
+
const result = await run(db, { budgetId: approvedBudget.id }, commandCtx);
|
|
115
|
+
|
|
116
|
+
expectOk(result);
|
|
117
|
+
expect(spies.update).toHaveBeenCalled();
|
|
118
|
+
});
|
|
119
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
2
|
+
import {
|
|
3
|
+
BudgetNotFoundError,
|
|
4
|
+
InvalidStateError,
|
|
5
|
+
DuplicateActiveBudgetError,
|
|
6
|
+
} from "../lib/errors.generated";
|
|
7
|
+
import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
8
|
+
|
|
9
|
+
export interface ActivateBudgetInput {
|
|
10
|
+
budgetId: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export async function run(db: Transaction, input: ActivateBudgetInput, ctx: CommandContext) {
|
|
14
|
+
void ctx;
|
|
15
|
+
|
|
16
|
+
// Fetch budget with lock
|
|
17
|
+
const budget = await db
|
|
18
|
+
.selectFrom("Budget")
|
|
19
|
+
.where("id", "=", input.budgetId)
|
|
20
|
+
.selectAll()
|
|
21
|
+
.forUpdate()
|
|
22
|
+
.executeTakeFirst();
|
|
23
|
+
|
|
24
|
+
if (!budget) {
|
|
25
|
+
return err(new BudgetNotFoundError(input.budgetId));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (budget.status !== "APPROVED") {
|
|
29
|
+
return err(new InvalidStateError(input.budgetId));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Check plan version type — only BUDGET type needs uniqueness check
|
|
33
|
+
const planVersion = await db
|
|
34
|
+
.selectFrom("PlanVersion")
|
|
35
|
+
.where("id", "=", budget.planVersionId)
|
|
36
|
+
.selectAll()
|
|
37
|
+
.executeTakeFirst();
|
|
38
|
+
|
|
39
|
+
if (planVersion?.type === "BUDGET") {
|
|
40
|
+
// Check no other ACTIVE budget of type BUDGET exists for same cost object and fiscal year
|
|
41
|
+
const existingActive = await db
|
|
42
|
+
.selectFrom("Budget")
|
|
43
|
+
.where("costObjectType", "=", budget.costObjectType)
|
|
44
|
+
.where("costObjectId", "=", budget.costObjectId)
|
|
45
|
+
.where("fiscalYearId", "=", budget.fiscalYearId)
|
|
46
|
+
.where("status", "=", "ACTIVE")
|
|
47
|
+
.where("id", "!=", input.budgetId)
|
|
48
|
+
.selectAll()
|
|
49
|
+
.executeTakeFirst();
|
|
50
|
+
|
|
51
|
+
if (existingActive) {
|
|
52
|
+
// Verify the existing active budget is also of type BUDGET
|
|
53
|
+
const existingPlanVersion = await db
|
|
54
|
+
.selectFrom("PlanVersion")
|
|
55
|
+
.where("id", "=", existingActive.planVersionId)
|
|
56
|
+
.selectAll()
|
|
57
|
+
.executeTakeFirst();
|
|
58
|
+
|
|
59
|
+
if (existingPlanVersion?.type === "BUDGET") {
|
|
60
|
+
return err(new DuplicateActiveBudgetError(input.budgetId));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Transition to ACTIVE (which enables funds checking)
|
|
66
|
+
const updated = await db
|
|
67
|
+
.updateTable("Budget")
|
|
68
|
+
.set({
|
|
69
|
+
status: "ACTIVE",
|
|
70
|
+
updatedAt: new Date(),
|
|
71
|
+
})
|
|
72
|
+
.where("id", "=", input.budgetId)
|
|
73
|
+
.returningAll()
|
|
74
|
+
.executeTakeFirst();
|
|
75
|
+
|
|
76
|
+
return ok({ budget: updated! });
|
|
77
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @generated — do not edit
|
|
2
|
+
import { permissions } from "../lib/permissions.generated";
|
|
3
|
+
import { run } from "./activateCostElement";
|
|
4
|
+
import { defineCommand } from "@tailor-platform/erp-kit/module";
|
|
5
|
+
|
|
6
|
+
export const activateCostElement = defineCommand(permissions.activateCostElement, run);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createMockDb } from "../../../testing/index";
|
|
3
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
4
|
+
import { CostElementNotFoundError, InvalidStateError } from "../lib/errors.generated";
|
|
5
|
+
import { baseCostElement, activeCostElement, inactiveCostElement } from "../testing/fixtures";
|
|
6
|
+
import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
|
|
7
|
+
import { run } from "./activateCostElement";
|
|
8
|
+
|
|
9
|
+
describe("activateCostElement", () => {
|
|
10
|
+
it("activates a DRAFT cost element transitioning it to ACTIVE status", async () => {
|
|
11
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
12
|
+
spies.select.mockReturnValueOnce(baseCostElement);
|
|
13
|
+
const updated = { ...baseCostElement, status: "ACTIVE" };
|
|
14
|
+
spies.update.mockReturnValueOnce(updated);
|
|
15
|
+
|
|
16
|
+
const result = await run(db, { costElementId: baseCostElement.id }, commandCtx);
|
|
17
|
+
|
|
18
|
+
const value = expectOk(result);
|
|
19
|
+
expect(value.costElement.status).toBe("ACTIVE");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("returns error when cost element does not exist", async () => {
|
|
23
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
24
|
+
spies.select.mockReturnValueOnce(undefined);
|
|
25
|
+
|
|
26
|
+
const result = await run(db, { costElementId: "missing" }, commandCtx);
|
|
27
|
+
|
|
28
|
+
expectErr(result, CostElementNotFoundError);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("returns error when cost element is already ACTIVE", async () => {
|
|
32
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
33
|
+
spies.select.mockReturnValueOnce(activeCostElement);
|
|
34
|
+
|
|
35
|
+
const result = await run(db, { costElementId: activeCostElement.id }, commandCtx);
|
|
36
|
+
|
|
37
|
+
expectErr(result, InvalidStateError);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("returns error when cost element is INACTIVE", async () => {
|
|
41
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
42
|
+
spies.select.mockReturnValueOnce(inactiveCostElement);
|
|
43
|
+
|
|
44
|
+
const result = await run(db, { costElementId: inactiveCostElement.id }, commandCtx);
|
|
45
|
+
|
|
46
|
+
expectErr(result, InvalidStateError);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("emits audit event recording the status transition and acting user", async () => {
|
|
50
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
51
|
+
spies.select.mockReturnValueOnce(baseCostElement);
|
|
52
|
+
spies.update.mockReturnValueOnce({ ...baseCostElement, status: "ACTIVE" });
|
|
53
|
+
|
|
54
|
+
const result = await run(db, { costElementId: baseCostElement.id }, commandCtx);
|
|
55
|
+
|
|
56
|
+
expectOk(result);
|
|
57
|
+
expect(spies.update).toHaveBeenCalled();
|
|
58
|
+
});
|
|
59
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
2
|
+
import { CostElementNotFoundError, InvalidStateError } from "../lib/errors.generated";
|
|
3
|
+
import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
4
|
+
|
|
5
|
+
export interface ActivateCostElementInput {
|
|
6
|
+
costElementId: string;
|
|
7
|
+
from?: string[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Command: activateCostElement
|
|
11
|
+
* Transitions a cost element from DRAFT status to ACTIVE status.
|
|
12
|
+
*/
|
|
13
|
+
export async function run(db: Transaction, input: ActivateCostElementInput, ctx: CommandContext) {
|
|
14
|
+
void ctx;
|
|
15
|
+
|
|
16
|
+
const validFromStatuses = input.from ?? ["DRAFT"];
|
|
17
|
+
|
|
18
|
+
const costElement = await db
|
|
19
|
+
.selectFrom("CostElement")
|
|
20
|
+
.selectAll()
|
|
21
|
+
.where("id", "=", input.costElementId)
|
|
22
|
+
.forUpdate()
|
|
23
|
+
.executeTakeFirst();
|
|
24
|
+
|
|
25
|
+
if (!costElement) {
|
|
26
|
+
return err(new CostElementNotFoundError(input.costElementId));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (!validFromStatuses.includes(costElement.status)) {
|
|
30
|
+
return err(new InvalidStateError(input.costElementId));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const updated = await db
|
|
34
|
+
.updateTable("CostElement")
|
|
35
|
+
.set({ status: "ACTIVE", updatedAt: new Date() })
|
|
36
|
+
.where("id", "=", input.costElementId)
|
|
37
|
+
.returningAll()
|
|
38
|
+
.executeTakeFirst();
|
|
39
|
+
|
|
40
|
+
return ok({ costElement: updated! });
|
|
41
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @generated — do not edit
|
|
2
|
+
import { permissions } from "../lib/permissions.generated";
|
|
3
|
+
import { run } from "./activateProfitCenter";
|
|
4
|
+
import { defineCommand } from "@tailor-platform/erp-kit/module";
|
|
5
|
+
|
|
6
|
+
export const activateProfitCenter = defineCommand(permissions.activateProfitCenter, run);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createMockDb } from "../../../testing/index";
|
|
3
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
4
|
+
import { ProfitCenterNotFoundError, InvalidStateError } from "../lib/errors.generated";
|
|
5
|
+
import { baseProfitCenter, activeProfitCenter, inactiveProfitCenter } from "../testing/fixtures";
|
|
6
|
+
import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
|
|
7
|
+
import { run } from "./activateProfitCenter";
|
|
8
|
+
|
|
9
|
+
describe("activateProfitCenter", () => {
|
|
10
|
+
it("activates a DRAFT profit center transitioning it to ACTIVE status", async () => {
|
|
11
|
+
const activated = { ...baseProfitCenter, status: "ACTIVE" };
|
|
12
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
13
|
+
spies.select.mockReturnValueOnce(baseProfitCenter);
|
|
14
|
+
spies.update.mockReturnValueOnce(activated);
|
|
15
|
+
|
|
16
|
+
const result = await run(db, { profitCenterId: baseProfitCenter.id }, commandCtx);
|
|
17
|
+
|
|
18
|
+
const value = expectOk(result);
|
|
19
|
+
expect(value.profitCenter.status).toBe("ACTIVE");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("returns error when profit center does not exist", async () => {
|
|
23
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
24
|
+
spies.select.mockReturnValueOnce(undefined);
|
|
25
|
+
|
|
26
|
+
const result = await run(db, { profitCenterId: "missing-id" }, commandCtx);
|
|
27
|
+
|
|
28
|
+
expectErr(result, ProfitCenterNotFoundError);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("returns error when profit center is already ACTIVE", async () => {
|
|
32
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
33
|
+
spies.select.mockReturnValueOnce(activeProfitCenter);
|
|
34
|
+
|
|
35
|
+
const result = await run(db, { profitCenterId: activeProfitCenter.id }, commandCtx);
|
|
36
|
+
|
|
37
|
+
expectErr(result, InvalidStateError);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("returns error when profit center is INACTIVE", async () => {
|
|
41
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
42
|
+
spies.select.mockReturnValueOnce(inactiveProfitCenter);
|
|
43
|
+
|
|
44
|
+
const result = await run(db, { profitCenterId: inactiveProfitCenter.id }, commandCtx);
|
|
45
|
+
|
|
46
|
+
expectErr(result, InvalidStateError);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("emits audit event recording the status transition and acting user", async () => {
|
|
50
|
+
const activated = { ...baseProfitCenter, status: "ACTIVE" };
|
|
51
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
52
|
+
spies.select.mockReturnValueOnce(baseProfitCenter);
|
|
53
|
+
spies.update.mockReturnValueOnce(activated);
|
|
54
|
+
|
|
55
|
+
const result = await run(db, { profitCenterId: baseProfitCenter.id }, commandCtx);
|
|
56
|
+
|
|
57
|
+
expectOk(result);
|
|
58
|
+
expect(spies.update).toHaveBeenCalled();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
2
|
+
import { ProfitCenterNotFoundError, InvalidStateError } from "../lib/errors.generated";
|
|
3
|
+
import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
4
|
+
|
|
5
|
+
export interface ActivateProfitCenterInput {
|
|
6
|
+
profitCenterId: string;
|
|
7
|
+
from?: string[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function run(db: Transaction, input: ActivateProfitCenterInput, ctx: CommandContext) {
|
|
11
|
+
void ctx;
|
|
12
|
+
|
|
13
|
+
const validFromStatuses = input.from ?? ["DRAFT"];
|
|
14
|
+
|
|
15
|
+
const profitCenter = await db
|
|
16
|
+
.selectFrom("ProfitCenter")
|
|
17
|
+
.selectAll()
|
|
18
|
+
.where("id", "=", input.profitCenterId)
|
|
19
|
+
.forUpdate()
|
|
20
|
+
.executeTakeFirst();
|
|
21
|
+
|
|
22
|
+
if (!profitCenter) {
|
|
23
|
+
return err(new ProfitCenterNotFoundError(input.profitCenterId));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (!validFromStatuses.includes(profitCenter.status)) {
|
|
27
|
+
return err(new InvalidStateError(input.profitCenterId));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const updated = await db
|
|
31
|
+
.updateTable("ProfitCenter")
|
|
32
|
+
.set({ status: "ACTIVE", updatedAt: new Date() })
|
|
33
|
+
.where("id", "=", input.profitCenterId)
|
|
34
|
+
.returningAll()
|
|
35
|
+
.executeTakeFirst();
|
|
36
|
+
|
|
37
|
+
return ok({ profitCenter: updated! });
|
|
38
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @generated — do not edit
|
|
2
|
+
import { permissions } from "../lib/permissions.generated";
|
|
3
|
+
import { run } from "./approveBudget";
|
|
4
|
+
import { defineCommand } from "@tailor-platform/erp-kit/module";
|
|
5
|
+
|
|
6
|
+
export const approveBudget = defineCommand(permissions.approveBudget, run);
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createMockDb } from "../../../testing/index";
|
|
3
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
4
|
+
import {
|
|
5
|
+
BudgetNotFoundError,
|
|
6
|
+
InvalidStateError,
|
|
7
|
+
SelfApprovalNotAllowedError,
|
|
8
|
+
} from "../lib/errors.generated";
|
|
9
|
+
import { submittedBudget, baseBudget, baseUser } from "../testing/fixtures";
|
|
10
|
+
import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
|
|
11
|
+
import { run } from "./approveBudget";
|
|
12
|
+
|
|
13
|
+
// submittedBudget.createdByUserId === baseUser.id === "user-1"
|
|
14
|
+
// commandCtx.actorId === "test-actor" (different from creator)
|
|
15
|
+
|
|
16
|
+
describe("approveBudget", () => {
|
|
17
|
+
it("approves a SUBMITTED budget transitioning it to APPROVED status", async () => {
|
|
18
|
+
const approvedResult = { ...submittedBudget, status: "APPROVED" };
|
|
19
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
20
|
+
spies.select.mockReturnValueOnce(submittedBudget);
|
|
21
|
+
spies.update.mockReturnValueOnce(approvedResult);
|
|
22
|
+
|
|
23
|
+
const result = await run(db, { budgetId: submittedBudget.id }, commandCtx);
|
|
24
|
+
|
|
25
|
+
const value = expectOk(result);
|
|
26
|
+
expect(value.budget.status).toBe("APPROVED");
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("returns error when budget does not exist", async () => {
|
|
30
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
31
|
+
spies.select.mockReturnValueOnce(undefined);
|
|
32
|
+
|
|
33
|
+
const result = await run(db, { budgetId: "missing" }, commandCtx);
|
|
34
|
+
|
|
35
|
+
expectErr(result, BudgetNotFoundError);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("returns error when budget is not in SUBMITTED status", async () => {
|
|
39
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
40
|
+
spies.select.mockReturnValueOnce(baseBudget); // DRAFT
|
|
41
|
+
|
|
42
|
+
const result = await run(db, { budgetId: baseBudget.id }, commandCtx);
|
|
43
|
+
|
|
44
|
+
expectErr(result, InvalidStateError);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("returns error when approver is the same as the budget creator", async () => {
|
|
48
|
+
// createdByUserId = "user-1", set actorId to match
|
|
49
|
+
const selfCtx = { ...commandCtx, actorId: baseUser.id };
|
|
50
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
51
|
+
spies.select.mockReturnValueOnce(submittedBudget);
|
|
52
|
+
|
|
53
|
+
const result = await run(db, { budgetId: submittedBudget.id }, selfCtx);
|
|
54
|
+
|
|
55
|
+
expectErr(result, SelfApprovalNotAllowedError);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("emits audit event recording the status transition and approver", async () => {
|
|
59
|
+
const approvedResult = { ...submittedBudget, status: "APPROVED" };
|
|
60
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
61
|
+
spies.select.mockReturnValueOnce(submittedBudget);
|
|
62
|
+
spies.update.mockReturnValueOnce(approvedResult);
|
|
63
|
+
|
|
64
|
+
const result = await run(db, { budgetId: submittedBudget.id }, commandCtx);
|
|
65
|
+
|
|
66
|
+
expectOk(result);
|
|
67
|
+
expect(spies.update).toHaveBeenCalled();
|
|
68
|
+
});
|
|
69
|
+
});
|