@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
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# TechnicallyCompleteInternalOrder
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
technicallyCompleteInternalOrder transitions an internal order from RELEASED status to TECHNICALLY_COMPLETED status. This indicates that the activity tracked by the order is complete and no further cost postings are expected, though the order remains open for final review before closure.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Internal order must exist
|
|
10
|
+
- Internal order must be in RELEASED status to be technically completed
|
|
11
|
+
- Technically completing a CREATED, already TECHNICALLY_COMPLETED, or CLOSED order is rejected as an invalid state transition
|
|
12
|
+
- Once technically completed, no further cost postings are accepted
|
|
13
|
+
- Emits an audit event recording the status transition and acting user
|
|
14
|
+
|
|
15
|
+
## Process Flow
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart TD
|
|
19
|
+
A[Receive technically complete internal order request] --> B{Internal order exists?}
|
|
20
|
+
B -->|No| C[Return error: INTERNAL_ORDER_NOT_FOUND]
|
|
21
|
+
B -->|Yes| D{Status is RELEASED?}
|
|
22
|
+
D -->|No| E[Return error: INVALID_STATE]
|
|
23
|
+
D -->|Yes| F[Transition status from RELEASED to TECHNICALLY_COMPLETED]
|
|
24
|
+
F --> G[Emit audit event]
|
|
25
|
+
G --> H[Return technically completed internal order]
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## External Dependencies
|
|
29
|
+
|
|
30
|
+
- None
|
|
31
|
+
|
|
32
|
+
## Error Scenarios
|
|
33
|
+
|
|
34
|
+
- **INTERNAL_ORDER_NOT_FOUND**: Internal order with the specified ID does not exist
|
|
35
|
+
- **INVALID_STATE**: Internal order is not in RELEASED status
|
|
36
|
+
|
|
37
|
+
## Test Cases
|
|
38
|
+
|
|
39
|
+
- technically completes a RELEASED internal order transitioning it to TECHNICALLY_COMPLETED status
|
|
40
|
+
- returns error when internal order does not exist
|
|
41
|
+
- returns error when internal order is in CREATED status
|
|
42
|
+
- returns error when internal order is already TECHNICALLY_COMPLETED
|
|
43
|
+
- returns error when internal order is CLOSED
|
|
44
|
+
- emits audit event recording the status transition and acting user
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# UpdateAllocationCycle
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateAllocationCycle modifies an existing allocation cycle. Updates are only permitted when the cycle is in DRAFT status. In the current implementation, only the cycle name can be updated while in DRAFT.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Allocation cycle must exist
|
|
10
|
+
- Allocation cycle must be in DRAFT status to be updated
|
|
11
|
+
- Updates to cycles in VALIDATED, EXECUTED, POSTED, or REVERSED status are rejected
|
|
12
|
+
- Only `name` can be updated
|
|
13
|
+
- Emits an audit event recording previous and new field values
|
|
14
|
+
|
|
15
|
+
## Process Flow
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart TD
|
|
19
|
+
A[Receive update allocation cycle request] --> B{Allocation cycle exists?}
|
|
20
|
+
B -->|No| C[Return error: ALLOCATION_CYCLE_NOT_FOUND]
|
|
21
|
+
B -->|Yes| D{Status is DRAFT?}
|
|
22
|
+
D -->|No| E[Return error: INVALID_STATE]
|
|
23
|
+
D -->|Yes| F[Apply updates to allocation cycle]
|
|
24
|
+
F --> G[Emit audit event]
|
|
25
|
+
G --> H[Return updated allocation cycle]
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## External Dependencies
|
|
29
|
+
|
|
30
|
+
- None
|
|
31
|
+
|
|
32
|
+
## Error Scenarios
|
|
33
|
+
|
|
34
|
+
- **ALLOCATION_CYCLE_NOT_FOUND**: Allocation cycle with the specified ID does not exist
|
|
35
|
+
- **INVALID_STATE**: Allocation cycle is not in DRAFT status
|
|
36
|
+
|
|
37
|
+
## Test Cases
|
|
38
|
+
|
|
39
|
+
- updates name on a DRAFT allocation cycle
|
|
40
|
+
- returns error when allocation cycle does not exist
|
|
41
|
+
- returns error when allocation cycle is in VALIDATED status
|
|
42
|
+
- returns error when allocation cycle is in EXECUTED status
|
|
43
|
+
- returns error when allocation cycle is in POSTED status
|
|
44
|
+
- returns error when allocation cycle is in REVERSED status
|
|
45
|
+
- emits audit event recording previous and new field values
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# UpdateBudget
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateBudget modifies fields on an existing budget. Updates are only permitted when the budget is in DRAFT status. Name, description, and budget holder can be updated while in DRAFT.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Budget must exist
|
|
10
|
+
- Budget must be in DRAFT status to be updated
|
|
11
|
+
- Name, description, and budget holder can be updated
|
|
12
|
+
- Updates to budgets in SUBMITTED, APPROVED, ACTIVE, or CLOSED status are rejected
|
|
13
|
+
- Emits an audit event recording previous and new field values
|
|
14
|
+
|
|
15
|
+
## Process Flow
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart TD
|
|
19
|
+
A[Receive update budget request] --> B{Budget exists?}
|
|
20
|
+
B -->|No| C[Return error: BUDGET_NOT_FOUND]
|
|
21
|
+
B -->|Yes| D{Status is DRAFT?}
|
|
22
|
+
D -->|No| E[Return error: INVALID_STATE]
|
|
23
|
+
D -->|Yes| F[Apply updates to budget]
|
|
24
|
+
F --> G[Emit audit event]
|
|
25
|
+
G --> H[Return updated budget]
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## External Dependencies
|
|
29
|
+
|
|
30
|
+
- None
|
|
31
|
+
|
|
32
|
+
## Error Scenarios
|
|
33
|
+
|
|
34
|
+
- **BUDGET_NOT_FOUND**: Budget with the specified ID does not exist
|
|
35
|
+
- **INVALID_STATE**: Budget is not in DRAFT status
|
|
36
|
+
|
|
37
|
+
## Test Cases
|
|
38
|
+
|
|
39
|
+
- updates name on a DRAFT budget
|
|
40
|
+
- updates description on a DRAFT budget
|
|
41
|
+
- updates budget holder on a DRAFT budget
|
|
42
|
+
- returns error when budget does not exist
|
|
43
|
+
- returns error when budget is in SUBMITTED status
|
|
44
|
+
- returns error when budget is in APPROVED status
|
|
45
|
+
- returns error when budget is in ACTIVE status
|
|
46
|
+
- returns error when budget is in CLOSED status
|
|
47
|
+
- emits audit event recording previous and new field values
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# UpdateCostCenter
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateCostCenter modifies fields on an existing cost center. Name, description, category, responsible person, department, and validity period can be updated. The cost center code is fixed by the existing record and is not part of the update input.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Cost center must exist
|
|
10
|
+
- Name, description, category, responsible person, and department can be updated
|
|
11
|
+
- Category must be from the defined set: overhead, production, administration, sales, or research
|
|
12
|
+
- When updating validTo, it must remain on or after validFrom
|
|
13
|
+
- Emits an audit event recording previous and new field values
|
|
14
|
+
|
|
15
|
+
## Process Flow
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart TD
|
|
19
|
+
A[Receive update cost center request] --> B{Lookup by costCenterId}
|
|
20
|
+
B -->|Not found| C[Return error: COST_CENTER_NOT_FOUND]
|
|
21
|
+
B -->|Found| D{Valid name if provided?}
|
|
22
|
+
D -->|No| E[Return error: INVALID_NAME]
|
|
23
|
+
D -->|Yes| F{Valid category if changed?}
|
|
24
|
+
F -->|No| G[Return error: INVALID_CATEGORY]
|
|
25
|
+
F -->|Yes| H{validTo >= validFrom when both set?}
|
|
26
|
+
H -->|No| I[Return error: INVALID_VALIDITY_PERIOD]
|
|
27
|
+
H -->|Yes| J[Apply updates to cost center]
|
|
28
|
+
J --> K[Emit audit event]
|
|
29
|
+
K --> L[Return updated cost center]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## External Dependencies
|
|
33
|
+
|
|
34
|
+
- None
|
|
35
|
+
|
|
36
|
+
## Error Scenarios
|
|
37
|
+
|
|
38
|
+
- **COST_CENTER_NOT_FOUND**: Cost center with the specified ID does not exist
|
|
39
|
+
- **INVALID_NAME**: Name is empty or blank when provided
|
|
40
|
+
- **INVALID_CATEGORY**: Category is not one of the recognized values (overhead, production, administration, sales, research)
|
|
41
|
+
- **INVALID_VALIDITY_PERIOD**: validTo is before validFrom
|
|
42
|
+
|
|
43
|
+
## Test Cases
|
|
44
|
+
|
|
45
|
+
- returns error when cost center does not exist
|
|
46
|
+
- returns error when name is empty string
|
|
47
|
+
- returns error when category is invalid
|
|
48
|
+
- returns error when validTo is before validFrom
|
|
49
|
+
- updates cost center with valid fields
|
|
50
|
+
- updates multiple fields at once
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# UpdateCostElement
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateCostElement modifies fields on an existing cost element that is in DRAFT or ACTIVE status. Description and name can be updated in both DRAFT and ACTIVE status. Category and GL account reference changes are only permitted while the element is in DRAFT status. Type changes are never permitted. The command enforces field-level mutability rules based on the current lifecycle status to preserve referential integrity of downstream cost postings and allocations.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Cost element must exist and be in DRAFT or ACTIVE status
|
|
10
|
+
- Description can be updated in both DRAFT and ACTIVE status
|
|
11
|
+
- Name can be updated in both DRAFT and ACTIVE status
|
|
12
|
+
- Category change is not permitted when the cost element is in ACTIVE status
|
|
13
|
+
- GL account reference change is not permitted after activation (only updatable in DRAFT)
|
|
14
|
+
- Type change (PRIMARY to SECONDARY or vice versa) is never permitted
|
|
15
|
+
- When updating category, the new category must still match the element's type
|
|
16
|
+
- When updating GL account reference on a DRAFT PRIMARY element, the new GL account must be active in an active CoA
|
|
17
|
+
- When updating GL account reference, no other PRIMARY element in the same company may reference the new GL account
|
|
18
|
+
- When updating validFrom/validTo, validFrom must be less than or equal to validTo when both are set
|
|
19
|
+
- INACTIVE cost elements cannot be updated
|
|
20
|
+
- Emits an audit event recording previous and new field values
|
|
21
|
+
|
|
22
|
+
## Process Flow
|
|
23
|
+
|
|
24
|
+
```mermaid
|
|
25
|
+
flowchart TD
|
|
26
|
+
A[Receive update cost element request] --> B{Cost element exists?}
|
|
27
|
+
B -->|No| C[Return error: COST_ELEMENT_NOT_FOUND]
|
|
28
|
+
B -->|Yes| D{Status is DRAFT or ACTIVE?}
|
|
29
|
+
D -->|No| E[Return error: INVALID_STATE]
|
|
30
|
+
D -->|Yes| F{Type change attempted?}
|
|
31
|
+
F -->|Yes| G[Return error: TYPE_CHANGE_NOT_ALLOWED]
|
|
32
|
+
F -->|No| H{Status is ACTIVE and category change attempted?}
|
|
33
|
+
H -->|Yes| I[Return error: CATEGORY_CHANGE_NOT_ALLOWED]
|
|
34
|
+
H -->|No| J{Status is ACTIVE and GL account change attempted?}
|
|
35
|
+
J -->|Yes| K[Return error: GL_ACCOUNT_CHANGE_NOT_ALLOWED]
|
|
36
|
+
J -->|No| L{Category matches type if changed?}
|
|
37
|
+
L -->|No| M[Return error: INVALID_CATEGORY_FOR_TYPE]
|
|
38
|
+
L -->|Yes| N{GL account valid if changed?}
|
|
39
|
+
N -->|No| O[Return error: GL_ACCOUNT_NOT_FOUND]
|
|
40
|
+
N -->|Yes| P{Duplicate GL account reference?}
|
|
41
|
+
P -->|Yes| Q[Return error: DUPLICATE_GL_ACCOUNT_REFERENCE]
|
|
42
|
+
P -->|No| R{validFrom <= validTo when both set?}
|
|
43
|
+
R -->|No| S[Return error: INVALID_VALIDITY_PERIOD]
|
|
44
|
+
R -->|Yes| T[Apply updates to cost element]
|
|
45
|
+
T --> U[Emit audit event]
|
|
46
|
+
U --> V[Return updated cost element]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## External Dependencies
|
|
50
|
+
|
|
51
|
+
- [coa-management::getAccount](../../../coa-management/docs/queries/GetAccount.md) — Validates updated GL account reference if changed
|
|
52
|
+
|
|
53
|
+
## Error Scenarios
|
|
54
|
+
|
|
55
|
+
- **COST_ELEMENT_NOT_FOUND**: Cost element with the specified ID does not exist
|
|
56
|
+
- **INVALID_STATE**: Cost element is in INACTIVE status and cannot be updated
|
|
57
|
+
- **TYPE_CHANGE_NOT_ALLOWED**: Changing the type (PRIMARY/SECONDARY) is never permitted
|
|
58
|
+
- **CATEGORY_CHANGE_NOT_ALLOWED**: Category cannot be changed when the cost element is in ACTIVE status
|
|
59
|
+
- **GL_ACCOUNT_CHANGE_NOT_ALLOWED**: GL account reference cannot be changed after activation
|
|
60
|
+
- **INVALID_CATEGORY_FOR_TYPE**: New category does not match the cost element type
|
|
61
|
+
- **GL_ACCOUNT_NOT_FOUND**: Updated GL account does not exist or is not active in an active Chart of Accounts
|
|
62
|
+
- **DUPLICATE_GL_ACCOUNT_REFERENCE**: Another PRIMARY cost element in the same company already references the specified GL account
|
|
63
|
+
- **INVALID_VALIDITY_PERIOD**: validFrom is after validTo
|
|
64
|
+
|
|
65
|
+
## Test Cases
|
|
66
|
+
|
|
67
|
+
- updates description on a DRAFT cost element
|
|
68
|
+
- updates description on an ACTIVE cost element
|
|
69
|
+
- updates name on a DRAFT cost element
|
|
70
|
+
- updates name on an ACTIVE cost element
|
|
71
|
+
- updates category on a DRAFT cost element
|
|
72
|
+
- returns error when changing category on an ACTIVE cost element
|
|
73
|
+
- returns error when changing type on any cost element
|
|
74
|
+
- returns error when changing GL account on an ACTIVE cost element
|
|
75
|
+
- updates GL account on a DRAFT PRIMARY cost element
|
|
76
|
+
- returns error when updated GL account does not exist
|
|
77
|
+
- returns error when updated GL account is already referenced by another PRIMARY element
|
|
78
|
+
- returns error when new category does not match the element type
|
|
79
|
+
- returns error when cost element does not exist
|
|
80
|
+
- returns error when cost element is INACTIVE
|
|
81
|
+
- returns error when validFrom is after validTo
|
|
82
|
+
- emits audit event recording previous and new field values
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# UpdateInternalOrder
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateInternalOrder modifies fields on an existing internal order. Updates are permitted when the order is in CREATED or RELEASED status. Orders in TECHNICALLY_COMPLETED or CLOSED status cannot be updated. The order type cannot be changed after the order has been released.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Internal order must exist
|
|
10
|
+
- Internal order must be in CREATED or RELEASED status
|
|
11
|
+
- Description, responsible person, cost center, and validity dates can be updated in CREATED or RELEASED status
|
|
12
|
+
- Order type cannot be changed after the order is released
|
|
13
|
+
- Orders in TECHNICALLY_COMPLETED or CLOSED status cannot be updated
|
|
14
|
+
- When updating validity dates, validFrom must precede validTo when both are set
|
|
15
|
+
- Updated cost center must belong to the same company
|
|
16
|
+
- Emits an audit event recording previous and new field values
|
|
17
|
+
|
|
18
|
+
## Process Flow
|
|
19
|
+
|
|
20
|
+
```mermaid
|
|
21
|
+
flowchart TD
|
|
22
|
+
A[Receive update internal order request] --> B{Internal order exists?}
|
|
23
|
+
B -->|No| C[Return error: INTERNAL_ORDER_NOT_FOUND]
|
|
24
|
+
B -->|Yes| D{Status is CREATED or RELEASED?}
|
|
25
|
+
D -->|No| E[Return error: INVALID_STATE]
|
|
26
|
+
D -->|Yes| F{Order type change attempted after release?}
|
|
27
|
+
F -->|Yes| G[Return error: ORDER_TYPE_CHANGE_NOT_ALLOWED]
|
|
28
|
+
F -->|No| H{Cost center valid if changed?}
|
|
29
|
+
H -->|No| I[Return error: COST_CENTER_NOT_FOUND]
|
|
30
|
+
H -->|Yes| J{validFrom <= validTo when both set?}
|
|
31
|
+
J -->|No| K[Return error: INVALID_VALIDITY_PERIOD]
|
|
32
|
+
J -->|Yes| L[Apply updates to internal order]
|
|
33
|
+
L --> M[Emit audit event]
|
|
34
|
+
M --> N[Return updated internal order]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## External Dependencies
|
|
38
|
+
|
|
39
|
+
- None
|
|
40
|
+
|
|
41
|
+
## Error Scenarios
|
|
42
|
+
|
|
43
|
+
- **INTERNAL_ORDER_NOT_FOUND**: Internal order with the specified ID does not exist
|
|
44
|
+
- **INVALID_STATE**: Internal order is in TECHNICALLY_COMPLETED or CLOSED status and cannot be updated
|
|
45
|
+
- **ORDER_TYPE_CHANGE_NOT_ALLOWED**: Order type cannot be changed after the order is released
|
|
46
|
+
- **COST_CENTER_NOT_FOUND**: Updated cost center does not exist or does not belong to the same company
|
|
47
|
+
- **INVALID_VALIDITY_PERIOD**: validFrom is after validTo
|
|
48
|
+
|
|
49
|
+
## Test Cases
|
|
50
|
+
|
|
51
|
+
- updates description on a CREATED internal order
|
|
52
|
+
- updates description on a RELEASED internal order
|
|
53
|
+
- updates responsible person on a CREATED internal order
|
|
54
|
+
- updates cost center on a CREATED internal order
|
|
55
|
+
- updates validity dates on a CREATED internal order
|
|
56
|
+
- returns error when internal order does not exist
|
|
57
|
+
- returns error when internal order is TECHNICALLY_COMPLETED
|
|
58
|
+
- returns error when internal order is CLOSED
|
|
59
|
+
- returns error when changing order type after release
|
|
60
|
+
- returns error when updated cost center does not exist
|
|
61
|
+
- returns error when validFrom is after validTo
|
|
62
|
+
- emits audit event recording previous and new field values
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# UpdateProfitCenter
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
updateProfitCenter modifies fields on an existing profit center. In DRAFT status, all mutable fields can be updated. In ACTIVE status, only limited fields (description, responsible person) can be updated. INACTIVE profit centers cannot be updated.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Profit center must exist
|
|
10
|
+
- Profit center must be in DRAFT or ACTIVE status
|
|
11
|
+
- In DRAFT status: name, description, responsible person, validFrom, validTo can be updated
|
|
12
|
+
- In ACTIVE status: only description and responsible person can be updated
|
|
13
|
+
- When updating validTo, it must remain on or after validFrom
|
|
14
|
+
- INACTIVE profit centers cannot be updated
|
|
15
|
+
- Emits an audit event recording previous and new field values
|
|
16
|
+
|
|
17
|
+
## Process Flow
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
flowchart TD
|
|
21
|
+
A[Receive update profit center request] --> B{Profit center exists?}
|
|
22
|
+
B -->|No| C[Return error: PROFIT_CENTER_NOT_FOUND]
|
|
23
|
+
B -->|Yes| D{Status is DRAFT or ACTIVE?}
|
|
24
|
+
D -->|No| E[Return error: INVALID_STATE]
|
|
25
|
+
D -->|Yes| F{Status is ACTIVE and restricted field change?}
|
|
26
|
+
F -->|Yes| G[Return error: FIELD_NOT_UPDATABLE]
|
|
27
|
+
F -->|No| H{validTo >= validFrom when both set?}
|
|
28
|
+
H -->|No| I[Return error: INVALID_VALIDITY_PERIOD]
|
|
29
|
+
H -->|Yes| J[Apply updates to profit center]
|
|
30
|
+
J --> K[Emit audit event]
|
|
31
|
+
K --> L[Return updated profit center]
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## External Dependencies
|
|
35
|
+
|
|
36
|
+
- None
|
|
37
|
+
|
|
38
|
+
## Error Scenarios
|
|
39
|
+
|
|
40
|
+
- **PROFIT_CENTER_NOT_FOUND**: Profit center with the specified ID does not exist
|
|
41
|
+
- **INVALID_STATE**: Profit center is in INACTIVE status and cannot be updated
|
|
42
|
+
- **FIELD_NOT_UPDATABLE**: Attempted to change a field that is not updatable in ACTIVE status
|
|
43
|
+
- **INVALID_VALIDITY_PERIOD**: validTo is before validFrom
|
|
44
|
+
|
|
45
|
+
## Test Cases
|
|
46
|
+
|
|
47
|
+
- updates name on a DRAFT profit center
|
|
48
|
+
- updates description on a DRAFT profit center
|
|
49
|
+
- updates description on an ACTIVE profit center
|
|
50
|
+
- updates responsible person on a DRAFT profit center
|
|
51
|
+
- updates responsible person on an ACTIVE profit center
|
|
52
|
+
- returns error when changing restricted fields on an ACTIVE profit center
|
|
53
|
+
- returns error when profit center does not exist
|
|
54
|
+
- returns error when profit center is INACTIVE
|
|
55
|
+
- returns error when validTo is before validFrom
|
|
56
|
+
- emits audit event recording previous and new field values
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# ValidateAllocationCycle
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
validateAllocationCycle transitions an allocation cycle from DRAFT status to VALIDATED status. Validation verifies that the cycle has at least one allocation rule and that receiver percentages sum to exactly 100% for each sender. Only DRAFT cycles can be validated.
|
|
6
|
+
|
|
7
|
+
## Business Rules
|
|
8
|
+
|
|
9
|
+
- Allocation cycle must exist
|
|
10
|
+
- Allocation cycle must be in DRAFT status to be validated
|
|
11
|
+
- Cycle must have at least one allocation rule
|
|
12
|
+
- Allocation rule percentages for each sender must sum to exactly 100%
|
|
13
|
+
- Percentage values must be positive (greater than zero)
|
|
14
|
+
- Upon validation, the cycle becomes eligible for execution
|
|
15
|
+
- Emits an audit event recording the status transition and acting user
|
|
16
|
+
|
|
17
|
+
## Process Flow
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
flowchart TD
|
|
21
|
+
A[Receive validate allocation cycle request] --> B{Allocation cycle exists?}
|
|
22
|
+
B -->|No| C[Return error: ALLOCATION_CYCLE_NOT_FOUND]
|
|
23
|
+
B -->|Yes| D{Status is DRAFT?}
|
|
24
|
+
D -->|No| E[Return error: INVALID_STATE]
|
|
25
|
+
D -->|Yes| F{Has at least one allocation rule?}
|
|
26
|
+
F -->|No| G[Return error: NO_ALLOCATION_RULES]
|
|
27
|
+
F -->|Yes| P{All percentages positive?}
|
|
28
|
+
P -->|No| Q[Return error: INVALID_PERCENTAGE]
|
|
29
|
+
P -->|Yes| H{Percentages sum to 100% per sender?}
|
|
30
|
+
H -->|No| I[Return error: INVALID_PERCENTAGE_SUM]
|
|
31
|
+
H -->|Yes| J[Transition status from DRAFT to VALIDATED]
|
|
32
|
+
J --> K[Emit audit event]
|
|
33
|
+
K --> L[Return validated allocation cycle]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## External Dependencies
|
|
37
|
+
|
|
38
|
+
- None
|
|
39
|
+
|
|
40
|
+
## Error Scenarios
|
|
41
|
+
|
|
42
|
+
- **ALLOCATION_CYCLE_NOT_FOUND**: Allocation cycle with the specified ID does not exist
|
|
43
|
+
- **INVALID_STATE**: Allocation cycle is not in DRAFT status
|
|
44
|
+
- **NO_ALLOCATION_RULES**: Cycle has no allocation rules defined
|
|
45
|
+
- **INVALID_PERCENTAGE**: One or more percentage values are zero or negative
|
|
46
|
+
- **INVALID_PERCENTAGE_SUM**: Allocation rule percentages for one or more senders do not sum to exactly 100%
|
|
47
|
+
|
|
48
|
+
## Test Cases
|
|
49
|
+
|
|
50
|
+
- validates a DRAFT allocation cycle with valid rules transitioning it to VALIDATED status
|
|
51
|
+
- returns error when allocation cycle does not exist
|
|
52
|
+
- returns error when allocation cycle is not in DRAFT status
|
|
53
|
+
- returns error when cycle has no allocation rules
|
|
54
|
+
- returns error when any percentage is zero or negative
|
|
55
|
+
- returns error when percentages do not sum to 100% for a sender
|
|
56
|
+
- validates with multiple senders each summing to 100%
|
|
57
|
+
- emits audit event recording the status transition and acting user
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Budget Management
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Budget Management provides the planning and control capabilities of the accounting module, enabling organizations to create budgets with line items per cost element, manage approval workflows, track multiple budget versions, and compare budgeted amounts against actual postings from finance-ledger. A budget entity carries a name, budget holder, fiscal year, period range, total amount, status, version type, and a cost object reference (cost center, profit center, or internal order). Each budget contains one or more BudgetLineItem records that specify a cost element, planned amount, and accounting period. The corresponding GL account for each line item is derived automatically from the primary cost element's one-to-one GL account mapping defined in cost-element-management, ensuring a single authoritative planning axis while preserving traceability to the general ledger. A PlanVersion entity (BUDGET, FORECAST, or SIMULATION) supports multi-version planning so organizations can maintain an approved operating budget alongside rolling forecasts and what-if simulations.
|
|
6
|
+
|
|
7
|
+
Budgets follow a five-stage lifecycle — DRAFT, SUBMITTED, APPROVED, ACTIVE, CLOSED — enforcing segregation of duties between budget creation, approval, and cost posting. Budgetary control (funds check) provides real-time validation that prevents transactions from exceeding approved budget amounts, using the BudgetAvailability formula: `Available = Budget - (Actual + Commitments + Encumbrances)`. Actual amounts are sourced from posted journal entries in finance-ledger. Commitments represent outstanding purchase order amounts received from the purchase module via commitment events; encumbrances represent purchase requisition amounts (future extension). This three-bucket model aligns with SAP availability control and Oracle budgetary control patterns. Budget periods reference finance-ledger FiscalYear and AccountingPeriod entities for period alignment, and budget lock at period-end integrates with finance-ledger period close. All budgets are scoped to a Company.
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
Organizations need a structured budgeting process to plan expenditures, control costs, and measure financial performance against targets:
|
|
12
|
+
|
|
13
|
+
- **Expenditure planning**: Budgets translate strategic objectives into quantified financial plans by allocating planned amounts to cost elements across accounting periods, providing a financial roadmap for the fiscal year. The corresponding GL account is derived from each primary cost element's GL mapping, ensuring consistency between management and financial accounting without requiring dual-axis maintenance
|
|
14
|
+
- **Approval workflow enforcement**: The DRAFT to SUBMITTED to APPROVED progression ensures budgets are reviewed and authorized before activation, enforcing segregation of duties required by SOX and internal control frameworks — budget approval must be separate from budget creation and cost posting
|
|
15
|
+
- **Multi-version planning**: PlanVersion support (BUDGET, FORECAST, SIMULATION) allows organizations to maintain an approved operating budget alongside rolling forecasts and what-if simulations, enabling agile financial planning without altering the baseline commitment
|
|
16
|
+
- **Budgetary control (funds check)**: Real-time validation prevents transactions from exceeding available budget using the formula `Available = Budget - (Actual + Commitments + Encumbrances)`. This three-bucket availability check catches overspend at entry time, including amounts committed via purchase orders that have not yet been invoiced, preventing the common failure mode where PO-committed funds are double-spent
|
|
17
|
+
- **Commitment tracking**: Outstanding purchase order amounts are tracked as commitments that reduce available budget. When the purchase module confirms, receives, or invoices a PO, commitment amounts are consumed and reclassified as actuals. This integration requires consuming commitment events from the purchase module (PO confirmed, goods received, invoice matched)
|
|
18
|
+
- **Budget vs. actual comparison**: Comparing budgeted amounts against actual postings from finance-ledger journal entries surfaces variances early, enabling corrective action before period close
|
|
19
|
+
- **Cost object alignment**: Budgets reference cost centers, profit centers, or internal orders, linking financial plans to the organizational and project structures managed by the accounting module
|
|
20
|
+
- **Period alignment with finance-ledger**: Budget periods reference FiscalYear and AccountingPeriod from finance-ledger, ensuring budget and actual data share the same temporal boundaries for accurate variance analysis
|
|
21
|
+
- **Budget lock at period-end**: Closing a budget period prevents further modifications to planned amounts, integrating with finance-ledger period close to produce a frozen baseline for reporting and audit
|
|
22
|
+
- **Audit trail**: Every lifecycle transition — creation, submission, approval, activation, closure — is recorded with the acting user and timestamp, supporting internal and external audit requirements
|
|
23
|
+
|
|
24
|
+
## Process Flow
|
|
25
|
+
|
|
26
|
+
```mermaid
|
|
27
|
+
stateDiagram-v2
|
|
28
|
+
[*] --> Draft: createBudget
|
|
29
|
+
Draft --> Draft: updateBudget / addLineItem / removeLineItem
|
|
30
|
+
Draft --> Submitted: submitBudget
|
|
31
|
+
Submitted --> Approved: approveBudget
|
|
32
|
+
Submitted --> Draft: rejectBudget
|
|
33
|
+
Approved --> Active: activateBudget
|
|
34
|
+
Active --> Closed: closeBudget
|
|
35
|
+
Draft --> [*]: deleteBudget
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```mermaid
|
|
39
|
+
flowchart TD
|
|
40
|
+
A[Define budget scope: fiscal year, cost object, version type] --> B[Create Budget in DRAFT with header fields]
|
|
41
|
+
B --> C[Add BudgetLineItem records per cost element and period]
|
|
42
|
+
C --> D{All periods and cost elements covered?}
|
|
43
|
+
D -- No --> C
|
|
44
|
+
D -- Yes --> E[Submit budget for approval]
|
|
45
|
+
E --> F{Approver reviews budget}
|
|
46
|
+
F -- Reject --> G[Return to DRAFT with rejection reason]
|
|
47
|
+
G --> C
|
|
48
|
+
F -- Approve --> H[Budget status set to APPROVED]
|
|
49
|
+
H --> I[Activate budget for budgetary control]
|
|
50
|
+
I --> J[Funds check enabled: transactions validated against budget]
|
|
51
|
+
J --> K{Period-end reached?}
|
|
52
|
+
K -- No --> J
|
|
53
|
+
K -- Yes --> L[Lock budget period and run variance analysis]
|
|
54
|
+
L --> M{All periods complete?}
|
|
55
|
+
M -- No --> K
|
|
56
|
+
M -- Yes --> N[Close budget]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```mermaid
|
|
60
|
+
flowchart TD
|
|
61
|
+
A[Transaction submitted against cost element] --> B{Budget exists and ACTIVE for cost object?}
|
|
62
|
+
B -- No --> C[Transaction proceeds without funds check]
|
|
63
|
+
B -- Yes --> D[Compute BudgetAvailability]
|
|
64
|
+
D --> D1[Available = Budget - Actual + Commitments + Encumbrances]
|
|
65
|
+
D1 --> E{Available >= transaction amount?}
|
|
66
|
+
E -- Yes --> F[Transaction passes funds check]
|
|
67
|
+
E -- No --> G[Transaction rejected: budget exceeded]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```mermaid
|
|
71
|
+
flowchart TD
|
|
72
|
+
A[Purchase Order confirmed in purchase module] --> B[Commitment event received by accounting]
|
|
73
|
+
B --> C[Record commitment amount against cost element + cost object + period]
|
|
74
|
+
C --> D[BudgetAvailability reduced by commitment amount]
|
|
75
|
+
D --> E{Goods receipt or invoice posted?}
|
|
76
|
+
E -- Goods Receipt --> F[Reduce commitment, increase actual by received amount]
|
|
77
|
+
E -- Invoice Matched --> G[Reduce remaining commitment, actual reflects invoiced amount]
|
|
78
|
+
E -- PO Cancelled --> H[Release commitment amount back to available budget]
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Scenario Patterns
|
|
82
|
+
|
|
83
|
+
- **Annual Operating Budget Creation**: A finance manager creates a new budget for fiscal year 2026 scoped to a cost center, adds line items for each cost element (salaries, travel, office supplies) distributed across twelve monthly periods, submits for department head approval, and activates upon approval to enable funds checking
|
|
84
|
+
- **Rolling Forecast Update**: A financial analyst creates a FORECAST plan version based on the approved BUDGET version, adjusts planned amounts for Q3 and Q4 to reflect revised revenue projections, and submits the forecast for review — the original BUDGET version remains unchanged as the committed baseline
|
|
85
|
+
- **What-If Simulation**: A planning team creates a SIMULATION plan version to model the financial impact of opening a new office, copying the current budget as a base and adding incremental line items for rent, staffing, and equipment — the simulation is never activated but serves as decision support
|
|
86
|
+
- **Budget Rejection and Revision**: A department submits a budget that exceeds the company-wide allocation. The finance director rejects it with a note to reduce travel expenses by 15%. The budget returns to DRAFT, the submitter adjusts the travel line items, and resubmits for approval
|
|
87
|
+
- **Funds Check Blocking an Overspend**: An employee submits a purchase order for office furniture. The funds check computes BudgetAvailability as `Budget - (Actual + Commitments + Encumbrances)` for the office supplies cost element in the current period. The available budget is insufficient after accounting for existing PO commitments, and the transaction is rejected with a budget exceeded error
|
|
88
|
+
- **Commitment Tracking from Purchase Orders**: A department issues a PO for consulting services worth $50,000. The purchase module emits a commitment event, and accounting records a $50,000 commitment against the consulting cost element budget. When the first invoice for $20,000 is matched, the commitment reduces by $20,000 and actual increases by $20,000, keeping BudgetAvailability unchanged. When the PO is fully invoiced, the commitment reaches zero
|
|
89
|
+
- **Mid-Year Budget Transfer**: A budget holder reallocates planned amounts between cost elements within the same budget (e.g., moving unused travel budget to training) by updating line items while the budget is ACTIVE, subject to approval controls
|
|
90
|
+
- **Budget vs. Actual Variance Report**: At month-end, a controller compares budgeted amounts against actual postings from finance-ledger journal entries for each cost element and period. The comparison highlights a 20% overrun in consulting expenses, triggering a management review
|
|
91
|
+
- **Period-End Budget Lock**: As the finance-ledger accounting period for January is closed, the corresponding budget period is locked, freezing planned amounts for January and preventing retroactive adjustments to the baseline
|
|
92
|
+
- **Multi-Cost-Object Budgeting**: A company creates separate budgets for three profit centers within the same fiscal year, each with its own line items and approval chain, enabling decentralized budget ownership while maintaining company-level consolidation
|
|
93
|
+
|
|
94
|
+
## Test Cases
|
|
95
|
+
|
|
96
|
+
- Budget lifecycle follows DRAFT -> SUBMITTED -> APPROVED -> ACTIVE -> CLOSED state machine
|
|
97
|
+
- Budget can only be created in DRAFT status
|
|
98
|
+
- Budget requires a valid companyId; the company must be in ACTIVE status
|
|
99
|
+
- Budget requires a valid fiscal year reference from finance-ledger
|
|
100
|
+
- Budget requires a name, budget holder, and cost object reference (cost center, profit center, or internal order)
|
|
101
|
+
- Budget must reference a valid PlanVersion (BUDGET, FORECAST, or SIMULATION)
|
|
102
|
+
- A DRAFT budget can be updated (name, description, budget holder, line items)
|
|
103
|
+
- A DRAFT budget can be deleted; deletion removes all associated line items
|
|
104
|
+
- Submitting a budget transitions status from DRAFT to SUBMITTED
|
|
105
|
+
- A budget with no line items cannot be submitted
|
|
106
|
+
- Only a user different from the budget creator can approve the budget (segregation of duties)
|
|
107
|
+
- Approving a budget transitions status from SUBMITTED to APPROVED
|
|
108
|
+
- Rejecting a budget transitions status from SUBMITTED back to DRAFT
|
|
109
|
+
- Rejection requires a reason text
|
|
110
|
+
- Activating an APPROVED budget transitions status to ACTIVE and enables funds checking
|
|
111
|
+
- Only one ACTIVE budget of type BUDGET can exist per cost object per fiscal year
|
|
112
|
+
- Multiple FORECAST or SIMULATION versions can coexist for the same cost object and fiscal year
|
|
113
|
+
- Closing an ACTIVE budget transitions status to CLOSED; no further modifications are permitted
|
|
114
|
+
- A CLOSED budget cannot be reopened
|
|
115
|
+
- BudgetLineItem requires a valid cost element reference; the cost element must be a PRIMARY type in ACTIVE status
|
|
116
|
+
- BudgetLineItem derives its GL account automatically from the referenced primary cost element's GL account mapping; no separate GL account field is required
|
|
117
|
+
- BudgetLineItem requires a valid accounting period reference from finance-ledger
|
|
118
|
+
- BudgetLineItem planned amount must be a positive value
|
|
119
|
+
- Line items can be added to or removed from a DRAFT budget
|
|
120
|
+
- Line items cannot be added to or removed from a SUBMITTED, APPROVED, or CLOSED budget
|
|
121
|
+
- Duplicate line items (same account and period) within a single budget are rejected
|
|
122
|
+
- Funds check computes BudgetAvailability as `Budget - (Actual + Commitments + Encumbrances)` for the target cost element, period, and cost object
|
|
123
|
+
- A transaction that exceeds BudgetAvailability is rejected with a budget exceeded error when budgetary control is active
|
|
124
|
+
- A transaction against a cost element with no corresponding budget line item is flagged as unbudgeted
|
|
125
|
+
- Commitment amounts are recorded when a purchase order confirmation event is received from the purchase module
|
|
126
|
+
- Commitment amounts are reduced and actual amounts are increased when a goods receipt or invoice match event is received from the purchase module
|
|
127
|
+
- Commitment amounts are fully released when a purchase order cancellation event is received from the purchase module
|
|
128
|
+
- Encumbrances (purchase requisition amounts) are tracked as a future extension; the availability formula reserves the field but the initial implementation treats encumbrances as zero
|
|
129
|
+
- Budget vs. actual comparison retrieves actual amounts from finance-ledger posted journal entries matching the budget's cost object, cost element, and period
|
|
130
|
+
- Variance is computed as planned amount minus actual amount; positive variance indicates underspend, negative indicates overspend
|
|
131
|
+
- Budget periods align with finance-ledger AccountingPeriod boundaries; misaligned periods are rejected
|
|
132
|
+
- Locking a budget period prevents further modifications to planned amounts for that period
|
|
133
|
+
- Budget lock integrates with finance-ledger period close; closing an accounting period triggers the corresponding budget period lock
|
|
134
|
+
- PlanVersion of type FORECAST or SIMULATION can reference a base version from which line items are copied
|
|
135
|
+
- Creating a budget emits an audit event recording the acting user, timestamp, and initial field values
|
|
136
|
+
- Submitting, approving, rejecting, activating, and closing a budget each emit audit events recording the status transition and acting user
|
|
137
|
+
- Budgets are scoped to a company; budgets from different companies are fully isolated
|
|
138
|
+
- Only users with appropriate permissions can create, submit, approve, activate, or close budgets
|
|
139
|
+
- Unauthorized users receive a permission denied error when attempting budget operations
|
|
140
|
+
|
|
141
|
+
## Reference Links
|
|
142
|
+
|
|
143
|
+
- [SAP S/4HANA Budget Management and Availability Control](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/4dbfa293944e410aa3ca0e0905bda494/d0b843994f0d1014a585e2078de58ced.html)
|
|
144
|
+
- [Oracle Fusion Financials Budgetary Control](https://docs.oracle.com/en/cloud/saas/financials/24d/oafcf/budgetary-control.html)
|
|
145
|
+
- [Odoo Budget Management](https://www.odoo.com/documentation/19.0/applications/finance/accounting/reporting/budget.html)
|
|
146
|
+
- [NetSuite Budgets Overview](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_N2169498.html)
|
|
147
|
+
- [Sage Intacct Budgeting and Planning](https://www.sage.com/en-us/sage-business-cloud/intacct/features/budgeting-and-planning/)
|