@tailor-platform/erp-kit 0.7.0 → 0.9.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 +40 -0
- package/README.md +8 -4
- package/dist/cli.mjs +70 -70
- package/package.json +1 -1
- package/skills/erp-kit-app-1-requirements/SKILL.md +6 -0
- package/skills/erp-kit-app-2-requirements-review/SKILL.md +6 -0
- package/skills/erp-kit-app-3-plan/SKILL.md +6 -0
- package/skills/erp-kit-app-4-plan-review/SKILL.md +6 -0
- package/skills/erp-kit-app-5-impl-backend/SKILL.md +12 -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 +9 -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 +9 -2
- package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +14 -8
- package/skills/erp-kit-app-shared/SKILL.md +2 -0
- package/skills/erp-kit-mock-scenario/SKILL.md +6 -0
- package/skills/erp-kit-module-1-requirements/SKILL.md +6 -0
- package/skills/erp-kit-module-2-requirements-review/SKILL.md +6 -0
- package/skills/erp-kit-module-3-plan/SKILL.md +6 -0
- package/skills/erp-kit-module-3-update-plan/SKILL.md +6 -0
- package/skills/erp-kit-module-4-plan-review/SKILL.md +6 -0
- package/skills/erp-kit-module-5-impl/SKILL.md +6 -0
- package/skills/erp-kit-module-6-impl-review/SKILL.md +22 -19
- package/skills/erp-kit-module-shared/SKILL.md +2 -0
- package/skills/erp-kit-module-shared/references/commands.md +71 -1
- package/skills/erp-kit-update/SKILL.md +6 -0
- 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 +429 -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/createPartnerBankAccount.test.ts +3 -3
- package/src/modules/business-partner/command/createPartnerBankAccount.ts +1 -1
- 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/business-partner/module.ts +1 -0
- package/src/modules/coa-management/command/activateAccount.test.ts +0 -15
- package/src/modules/coa-management/command/activateAccount.ts +1 -42
- package/src/modules/coa-management/command/activateChartOfAccounts.test.ts +2 -31
- package/src/modules/coa-management/command/activateChartOfAccounts.ts +1 -37
- package/src/modules/coa-management/command/createAccount.test.ts +0 -28
- package/src/modules/coa-management/command/createAccount.ts +0 -43
- package/src/modules/coa-management/command/createAccountGroup.test.ts +2 -51
- package/src/modules/coa-management/command/createAccountGroup.ts +1 -56
- package/src/modules/coa-management/command/createChartOfAccounts.test.ts +1 -49
- package/src/modules/coa-management/command/createChartOfAccounts.ts +0 -51
- package/src/modules/coa-management/command/deactivateAccount.test.ts +0 -15
- package/src/modules/coa-management/command/deactivateAccount.ts +1 -53
- package/src/modules/coa-management/command/deactivateChartOfAccounts.test.ts +2 -29
- package/src/modules/coa-management/command/deactivateChartOfAccounts.ts +1 -37
- package/src/modules/coa-management/command/deleteAccount.test.ts +0 -13
- package/src/modules/coa-management/command/deleteAccount.ts +1 -42
- package/src/modules/coa-management/command/deleteAccountGroup.test.ts +0 -19
- package/src/modules/coa-management/command/deleteAccountGroup.ts +1 -42
- package/src/modules/coa-management/command/deleteChartOfAccounts.test.ts +2 -58
- package/src/modules/coa-management/command/deleteChartOfAccounts.ts +4 -88
- package/src/modules/coa-management/command/moveAccountGroup.test.ts +0 -27
- package/src/modules/coa-management/command/moveAccountGroup.ts +1 -48
- package/src/modules/coa-management/command/reactivateAccount.test.ts +0 -15
- package/src/modules/coa-management/command/reactivateAccount.ts +1 -53
- package/src/modules/coa-management/command/updateAccount.test.ts +0 -15
- package/src/modules/coa-management/command/updateAccount.ts +3 -95
- package/src/modules/coa-management/command/updateAccountGroup.test.ts +22 -20
- package/src/modules/coa-management/command/updateAccountGroup.ts +30 -78
- package/src/modules/coa-management/command/updateChartOfAccounts.test.ts +2 -31
- package/src/modules/coa-management/command/updateChartOfAccounts.ts +4 -54
- package/src/modules/coa-management/docs/commands/ActivateAccount.md +1 -4
- package/src/modules/coa-management/docs/commands/ActivateChartOfAccounts.md +1 -4
- package/src/modules/coa-management/docs/commands/CreateAccount.md +1 -4
- package/src/modules/coa-management/docs/commands/CreateAccountGroup.md +2 -5
- package/src/modules/coa-management/docs/commands/CreateChartOfAccounts.md +2 -6
- package/src/modules/coa-management/docs/commands/DeactivateAccount.md +1 -4
- package/src/modules/coa-management/docs/commands/DeactivateChartOfAccounts.md +1 -4
- package/src/modules/coa-management/docs/commands/DeleteAccount.md +1 -4
- package/src/modules/coa-management/docs/commands/DeleteAccountGroup.md +1 -4
- package/src/modules/coa-management/docs/commands/DeleteChartOfAccounts.md +1 -6
- package/src/modules/coa-management/docs/commands/MoveAccountGroup.md +1 -4
- package/src/modules/coa-management/docs/commands/ReactivateAccount.md +1 -4
- package/src/modules/coa-management/docs/commands/UpdateAccount.md +1 -4
- package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +6 -8
- package/src/modules/coa-management/docs/commands/UpdateChartOfAccounts.md +1 -4
- package/src/modules/coa-management/module.ts +16 -27
- 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/finance-ledger/module.ts +1 -0
- package/src/modules/inventory/command/approveInventoryAdjustment.test.ts +1 -1
- package/src/modules/inventory/command/approveInventoryAdjustment.ts +1 -1
- package/src/modules/inventory/command/cancelStockMovement.test.ts +2 -2
- package/src/modules/inventory/command/cancelStockMovement.ts +1 -1
- package/src/modules/inventory/command/confirmInventoryAdjustment.test.ts +4 -4
- package/src/modules/inventory/command/confirmInventoryAdjustment.ts +1 -1
- package/src/modules/inventory/command/confirmStockMovement.test.ts +1 -1
- package/src/modules/inventory/command/confirmStockMovement.ts +1 -1
- package/src/modules/inventory/command/createInventoryAdjustment.test.ts +6 -6
- package/src/modules/inventory/command/createInventoryAdjustment.ts +1 -1
- package/src/modules/inventory/command/createStockMovement.test.ts +3 -3
- package/src/modules/inventory/command/createStockMovement.ts +1 -1
- package/src/modules/inventory/command/executeStockMovement.test.ts +5 -5
- package/src/modules/inventory/command/executeStockMovement.ts +1 -1
- package/src/modules/inventory/command/rejectInventoryAdjustment.test.ts +1 -1
- package/src/modules/inventory/command/rejectInventoryAdjustment.ts +1 -1
- package/src/modules/inventory/command/reviseInventoryAdjustment.test.ts +2 -2
- package/src/modules/inventory/command/reviseInventoryAdjustment.ts +1 -1
- package/src/modules/inventory/command/submitInventoryAdjustment.test.ts +1 -1
- package/src/modules/inventory/command/submitInventoryAdjustment.ts +1 -1
- 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.test.ts +4 -4
- package/src/modules/inventory/command/updateStockMovement.ts +4 -5
- 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/inventory/module.ts +1 -0
- package/src/modules/item-management/command/createTaxonomyNode.test.ts +4 -4
- package/src/modules/item-management/command/createTaxonomyNode.ts +1 -1
- package/src/modules/item-management/command/moveTaxonomyNode.test.ts +2 -2
- package/src/modules/item-management/command/moveTaxonomyNode.ts +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 +16 -17
- package/src/modules/item-management/command/updateTaxonomyNode.ts +43 -30
- 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/item-management/module.ts +1 -0
- package/src/modules/manufacturing/command/createRouting.ts +1 -1
- package/src/modules/manufacturing/command/recordInventoryIssueOutcome.test.ts +1 -1
- package/src/modules/manufacturing/command/recordInventoryIssueOutcome.ts +1 -1
- package/src/modules/manufacturing/command/recordManufacturingCostSettlementAcknowledgment.test.ts +1 -1
- package/src/modules/manufacturing/command/recordManufacturingCostSettlementAcknowledgment.ts +1 -1
- package/src/modules/manufacturing/command/reviewManufacturingCostSummary.test.ts +1 -1
- package/src/modules/manufacturing/command/reviewManufacturingCostSummary.ts +1 -1
- 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 +4 -5
- 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/manufacturing/module.ts +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/organization/module.ts +1 -0
- package/src/modules/primitives/module.ts +1 -0
- package/src/modules/product-management/command/assignProductToCategory.test.ts +2 -2
- package/src/modules/product-management/command/assignProductToCategory.ts +2 -2
- package/src/modules/product-management/command/createProductAttribute.test.ts +1 -1
- package/src/modules/product-management/command/createProductAttribute.ts +1 -1
- package/src/modules/product-management/command/createProductAttributeValue.test.ts +1 -1
- package/src/modules/product-management/command/createProductAttributeValue.ts +1 -1
- package/src/modules/product-management/command/createProductCategory.test.ts +2 -2
- package/src/modules/product-management/command/createProductCategory.ts +1 -1
- package/src/modules/product-management/command/setProductAttributeAssignment.test.ts +3 -3
- package/src/modules/product-management/command/setProductAttributeAssignment.ts +2 -2
- 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/product-management/module.ts +1 -0
- package/src/modules/purchase/command/activatePurchasePaymentTerm.test.ts +4 -4
- package/src/modules/purchase/command/activatePurchasePaymentTerm.ts +2 -2
- package/src/modules/purchase/command/deactivatePurchasePaymentTerm.test.ts +4 -4
- package/src/modules/purchase/command/deactivatePurchasePaymentTerm.ts +2 -2
- 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.test.ts +2 -2
- package/src/modules/purchase/command/updatePurchasePaymentTerm.ts +3 -4
- package/src/modules/purchase/command/updatePurchasePriceList.ts +2 -3
- package/src/modules/purchase/command/updatePurchasePriceRule.ts +2 -3
- package/src/modules/purchase/module.ts +1 -0
- package/src/modules/sales/command/createSalesOrder.ts +1 -1
- 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/sales/module.ts +1 -0
- 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/eslint.config.js +17 -0
- package/templates/scaffold/app/backend/package.json +1 -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 +157 -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 +21 -3
- package/templates/scaffold/app/backend/tsconfig.json +1 -1
- 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 +57 -12
- 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/audit/[id]/components/audit-entry-detail.tsx +102 -0
- package/templates/scaffold/app/frontend/src/pages/audit/[id]/page.tsx +65 -0
- package/templates/scaffold/app/frontend/src/pages/audit/components/audit-entries-table.tsx +90 -0
- package/templates/scaffold/app/frontend/src/pages/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 +32 -0
- package/templates/scaffold/module/module.ts +1 -0
- package/templates/scaffold/module/package.json +3 -1
- package/templates/scaffold/module/vitest.config.ts +11 -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
|
@@ -179,10 +179,80 @@ const units = await db
|
|
|
179
179
|
|
|
180
180
|
- **Error handling**: Use `ok()` / `err()` from `@tailor-platform/erp-kit/module` — do not throw
|
|
181
181
|
- **Validation**: Check referenced entities exist before operating, return `err()` if not found
|
|
182
|
+
- **Return property naming**: Use the full model name in camelCase as the return property key — never abbreviate. This keeps property names unambiguous across modules.
|
|
183
|
+
- `return ok({ stockMovement: ... })` — not `movement`
|
|
184
|
+
- `return ok({ inventoryAdjustment: ... })` — not `adjustment`
|
|
185
|
+
|
|
186
|
+
## Update Command Input Type
|
|
187
|
+
|
|
188
|
+
Update commands use a structured type that separates lookup keys from mutable fields, and explicitly excludes status-controlled fields.
|
|
189
|
+
|
|
190
|
+
### Input type shape
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
export type UpdateXInput = ({
|
|
194
|
+
id: string;
|
|
195
|
+
} | {
|
|
196
|
+
naturalKey: string; // e.g. sku, code
|
|
197
|
+
}) & {
|
|
198
|
+
mutableField1?: string;
|
|
199
|
+
mutableField2?: string | null;
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Run signature with custom fields
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
export async function run<CF extends Record<string, unknown>>(
|
|
207
|
+
db: Transaction,
|
|
208
|
+
input: UpdateXInput & Omit<Partial<CF>, "status">,
|
|
209
|
+
ctx: CommandContext,
|
|
210
|
+
)
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Rules
|
|
214
|
+
|
|
215
|
+
| Field kind | Examples | How to handle |
|
|
216
|
+
|---|---|---|
|
|
217
|
+
| Lookup key (primary) | `id` | One branch of the union |
|
|
218
|
+
| Lookup key (natural) | `sku`, `code` | Another branch of the union — used to look up the record, not to update it |
|
|
219
|
+
| Mutable fields | `name`, `barcode` | Listed in the `&` intersection as optional fields |
|
|
220
|
+
| Status-controlled | `status` | **Never in the input type.** Managed by dedicated commands (`activateX`, `deactivateX`). Excluded from `CF` via `Omit`. |
|
|
221
|
+
| System fields | `createdAt`, `updatedAt` | Never in the input type. Set automatically. |
|
|
222
|
+
|
|
223
|
+
### Lookup implementation
|
|
224
|
+
|
|
225
|
+
Use `"id" in input` to branch between lookup strategies:
|
|
226
|
+
|
|
227
|
+
```typescript
|
|
228
|
+
let query = db.selectFrom("Item").selectAll();
|
|
229
|
+
if ("id" in input) {
|
|
230
|
+
query = query.where("id", "=", input.id);
|
|
231
|
+
} else {
|
|
232
|
+
query = query.where("sku", "=", (input as { sku: string }).sku);
|
|
233
|
+
}
|
|
234
|
+
const item = await query.forUpdate().executeTakeFirst();
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Custom field extraction
|
|
238
|
+
|
|
239
|
+
Destructure known fields and treat the rest as custom fields:
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
const { name, barcode, unitId, ...rest } = input as any;
|
|
243
|
+
const { id: _id, sku: _sku, ...customFields } = rest;
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Why not throw immutable errors
|
|
247
|
+
|
|
248
|
+
Natural keys like `sku` or `code` are **lookup keys**, not updatable fields. They do not belong in the mutable section of the input type — the type system prevents callers from passing them as update targets. There is no need for a `SkuImmutableError` or `CodeImmutableError` in an update command.
|
|
249
|
+
|
|
250
|
+
> Exception: conditionally-mutable fields (e.g., `baseCurrencyId` that can only change in DRAFT status) belong in the mutable section and use a business-rule error when the condition is not met.
|
|
182
251
|
|
|
183
252
|
## Conventions
|
|
184
253
|
|
|
185
|
-
- Input types: exported interfaces (`export interface
|
|
254
|
+
- Input types for create commands: exported interfaces (`export interface CreateXInput`)
|
|
255
|
+
- Input types for update commands: exported type aliases (`export type UpdateXInput = ...`)
|
|
186
256
|
- Use `.executeTakeFirst()` for single results
|
|
187
257
|
- Include JSDoc: `/** Function: name \n Description */`
|
|
188
258
|
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: erp-kit-update
|
|
3
3
|
description: Route requirements changes to the correct erp-kit skill. Use when requirements change midway — adding features, modifying business flows, updating screens, changing module specs, or when unsure which erp-kit skill to re-run after a change.
|
|
4
|
+
metadata:
|
|
5
|
+
erp-kit-version: "0.9.0"
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
# Requirements Update Router
|
|
7
9
|
|
|
8
10
|
Route mid-workflow changes to the correct erp-kit skill. Dynamically discovers available skills — no hardcoded routing tables.
|
|
9
11
|
|
|
12
|
+
## Version Check
|
|
13
|
+
|
|
14
|
+
Run `npx erp-kit --version` and compare against this skill's `metadata.erp-kit-version`. If they differ, the local skills are outdated — tell the user to run `pnpm erp-kit update skills` and stop.
|
|
15
|
+
|
|
10
16
|
## Workflow
|
|
11
17
|
|
|
12
18
|
```
|
package/src/commands/index.ts
CHANGED
|
@@ -19,9 +19,15 @@ const cwd = process.cwd();
|
|
|
19
19
|
export const initCommand = defineCommand({
|
|
20
20
|
name: "init",
|
|
21
21
|
description: "First-time setup for a consumer repo",
|
|
22
|
-
|
|
22
|
+
args: z.object({
|
|
23
|
+
name: arg(z.string(), {
|
|
24
|
+
positional: true,
|
|
25
|
+
description: "Project name",
|
|
26
|
+
}),
|
|
27
|
+
}),
|
|
28
|
+
run: (args) => {
|
|
23
29
|
return executeCommand(() => {
|
|
24
|
-
const exitCode = runInit(cwd);
|
|
30
|
+
const exitCode = runInit(args.name, cwd);
|
|
25
31
|
return exitCode === 0 ? success() : silentFailure(exitCode);
|
|
26
32
|
});
|
|
27
33
|
},
|
|
@@ -15,8 +15,8 @@ describe("runInit", () => {
|
|
|
15
15
|
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
16
16
|
});
|
|
17
17
|
|
|
18
|
-
it("copies skills, workflows,
|
|
19
|
-
const exitCode = runInit(tmpDir);
|
|
18
|
+
it("copies skills, workflows, symlink, and scaffolds project on fresh repo", () => {
|
|
19
|
+
const exitCode = runInit("test-project", tmpDir);
|
|
20
20
|
expect(exitCode).toBe(0);
|
|
21
21
|
|
|
22
22
|
// Skills
|
|
@@ -37,14 +37,30 @@ describe("runInit", () => {
|
|
|
37
37
|
const wfPath = path.join(tmpDir, ".github", "workflows", "erp-kit-check.yml");
|
|
38
38
|
expect(fs.existsSync(wfPath)).toBe(true);
|
|
39
39
|
|
|
40
|
-
//
|
|
41
|
-
const
|
|
42
|
-
expect(fs.existsSync(
|
|
40
|
+
// Scaffold: package.json
|
|
41
|
+
const pkgPath = path.join(tmpDir, "package.json");
|
|
42
|
+
expect(fs.existsSync(pkgPath)).toBe(true);
|
|
43
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8")) as { name: string; private: boolean };
|
|
44
|
+
expect(pkg.name).toBe("test-project");
|
|
45
|
+
expect(pkg.private).toBe(true);
|
|
46
|
+
|
|
47
|
+
// Scaffold: pnpm-workspace.yaml
|
|
48
|
+
expect(fs.existsSync(path.join(tmpDir, "pnpm-workspace.yaml"))).toBe(true);
|
|
49
|
+
|
|
50
|
+
// Scaffold: .gitignore
|
|
51
|
+
expect(fs.existsSync(path.join(tmpDir, ".gitignore"))).toBe(true);
|
|
52
|
+
|
|
53
|
+
// Scaffold: license.config.json
|
|
54
|
+
expect(fs.existsSync(path.join(tmpDir, "license.config.json"))).toBe(true);
|
|
55
|
+
|
|
56
|
+
// Scaffold: apps/ and modules/
|
|
57
|
+
expect(fs.existsSync(path.join(tmpDir, "apps", ".gitkeep"))).toBe(true);
|
|
58
|
+
expect(fs.existsSync(path.join(tmpDir, "modules", ".gitkeep"))).toBe(true);
|
|
43
59
|
});
|
|
44
60
|
|
|
45
61
|
it("refuses to run if already initialized", () => {
|
|
46
|
-
runInit(tmpDir);
|
|
47
|
-
const exitCode = runInit(tmpDir);
|
|
62
|
+
runInit("test-project", tmpDir);
|
|
63
|
+
const exitCode = runInit("test-project", tmpDir);
|
|
48
64
|
expect(exitCode).toBe(1);
|
|
49
65
|
});
|
|
50
66
|
|
|
@@ -52,7 +68,7 @@ describe("runInit", () => {
|
|
|
52
68
|
const customDir = path.join(tmpDir, ".agents", "skills", "my-custom-skill");
|
|
53
69
|
fs.mkdirSync(customDir, { recursive: true });
|
|
54
70
|
fs.writeFileSync(path.join(customDir, "SKILL.md"), "# Custom");
|
|
55
|
-
runInit(tmpDir);
|
|
71
|
+
runInit("test-project", tmpDir);
|
|
56
72
|
expect(fs.readFileSync(path.join(customDir, "SKILL.md"), "utf-8")).toBe("# Custom");
|
|
57
73
|
});
|
|
58
74
|
});
|
package/src/commands/init.ts
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
copyWorkflows,
|
|
5
|
-
copyConfigs,
|
|
6
|
-
setupSymlink,
|
|
7
|
-
isAlreadyInitialized,
|
|
8
|
-
} from "./lib/distribute";
|
|
2
|
+
import { scaffoldProjectBoilerplate } from "../generator/scaffold";
|
|
3
|
+
import { copySkills, copyWorkflows, setupSymlink, isAlreadyInitialized } from "./lib/distribute";
|
|
9
4
|
|
|
10
|
-
export function runInit(cwd: string): number {
|
|
5
|
+
export function runInit(name: string, cwd: string): number {
|
|
11
6
|
console.log(chalk.bold("erp-kit init\n"));
|
|
12
7
|
|
|
13
8
|
if (isAlreadyInitialized(cwd)) {
|
|
@@ -36,10 +31,8 @@ export function runInit(cwd: string): number {
|
|
|
36
31
|
console.log(chalk.green(` Copied ${workflows.copied} workflow(s) to .github/workflows/`));
|
|
37
32
|
}
|
|
38
33
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
console.log(chalk.green(` Copied ${configs.copied} config file(s)`));
|
|
42
|
-
}
|
|
34
|
+
scaffoldProjectBoilerplate(cwd, name);
|
|
35
|
+
console.log(chalk.green(" Scaffolded project structure"));
|
|
43
36
|
|
|
44
37
|
console.log(chalk.bold.green("\nDone! Run `erp-kit check` to validate your docs."));
|
|
45
38
|
return 0;
|
|
@@ -2,7 +2,7 @@ import fs from "node:fs";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
5
|
-
import { copySkills, copyWorkflows,
|
|
5
|
+
import { copySkills, copyWorkflows, setupSymlink } from "./distribute";
|
|
6
6
|
|
|
7
7
|
describe("copySkills", () => {
|
|
8
8
|
let tmpDir: string;
|
|
@@ -74,25 +74,6 @@ describe("copyWorkflows", () => {
|
|
|
74
74
|
});
|
|
75
75
|
});
|
|
76
76
|
|
|
77
|
-
describe("copyConfigs", () => {
|
|
78
|
-
let tmpDir: string;
|
|
79
|
-
|
|
80
|
-
beforeEach(() => {
|
|
81
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "distribute-test-"));
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
afterEach(() => {
|
|
85
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
it("copies config files to repo root", () => {
|
|
89
|
-
const result = copyConfigs(tmpDir);
|
|
90
|
-
const configPath = path.join(tmpDir, "license.config.json");
|
|
91
|
-
expect(fs.existsSync(configPath)).toBe(true);
|
|
92
|
-
expect(result.copied).toBeGreaterThan(0);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
|
|
96
77
|
describe("setupSymlink", () => {
|
|
97
78
|
let tmpDir: string;
|
|
98
79
|
|
|
@@ -4,7 +4,6 @@ import { PACKAGE_ROOT } from "../../util";
|
|
|
4
4
|
|
|
5
5
|
const SKILLS_SRC = path.join(PACKAGE_ROOT, "skills");
|
|
6
6
|
const WORKFLOWS_SRC = path.join(PACKAGE_ROOT, "templates", "workflows");
|
|
7
|
-
const CONFIG_SRC = path.join(PACKAGE_ROOT, "templates", "config");
|
|
8
7
|
|
|
9
8
|
export interface CopyResult {
|
|
10
9
|
copied: number;
|
|
@@ -77,19 +76,6 @@ export function copyWorkflows(cwd: string): CopyResult {
|
|
|
77
76
|
return { copied, removed: 0 };
|
|
78
77
|
}
|
|
79
78
|
|
|
80
|
-
export function copyConfigs(cwd: string): CopyResult {
|
|
81
|
-
if (!fs.existsSync(CONFIG_SRC)) return { copied: 0, removed: 0 };
|
|
82
|
-
|
|
83
|
-
let copied = 0;
|
|
84
|
-
for (const entry of fs.readdirSync(CONFIG_SRC)) {
|
|
85
|
-
const destPath = path.join(cwd, entry);
|
|
86
|
-
fs.copyFileSync(path.join(CONFIG_SRC, entry), destPath);
|
|
87
|
-
copied++;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return { copied, removed: 0 };
|
|
91
|
-
}
|
|
92
|
-
|
|
93
79
|
export type SymlinkResult = "linked" | "already_linked" | "skipped_directory" | "copied";
|
|
94
80
|
|
|
95
81
|
function createSymlink(target: string, linkPath: string): void {
|
|
@@ -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);
|