@tailor-platform/erp-kit 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +8 -4
- package/dist/cli.mjs +70 -70
- package/package.json +1 -1
- package/skills/erp-kit-app-5-impl-backend/SKILL.md +5 -5
- package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -1
- package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +37 -12
- package/skills/erp-kit-app-6-impl-frontend/SKILL.md +3 -1
- package/skills/erp-kit-app-6-impl-frontend/references/component.md +90 -0
- package/skills/erp-kit-app-6-impl-frontend/references/detail-view.md +255 -0
- package/skills/erp-kit-app-6-impl-frontend/references/pages.md +1 -5
- package/skills/erp-kit-app-7-impl-review/SKILL.md +3 -2
- package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +14 -8
- package/skills/erp-kit-module-6-impl-review/SKILL.md +16 -19
- package/skills/erp-kit-module-shared/references/commands.md +68 -1
- package/src/commands/index.ts +8 -2
- package/src/commands/init.test.ts +24 -8
- package/src/commands/init.ts +5 -12
- package/src/commands/lib/distribute.test.ts +1 -20
- package/src/commands/lib/distribute.ts +0 -14
- package/src/commands/update.test.ts +1 -1
- package/src/generator/scaffold.ts +25 -4
- package/src/module.ts +4 -1
- package/src/modules/accounting/README.md +63 -0
- package/src/modules/accounting/command/activateBudget.generated.ts +6 -0
- package/src/modules/accounting/command/activateBudget.test.ts +119 -0
- package/src/modules/accounting/command/activateBudget.ts +77 -0
- package/src/modules/accounting/command/activateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/activateCostElement.test.ts +59 -0
- package/src/modules/accounting/command/activateCostElement.ts +41 -0
- package/src/modules/accounting/command/activateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/activateProfitCenter.test.ts +60 -0
- package/src/modules/accounting/command/activateProfitCenter.ts +38 -0
- package/src/modules/accounting/command/approveBudget.generated.ts +6 -0
- package/src/modules/accounting/command/approveBudget.test.ts +69 -0
- package/src/modules/accounting/command/approveBudget.ts +47 -0
- package/src/modules/accounting/command/assignCostCenterToHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/assignCostCenterToHierarchyNode.test.ts +112 -0
- package/src/modules/accounting/command/assignCostCenterToHierarchyNode.ts +67 -0
- package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.test.ts +123 -0
- package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.ts +71 -0
- package/src/modules/accounting/command/closeBudget.generated.ts +6 -0
- package/src/modules/accounting/command/closeBudget.test.ts +93 -0
- package/src/modules/accounting/command/closeBudget.ts +40 -0
- package/src/modules/accounting/command/closeInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/closeInternalOrder.test.ts +74 -0
- package/src/modules/accounting/command/closeInternalOrder.ts +38 -0
- package/src/modules/accounting/command/consumeCommitment.generated.ts +6 -0
- package/src/modules/accounting/command/consumeCommitment.test.ts +123 -0
- package/src/modules/accounting/command/consumeCommitment.ts +62 -0
- package/src/modules/accounting/command/createAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/createAllocationCycle.test.ts +166 -0
- package/src/modules/accounting/command/createAllocationCycle.ts +68 -0
- package/src/modules/accounting/command/createAllocationRule.generated.ts +6 -0
- package/src/modules/accounting/command/createAllocationRule.test.ts +195 -0
- package/src/modules/accounting/command/createAllocationRule.ts +103 -0
- package/src/modules/accounting/command/createBudget.generated.ts +6 -0
- package/src/modules/accounting/command/createBudget.test.ts +159 -0
- package/src/modules/accounting/command/createBudget.ts +100 -0
- package/src/modules/accounting/command/createBudgetLineItem.generated.ts +6 -0
- package/src/modules/accounting/command/createBudgetLineItem.test.ts +178 -0
- package/src/modules/accounting/command/createBudgetLineItem.ts +104 -0
- package/src/modules/accounting/command/createCostCenter.generated.ts +6 -0
- package/src/modules/accounting/command/createCostCenter.test.ts +179 -0
- package/src/modules/accounting/command/createCostCenter.ts +112 -0
- package/src/modules/accounting/command/createCostCenterHierarchy.generated.ts +6 -0
- package/src/modules/accounting/command/createCostCenterHierarchy.test.ts +91 -0
- package/src/modules/accounting/command/createCostCenterHierarchy.ts +48 -0
- package/src/modules/accounting/command/createCostCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/createCostCenterHierarchyNode.test.ts +171 -0
- package/src/modules/accounting/command/createCostCenterHierarchyNode.ts +117 -0
- package/src/modules/accounting/command/createCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/createCostElement.test.ts +317 -0
- package/src/modules/accounting/command/createCostElement.ts +149 -0
- package/src/modules/accounting/command/createInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/createInternalOrder.test.ts +206 -0
- package/src/modules/accounting/command/createInternalOrder.ts +104 -0
- package/src/modules/accounting/command/createPlanVersion.generated.ts +6 -0
- package/src/modules/accounting/command/createPlanVersion.test.ts +230 -0
- package/src/modules/accounting/command/createPlanVersion.ts +71 -0
- package/src/modules/accounting/command/createProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/createProfitCenter.test.ts +227 -0
- package/src/modules/accounting/command/createProfitCenter.ts +81 -0
- package/src/modules/accounting/command/createProfitCenterHierarchy.generated.ts +6 -0
- package/src/modules/accounting/command/createProfitCenterHierarchy.test.ts +91 -0
- package/src/modules/accounting/command/createProfitCenterHierarchy.ts +46 -0
- package/src/modules/accounting/command/createProfitCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/createProfitCenterHierarchyNode.test.ts +160 -0
- package/src/modules/accounting/command/createProfitCenterHierarchyNode.ts +109 -0
- package/src/modules/accounting/command/deactivateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/deactivateCostElement.test.ts +59 -0
- package/src/modules/accounting/command/deactivateCostElement.ts +41 -0
- package/src/modules/accounting/command/deactivateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/deactivateProfitCenter.test.ts +60 -0
- package/src/modules/accounting/command/deactivateProfitCenter.ts +42 -0
- package/src/modules/accounting/command/deleteAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/deleteAllocationCycle.test.ts +90 -0
- package/src/modules/accounting/command/deleteAllocationCycle.ts +39 -0
- package/src/modules/accounting/command/deleteAllocationRule.generated.ts +6 -0
- package/src/modules/accounting/command/deleteAllocationRule.test.ts +98 -0
- package/src/modules/accounting/command/deleteAllocationRule.ts +40 -0
- package/src/modules/accounting/command/deleteBudget.generated.ts +6 -0
- package/src/modules/accounting/command/deleteBudget.test.ts +90 -0
- package/src/modules/accounting/command/deleteBudget.ts +35 -0
- package/src/modules/accounting/command/deleteBudgetLineItem.generated.ts +6 -0
- package/src/modules/accounting/command/deleteBudgetLineItem.test.ts +85 -0
- package/src/modules/accounting/command/deleteBudgetLineItem.ts +50 -0
- package/src/modules/accounting/command/deleteCostCenter.generated.ts +6 -0
- package/src/modules/accounting/command/deleteCostCenter.test.ts +79 -0
- package/src/modules/accounting/command/deleteCostCenter.ts +67 -0
- package/src/modules/accounting/command/deleteCostCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/deleteCostCenterHierarchyNode.test.ts +59 -0
- package/src/modules/accounting/command/deleteCostCenterHierarchyNode.ts +58 -0
- package/src/modules/accounting/command/deleteCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/deleteCostElement.test.ts +58 -0
- package/src/modules/accounting/command/deleteCostElement.ts +33 -0
- package/src/modules/accounting/command/deleteInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/deleteInternalOrder.test.ts +81 -0
- package/src/modules/accounting/command/deleteInternalOrder.ts +37 -0
- package/src/modules/accounting/command/deleteProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/deleteProfitCenter.test.ts +68 -0
- package/src/modules/accounting/command/deleteProfitCenter.ts +39 -0
- package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.test.ts +72 -0
- package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.ts +61 -0
- package/src/modules/accounting/command/executeAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/executeAllocationCycle.test.ts +167 -0
- package/src/modules/accounting/command/executeAllocationCycle.ts +94 -0
- package/src/modules/accounting/command/finalizeVarianceReport.generated.ts +6 -0
- package/src/modules/accounting/command/finalizeVarianceReport.test.ts +60 -0
- package/src/modules/accounting/command/finalizeVarianceReport.ts +45 -0
- package/src/modules/accounting/command/generateVarianceReport.generated.ts +6 -0
- package/src/modules/accounting/command/generateVarianceReport.test.ts +386 -0
- package/src/modules/accounting/command/generateVarianceReport.ts +219 -0
- package/src/modules/accounting/command/invalidateAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/invalidateAllocationCycle.test.ts +84 -0
- package/src/modules/accounting/command/invalidateAllocationCycle.ts +45 -0
- package/src/modules/accounting/command/moveCostCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/moveCostCenterHierarchyNode.test.ts +135 -0
- package/src/modules/accounting/command/moveCostCenterHierarchyNode.ts +81 -0
- package/src/modules/accounting/command/postAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/postAllocationCycle.test.ts +98 -0
- package/src/modules/accounting/command/postAllocationCycle.ts +65 -0
- package/src/modules/accounting/command/reactivateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/reactivateCostElement.test.ts +59 -0
- package/src/modules/accounting/command/reactivateCostElement.ts +41 -0
- package/src/modules/accounting/command/reactivateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/reactivateProfitCenter.test.ts +60 -0
- package/src/modules/accounting/command/reactivateProfitCenter.ts +42 -0
- package/src/modules/accounting/command/recordCommitment.generated.ts +6 -0
- package/src/modules/accounting/command/recordCommitment.test.ts +157 -0
- package/src/modules/accounting/command/recordCommitment.ts +113 -0
- package/src/modules/accounting/command/rejectBudget.generated.ts +6 -0
- package/src/modules/accounting/command/rejectBudget.test.ts +105 -0
- package/src/modules/accounting/command/rejectBudget.ts +51 -0
- package/src/modules/accounting/command/releaseCommitment.generated.ts +6 -0
- package/src/modules/accounting/command/releaseCommitment.test.ts +94 -0
- package/src/modules/accounting/command/releaseCommitment.ts +51 -0
- package/src/modules/accounting/command/releaseInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/releaseInternalOrder.test.ts +74 -0
- package/src/modules/accounting/command/releaseInternalOrder.ts +38 -0
- package/src/modules/accounting/command/reverseAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/reverseAllocationCycle.test.ts +124 -0
- package/src/modules/accounting/command/reverseAllocationCycle.ts +63 -0
- package/src/modules/accounting/command/submitBudget.generated.ts +6 -0
- package/src/modules/accounting/command/submitBudget.test.ts +60 -0
- package/src/modules/accounting/command/submitBudget.ts +51 -0
- package/src/modules/accounting/command/technicallyCompleteInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/technicallyCompleteInternalOrder.test.ts +74 -0
- package/src/modules/accounting/command/technicallyCompleteInternalOrder.ts +42 -0
- package/src/modules/accounting/command/updateAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/updateAllocationCycle.test.ts +112 -0
- package/src/modules/accounting/command/updateAllocationCycle.ts +41 -0
- package/src/modules/accounting/command/updateBudget.generated.ts +6 -0
- package/src/modules/accounting/command/updateBudget.test.ts +112 -0
- package/src/modules/accounting/command/updateBudget.ts +44 -0
- package/src/modules/accounting/command/updateCostCenter.generated.ts +6 -0
- package/src/modules/accounting/command/updateCostCenter.test.ts +105 -0
- package/src/modules/accounting/command/updateCostCenter.ts +79 -0
- package/src/modules/accounting/command/updateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/updateCostElement.test.ts +265 -0
- package/src/modules/accounting/command/updateCostElement.ts +158 -0
- package/src/modules/accounting/command/updateInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/updateInternalOrder.test.ts +209 -0
- package/src/modules/accounting/command/updateInternalOrder.ts +88 -0
- package/src/modules/accounting/command/updateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/updateProfitCenter.test.ts +162 -0
- package/src/modules/accounting/command/updateProfitCenter.ts +73 -0
- package/src/modules/accounting/command/validateAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/validateAllocationCycle.test.ts +141 -0
- package/src/modules/accounting/command/validateAllocationCycle.ts +80 -0
- package/src/modules/accounting/db/allocationCycle.ts +59 -0
- package/src/modules/accounting/db/allocationResult.ts +58 -0
- package/src/modules/accounting/db/allocationRule.ts +48 -0
- package/src/modules/accounting/db/budget.ts +84 -0
- package/src/modules/accounting/db/budgetLineItem.ts +64 -0
- package/src/modules/accounting/db/commitment.ts +60 -0
- package/src/modules/accounting/db/costCenter.ts +73 -0
- package/src/modules/accounting/db/costCenterHierarchy.ts +37 -0
- package/src/modules/accounting/db/costCenterHierarchyNode.ts +48 -0
- package/src/modules/accounting/db/costElement.ts +56 -0
- package/src/modules/accounting/db/internalOrder.ts +69 -0
- package/src/modules/accounting/db/planVersion.ts +47 -0
- package/src/modules/accounting/db/profitCenter.ts +52 -0
- package/src/modules/accounting/db/profitCenterHierarchy.ts +36 -0
- package/src/modules/accounting/db/profitCenterHierarchyAssignment.ts +62 -0
- package/src/modules/accounting/db/profitCenterHierarchyNode.ts +48 -0
- package/src/modules/accounting/db/varianceReport.ts +54 -0
- package/src/modules/accounting/db/varianceReportLine.ts +62 -0
- package/src/modules/accounting/docs/commands/ActivateBudget.md +54 -0
- package/src/modules/accounting/docs/commands/ActivateCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/ActivateProfitCenter.md +43 -0
- package/src/modules/accounting/docs/commands/ApproveBudget.md +46 -0
- package/src/modules/accounting/docs/commands/AssignCostCenterToHierarchyNode.md +46 -0
- package/src/modules/accounting/docs/commands/AssignProfitCenterToHierarchyNode.md +47 -0
- package/src/modules/accounting/docs/commands/CloseBudget.md +47 -0
- package/src/modules/accounting/docs/commands/CloseInternalOrder.md +45 -0
- package/src/modules/accounting/docs/commands/ConsumeCommitment.md +53 -0
- package/src/modules/accounting/docs/commands/CreateAllocationCycle.md +55 -0
- package/src/modules/accounting/docs/commands/CreateAllocationRule.md +60 -0
- package/src/modules/accounting/docs/commands/CreateBudget.md +65 -0
- package/src/modules/accounting/docs/commands/CreateBudgetLineItem.md +66 -0
- package/src/modules/accounting/docs/commands/CreateCostCenter.md +64 -0
- package/src/modules/accounting/docs/commands/CreateCostCenterHierarchy.md +45 -0
- package/src/modules/accounting/docs/commands/CreateCostCenterHierarchyNode.md +61 -0
- package/src/modules/accounting/docs/commands/CreateCostElement.md +91 -0
- package/src/modules/accounting/docs/commands/CreateInternalOrder.md +72 -0
- package/src/modules/accounting/docs/commands/CreatePlanVersion.md +59 -0
- package/src/modules/accounting/docs/commands/CreateProfitCenter.md +63 -0
- package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchy.md +45 -0
- package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchyNode.md +60 -0
- package/src/modules/accounting/docs/commands/DeactivateCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/DeactivateProfitCenter.md +44 -0
- package/src/modules/accounting/docs/commands/DeleteAllocationCycle.md +46 -0
- package/src/modules/accounting/docs/commands/DeleteAllocationRule.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteBudget.md +46 -0
- package/src/modules/accounting/docs/commands/DeleteBudgetLineItem.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteCostCenter.md +50 -0
- package/src/modules/accounting/docs/commands/DeleteCostCenterHierarchyNode.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/DeleteInternalOrder.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteProfitCenter.md +46 -0
- package/src/modules/accounting/docs/commands/DeleteProfitCenterHierarchyNode.md +46 -0
- package/src/modules/accounting/docs/commands/ExecuteAllocationCycle.md +54 -0
- package/src/modules/accounting/docs/commands/FinalizeVarianceReport.md +44 -0
- package/src/modules/accounting/docs/commands/GenerateVarianceReport.md +83 -0
- package/src/modules/accounting/docs/commands/InvalidateAllocationCycle.md +45 -0
- package/src/modules/accounting/docs/commands/MoveCostCenterHierarchyNode.md +51 -0
- package/src/modules/accounting/docs/commands/PostAllocationCycle.md +58 -0
- package/src/modules/accounting/docs/commands/ReactivateCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/ReactivateProfitCenter.md +43 -0
- package/src/modules/accounting/docs/commands/RecordCommitment.md +60 -0
- package/src/modules/accounting/docs/commands/RejectBudget.md +49 -0
- package/src/modules/accounting/docs/commands/ReleaseCommitment.md +45 -0
- package/src/modules/accounting/docs/commands/ReleaseInternalOrder.md +44 -0
- package/src/modules/accounting/docs/commands/ReverseAllocationCycle.md +55 -0
- package/src/modules/accounting/docs/commands/SubmitBudget.md +47 -0
- package/src/modules/accounting/docs/commands/TechnicallyCompleteInternalOrder.md +44 -0
- package/src/modules/accounting/docs/commands/UpdateAllocationCycle.md +45 -0
- package/src/modules/accounting/docs/commands/UpdateBudget.md +47 -0
- package/src/modules/accounting/docs/commands/UpdateCostCenter.md +50 -0
- package/src/modules/accounting/docs/commands/UpdateCostElement.md +82 -0
- package/src/modules/accounting/docs/commands/UpdateInternalOrder.md +62 -0
- package/src/modules/accounting/docs/commands/UpdateProfitCenter.md +56 -0
- package/src/modules/accounting/docs/commands/ValidateAllocationCycle.md +57 -0
- package/src/modules/accounting/docs/features/budget-management.md +147 -0
- package/src/modules/accounting/docs/features/cost-allocation.md +129 -0
- package/src/modules/accounting/docs/features/cost-center-management.md +118 -0
- package/src/modules/accounting/docs/features/cost-element-management.md +114 -0
- package/src/modules/accounting/docs/features/internal-order-management.md +111 -0
- package/src/modules/accounting/docs/features/profit-center-management.md +120 -0
- package/src/modules/accounting/docs/features/variance-analysis.md +130 -0
- package/src/modules/accounting/docs/models/AllocationCycle.md +81 -0
- package/src/modules/accounting/docs/models/AllocationResult.md +37 -0
- package/src/modules/accounting/docs/models/AllocationRule.md +41 -0
- package/src/modules/accounting/docs/models/Budget.md +77 -0
- package/src/modules/accounting/docs/models/BudgetLineItem.md +40 -0
- package/src/modules/accounting/docs/models/Commitment.md +45 -0
- package/src/modules/accounting/docs/models/CostCenter.md +51 -0
- package/src/modules/accounting/docs/models/CostCenterHierarchy.md +38 -0
- package/src/modules/accounting/docs/models/CostCenterHierarchyNode.md +41 -0
- package/src/modules/accounting/docs/models/CostElement.md +66 -0
- package/src/modules/accounting/docs/models/InternalOrder.md +67 -0
- package/src/modules/accounting/docs/models/PlanVersion.md +36 -0
- package/src/modules/accounting/docs/models/ProfitCenter.md +66 -0
- package/src/modules/accounting/docs/models/ProfitCenterHierarchy.md +36 -0
- package/src/modules/accounting/docs/models/ProfitCenterHierarchyAssignment.md +36 -0
- package/src/modules/accounting/docs/models/ProfitCenterHierarchyNode.md +39 -0
- package/src/modules/accounting/docs/models/VarianceReport.md +58 -0
- package/src/modules/accounting/docs/models/VarianceReportLine.md +43 -0
- package/src/modules/accounting/docs/queries/CalculateBudgetAvailability.md +64 -0
- package/src/modules/accounting/docs/queries/GetAllocationCycle.md +43 -0
- package/src/modules/accounting/docs/queries/GetBudget.md +42 -0
- package/src/modules/accounting/docs/queries/GetCostCenter.md +38 -0
- package/src/modules/accounting/docs/queries/GetCostCenterHierarchy.md +45 -0
- package/src/modules/accounting/docs/queries/GetCostElement.md +39 -0
- package/src/modules/accounting/docs/queries/GetInternalOrder.md +42 -0
- package/src/modules/accounting/docs/queries/GetProfitCenter.md +38 -0
- package/src/modules/accounting/docs/queries/GetProfitCenterHierarchy.md +46 -0
- package/src/modules/accounting/docs/queries/GetVarianceReport.md +45 -0
- package/src/modules/accounting/docs/queries/ListAllocationCycles.md +63 -0
- package/src/modules/accounting/docs/queries/ListBudgets.md +70 -0
- package/src/modules/accounting/docs/queries/ListCostCenters.md +55 -0
- package/src/modules/accounting/docs/queries/ListCostElements.md +63 -0
- package/src/modules/accounting/docs/queries/ListInternalOrders.md +62 -0
- package/src/modules/accounting/docs/queries/ListProfitCenters.md +49 -0
- package/src/modules/accounting/generated/enums.ts +110 -0
- package/src/modules/accounting/generated/kysely-tailordb.ts +302 -0
- package/src/modules/accounting/index.ts +2 -0
- package/src/modules/accounting/lib/_db_deps.ts +70 -0
- package/src/modules/accounting/lib/actualAmounts.ts +93 -0
- package/src/modules/accounting/lib/allocationPosting.ts +152 -0
- package/src/modules/accounting/lib/errors.generated.ts +432 -0
- package/src/modules/accounting/lib/permissions.generated.ts +61 -0
- package/src/modules/accounting/lib/types.ts +114 -0
- package/src/modules/accounting/module.ts +428 -0
- package/src/modules/accounting/permissions.ts +3 -0
- package/src/modules/accounting/query/calculateBudgetAvailability.generated.ts +5 -0
- package/src/modules/accounting/query/calculateBudgetAvailability.test.ts +229 -0
- package/src/modules/accounting/query/calculateBudgetAvailability.ts +147 -0
- package/src/modules/accounting/query/getAllocationCycle.generated.ts +5 -0
- package/src/modules/accounting/query/getAllocationCycle.test.ts +94 -0
- package/src/modules/accounting/query/getAllocationCycle.ts +37 -0
- package/src/modules/accounting/query/getBudget.generated.ts +5 -0
- package/src/modules/accounting/query/getBudget.test.ts +80 -0
- package/src/modules/accounting/query/getBudget.ts +31 -0
- package/src/modules/accounting/query/getCostCenter.generated.ts +5 -0
- package/src/modules/accounting/query/getCostCenter.test.ts +50 -0
- package/src/modules/accounting/query/getCostCenter.ts +33 -0
- package/src/modules/accounting/query/getCostCenterHierarchy.generated.ts +5 -0
- package/src/modules/accounting/query/getCostCenterHierarchy.test.ts +100 -0
- package/src/modules/accounting/query/getCostCenterHierarchy.ts +80 -0
- package/src/modules/accounting/query/getCostElement.generated.ts +5 -0
- package/src/modules/accounting/query/getCostElement.test.ts +57 -0
- package/src/modules/accounting/query/getCostElement.ts +21 -0
- package/src/modules/accounting/query/getInternalOrder.generated.ts +5 -0
- package/src/modules/accounting/query/getInternalOrder.test.ts +73 -0
- package/src/modules/accounting/query/getInternalOrder.ts +21 -0
- package/src/modules/accounting/query/getProfitCenter.generated.ts +5 -0
- package/src/modules/accounting/query/getProfitCenter.test.ts +65 -0
- package/src/modules/accounting/query/getProfitCenter.ts +31 -0
- package/src/modules/accounting/query/getProfitCenterHierarchy.generated.ts +5 -0
- package/src/modules/accounting/query/getProfitCenterHierarchy.test.ts +97 -0
- package/src/modules/accounting/query/getProfitCenterHierarchy.ts +87 -0
- package/src/modules/accounting/query/getVarianceReport.generated.ts +5 -0
- package/src/modules/accounting/query/getVarianceReport.test.ts +108 -0
- package/src/modules/accounting/query/getVarianceReport.ts +31 -0
- package/src/modules/accounting/query/listAllocationCycles.generated.ts +5 -0
- package/src/modules/accounting/query/listAllocationCycles.test.ts +152 -0
- package/src/modules/accounting/query/listAllocationCycles.ts +96 -0
- package/src/modules/accounting/query/listBudgets.generated.ts +5 -0
- package/src/modules/accounting/query/listBudgets.test.ts +150 -0
- package/src/modules/accounting/query/listBudgets.ts +85 -0
- package/src/modules/accounting/query/listCostCenters.generated.ts +5 -0
- package/src/modules/accounting/query/listCostCenters.test.ts +111 -0
- package/src/modules/accounting/query/listCostCenters.ts +71 -0
- package/src/modules/accounting/query/listCostElements.generated.ts +5 -0
- package/src/modules/accounting/query/listCostElements.test.ts +138 -0
- package/src/modules/accounting/query/listCostElements.ts +105 -0
- package/src/modules/accounting/query/listInternalOrders.generated.ts +5 -0
- package/src/modules/accounting/query/listInternalOrders.test.ts +129 -0
- package/src/modules/accounting/query/listInternalOrders.ts +94 -0
- package/src/modules/accounting/query/listProfitCenters.generated.ts +5 -0
- package/src/modules/accounting/query/listProfitCenters.test.ts +94 -0
- package/src/modules/accounting/query/listProfitCenters.ts +56 -0
- package/src/modules/accounting/seed/index.ts +19 -0
- package/src/modules/accounting/tailor.config.ts +13 -0
- package/src/modules/accounting/testing/commandTestUtils.ts +35 -0
- package/src/modules/accounting/testing/fixtures.ts +502 -0
- package/src/modules/audit/command/logAuditEvent.ts +43 -38
- package/src/modules/audit/command/updateAuditPolicy.ts +2 -2
- package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +1 -1
- package/src/modules/audit/module.ts +4 -0
- package/src/modules/business-partner/command/updateContactPerson.ts +3 -4
- package/src/modules/business-partner/command/updatePartner.ts +13 -6
- package/src/modules/business-partner/command/updatePartnerAddress.ts +13 -6
- package/src/modules/business-partner/command/updatePartnerBankAccount.ts +3 -4
- package/src/modules/business-partner/command/updatePartnerIdentification.ts +3 -4
- package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +3 -3
- package/src/modules/business-partner/docs/commands/UpdatePartner.md +2 -2
- package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +2 -2
- package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +2 -2
- package/src/modules/coa-management/command/updateAccount.ts +3 -3
- package/src/modules/coa-management/command/updateAccountGroup.test.ts +22 -0
- package/src/modules/coa-management/command/updateAccountGroup.ts +30 -18
- package/src/modules/coa-management/command/updateChartOfAccounts.ts +3 -4
- package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +4 -3
- package/src/modules/finance-ledger/command/updateFiscalYear.ts +2 -3
- package/src/modules/finance-ledger/command/updateJournalEntry.test.ts +0 -17
- package/src/modules/finance-ledger/command/updateJournalEntry.ts +2 -10
- package/src/modules/finance-ledger/command/updateJournalLine.ts +2 -3
- package/src/modules/finance-ledger/docs/commands/UpdateJournalEntry.md +1 -4
- package/src/modules/inventory/command/updateLot.test.ts +1 -1
- package/src/modules/inventory/command/updateLot.ts +2 -3
- package/src/modules/inventory/command/updateStockMovement.ts +2 -3
- package/src/modules/inventory/command/updateStorageLocation.ts +12 -17
- package/src/modules/inventory/command/updateValuationPolicy.ts +2 -3
- package/src/modules/inventory/command/updateWarehouse.ts +2 -3
- package/src/modules/inventory/docs/commands/UpdateLot.md +3 -3
- package/src/modules/inventory/docs/commands/UpdateStorageLocation.md +6 -6
- package/src/modules/inventory/docs/commands/UpdateWarehouse.md +2 -2
- package/src/modules/item-management/command/updateItem.test.ts +16 -12
- package/src/modules/item-management/command/updateItem.ts +47 -31
- package/src/modules/item-management/command/updateTaxonomyNode.test.ts +15 -16
- package/src/modules/item-management/command/updateTaxonomyNode.ts +42 -29
- package/src/modules/item-management/docs/commands/UpdateItem.md +7 -11
- package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +10 -14
- package/src/modules/manufacturing/command/updateBillOfMaterial.ts +3 -4
- package/src/modules/manufacturing/command/updateProductionOrder.ts +3 -4
- package/src/modules/manufacturing/command/updateRouting.ts +3 -4
- package/src/modules/manufacturing/command/updateWorkCenter.test.ts +16 -7
- package/src/modules/manufacturing/command/updateWorkCenter.ts +41 -38
- package/src/modules/manufacturing/docs/commands/ActivateWorkCenter.md +2 -0
- package/src/modules/manufacturing/docs/commands/CompleteWorkOrder.md +2 -0
- package/src/modules/manufacturing/docs/commands/CreateBillOfMaterial.md +1 -0
- package/src/modules/manufacturing/docs/commands/ReviewManufacturingCostSummary.md +1 -0
- package/src/modules/manufacturing/docs/commands/UpdateWorkCenter.md +6 -5
- package/src/modules/manufacturing/docs/models/BillOfMaterialLine.md +42 -0
- package/src/modules/manufacturing/docs/models/CostVarianceLine.md +36 -0
- package/src/modules/manufacturing/docs/models/ManufacturingCostLine.md +37 -0
- package/src/modules/manufacturing/docs/models/ManufacturingCostSettlementRecord.md +34 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderBomSnapshot.md +35 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderCostBaseline.md +36 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderMaterialRequirement.md +35 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderRoutingSnapshot.md +34 -0
- package/src/modules/manufacturing/docs/models/RoutingOperation.md +40 -0
- package/src/modules/manufacturing/docs/models/WorkOrderExecutionEvent.md +38 -0
- package/src/modules/manufacturing/docs/queries/ExplodeBillOfMaterial.md +1 -0
- package/src/modules/manufacturing/docs/queries/ListWorkCentersBySite.md +1 -0
- package/src/modules/organization/command/updateCompany.test.ts +6 -6
- package/src/modules/organization/command/updateCompany.ts +3 -4
- package/src/modules/organization/command/updateDepartment.test.ts +7 -7
- package/src/modules/organization/command/updateDepartment.ts +13 -12
- package/src/modules/organization/command/updateSite.test.ts +10 -10
- package/src/modules/organization/command/updateSite.ts +3 -4
- package/src/modules/organization/docs/commands/UpdateCompany.md +6 -6
- package/src/modules/organization/docs/commands/UpdateDepartment.md +9 -10
- package/src/modules/organization/docs/commands/UpdateSite.md +12 -12
- package/src/modules/product-management/command/updateProduct.test.ts +17 -11
- package/src/modules/product-management/command/updateProduct.ts +45 -28
- package/src/modules/product-management/command/updateProductAttribute.test.ts +16 -21
- package/src/modules/product-management/command/updateProductAttribute.ts +40 -26
- package/src/modules/product-management/command/updateProductAttributeValue.ts +2 -3
- package/src/modules/product-management/command/updateProductCategory.test.ts +14 -19
- package/src/modules/product-management/command/updateProductCategory.ts +42 -26
- package/src/modules/product-management/docs/commands/UpdateProduct.md +16 -20
- package/src/modules/product-management/docs/commands/UpdateProductAttribute.md +10 -14
- package/src/modules/product-management/docs/commands/UpdateProductCategory.md +10 -14
- package/src/modules/purchase/command/updateGoodsReceipt.ts +2 -3
- package/src/modules/purchase/command/updatePurchaseBill.ts +2 -3
- package/src/modules/purchase/command/updatePurchaseOrder.ts +2 -3
- package/src/modules/purchase/command/updatePurchasePaymentTerm.ts +2 -3
- package/src/modules/purchase/command/updatePurchasePriceList.ts +2 -3
- package/src/modules/purchase/command/updatePurchasePriceRule.ts +2 -3
- package/src/modules/sales/command/updateChannel.test.ts +4 -4
- package/src/modules/sales/command/updateChannel.ts +2 -3
- package/src/modules/sales/command/updateListing.test.ts +2 -2
- package/src/modules/sales/command/updateListing.ts +2 -3
- package/src/modules/sales/command/updateSalesCreditNote.test.ts +2 -2
- package/src/modules/sales/command/updateSalesCreditNote.ts +2 -3
- package/src/modules/sales/command/updateSalesInvoice.test.ts +2 -2
- package/src/modules/sales/command/updateSalesInvoice.ts +2 -3
- package/src/modules/sales/command/updateSalesOrder.test.ts +3 -3
- package/src/modules/sales/command/updateSalesOrder.ts +2 -3
- package/src/modules/sales/command/updateSalesPaymentTerm.test.ts +2 -2
- package/src/modules/sales/command/updateSalesPaymentTerm.ts +2 -3
- package/src/modules/sales/command/updateSalesPriceList.test.ts +3 -3
- package/src/modules/sales/command/updateSalesPriceList.ts +2 -3
- package/src/modules/sales/command/updateSalesPriceRule.test.ts +3 -3
- package/src/modules/sales/command/updateSalesPriceRule.ts +2 -3
- package/src/modules/sales/command/updateShipment.test.ts +2 -2
- package/src/modules/sales/command/updateShipment.ts +2 -3
- package/src/modules/sales/docs/commands/UpdateChannel.md +4 -4
- package/src/modules/sales/docs/commands/UpdateListing.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesCreditNote.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesInvoice.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesOrder.md +3 -3
- package/src/modules/sales/docs/commands/UpdateSalesPaymentTerm.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesPriceList.md +3 -3
- package/src/modules/sales/docs/commands/UpdateSalesPriceRule.md +3 -3
- package/src/modules/sales/docs/commands/UpdateShipment.md +2 -2
- package/src/modules/user-management/README.md +2 -1
- package/src/modules/user-management/command/updateOwnProfile.generated.ts +6 -0
- package/src/modules/user-management/command/updateOwnProfile.test.ts +191 -0
- package/src/modules/user-management/command/updateOwnProfile.ts +82 -0
- package/src/modules/user-management/command/updateUser.generated.ts +6 -0
- package/src/modules/user-management/command/updateUser.test.ts +195 -0
- package/src/modules/user-management/command/updateUser.ts +76 -0
- package/src/modules/user-management/docs/commands/UpdateOwnProfile.md +68 -0
- package/src/modules/user-management/docs/commands/UpdateUser.md +67 -0
- package/src/modules/user-management/docs/features/user-account-management.md +28 -3
- package/src/modules/user-management/docs/models/User.md +2 -0
- package/src/modules/user-management/lib/errors.generated.ts +5 -0
- package/src/modules/user-management/lib/permissions.generated.ts +2 -0
- package/src/modules/user-management/module.ts +5 -0
- package/src/modules/user-management/seed/index.ts +19 -0
- package/templates/scaffold/app/backend/seed/data/AuditEntry.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/AuditPolicy.jsonl +7 -0
- package/templates/scaffold/app/backend/seed/data/AuditPolicy.schema.ts +15 -0
- package/templates/scaffold/app/backend/seed/data/AuditableEntity.jsonl +4 -0
- package/templates/scaffold/app/backend/seed/data/AuditableEntity.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/ChangeDetail.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/Company.schema.ts +15 -0
- package/templates/scaffold/app/backend/seed/data/Permission.jsonl +13 -0
- package/templates/scaffold/app/backend/seed/data/Permission.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/PolicyFieldRule.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/Role.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/Role.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/RolePermission.jsonl +13 -0
- package/templates/scaffold/app/backend/seed/data/RolePermission.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/User.jsonl +1 -1
- package/templates/scaffold/app/backend/seed/data/User.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/UserRole.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/UserRole.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/_User.jsonl +1 -1
- package/templates/scaffold/app/backend/seed/exec.mjs +12 -0
- package/templates/scaffold/app/backend/src/executors/permissionCreated.ts +2 -2
- package/templates/scaffold/app/backend/src/executors/permissionDeleted.ts +2 -2
- package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +62 -0
- package/templates/scaffold/app/backend/src/modules-db.ts +13 -0
- package/templates/scaffold/app/backend/src/modules.ts +3 -5
- package/templates/scaffold/app/backend/src/resolvers/assignPermissionToRole.ts +70 -0
- package/templates/scaffold/app/backend/src/resolvers/assignRoleToUser.ts +72 -0
- package/templates/scaffold/app/backend/src/resolvers/createRole.ts +92 -0
- package/templates/scaffold/app/backend/src/resolvers/createUser.ts +113 -13
- package/templates/scaffold/app/backend/src/resolvers/deactivateUser.ts +67 -0
- package/templates/scaffold/app/backend/src/resolvers/reactivateUser.ts +63 -0
- package/templates/scaffold/app/backend/src/resolvers/revokePermissionFromRole.ts +72 -0
- package/templates/scaffold/app/backend/src/resolvers/revokeRoleFromUser.ts +72 -0
- package/templates/scaffold/app/backend/src/resolvers/updateOwnProfile.ts +107 -0
- package/templates/scaffold/app/backend/src/resolvers/updateUserProfile.ts +107 -0
- package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log-detail.test.ts +79 -0
- package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log.test.ts +86 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--assign-role-to-user.test.ts +103 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--create-role.test.ts +61 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--remove-role-from-user.test.ts +89 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--update-role-permissions.test.ts +125 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--browse-user-list.test.ts +91 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--create-user-account.test.ts +97 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--toggle-user-status.test.ts +131 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-own-profile.test.ts +85 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-user-profile.test.ts +158 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-own-profile.test.ts +30 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-user-detail.test.ts +98 -0
- package/templates/scaffold/app/backend/tailor.config.ts +6 -2
- package/templates/scaffold/app/docs/actors/user.md +11 -0
- package/templates/scaffold/app/docs/business-flow/audit-log/README.md +31 -0
- package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log-detail.md +35 -0
- package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log.md +44 -0
- package/templates/scaffold/app/docs/business-flow/role-management/README.md +33 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--assign-role-to-user.md +35 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--create-role.md +41 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--remove-role-from-user.md +33 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--update-role-permissions.md +41 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/README.md +48 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--browse-user-list.md +38 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--create-user-account.md +45 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--toggle-user-status.md +38 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-own-profile.md +36 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-user-profile.md +41 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-own-profile.md +30 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-user-detail.md +33 -0
- package/templates/scaffold/app/docs/resolver/assignPermissionToRole.md +16 -0
- package/templates/scaffold/app/docs/resolver/assignRoleToUser.md +17 -0
- package/templates/scaffold/app/docs/resolver/createRole.md +17 -0
- package/templates/scaffold/app/docs/resolver/createUser.md +23 -0
- package/templates/scaffold/app/docs/resolver/deactivateUser.md +17 -0
- package/templates/scaffold/app/docs/resolver/reactivateUser.md +16 -0
- package/templates/scaffold/app/docs/resolver/revokePermissionFromRole.md +17 -0
- package/templates/scaffold/app/docs/resolver/revokeRoleFromUser.md +17 -0
- package/templates/scaffold/app/docs/resolver/updateOwnProfile.md +20 -0
- package/templates/scaffold/app/docs/resolver/updateUserProfile.md +19 -0
- package/templates/scaffold/app/docs/screen/audit-entry-detail.md +30 -0
- package/templates/scaffold/app/docs/screen/audit-entry-list.md +25 -0
- package/templates/scaffold/app/docs/screen/my-profile-edit-form.md +22 -0
- package/templates/scaffold/app/docs/screen/my-profile.md +27 -0
- package/templates/scaffold/app/docs/screen/role-create-form.md +23 -0
- package/templates/scaffold/app/docs/screen/role-detail.md +27 -0
- package/templates/scaffold/app/docs/screen/role-edit-form.md +21 -0
- package/templates/scaffold/app/docs/screen/role-list.md +23 -0
- package/templates/scaffold/app/docs/screen/user-create-form.md +23 -0
- package/templates/scaffold/app/docs/screen/user-detail.md +33 -0
- package/templates/scaffold/app/docs/screen/user-edit-form.md +22 -0
- package/templates/scaffold/app/docs/screen/user-list.md +24 -0
- package/templates/scaffold/app/frontend/package.json +1 -1
- package/templates/scaffold/app/frontend/src/App.tsx +4 -0
- package/templates/scaffold/app/frontend/src/components/composed/error-fallback.tsx +1 -1
- package/templates/scaffold/app/frontend/src/graphql/generated/graphql-env.d.ts +59 -31
- package/templates/scaffold/app/frontend/src/graphql/generated/schema.graphql +1411 -688
- package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +1 -1
- package/templates/scaffold/app/frontend/src/lib/permission-groups.ts +59 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/[id]/components/audit-entry-detail.tsx +102 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/[id]/page.tsx +65 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/components/audit-entries-table.tsx +90 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/page.tsx +52 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/components/edit-profile-form.tsx +125 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/page.tsx +41 -21
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-actions.tsx +26 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-detail.tsx +69 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/components/edit-role-form.tsx +192 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/page.tsx +51 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/page.tsx +56 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/components/roles-table.tsx +85 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/create/components/create-role-form.tsx +204 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/create/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/page.tsx +60 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-actions.tsx +216 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-detail.tsx +97 -33
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/components/edit-user-form.tsx +115 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/page.tsx +51 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/page.tsx +8 -2
- package/templates/scaffold/app/frontend/src/pages/user-management/user/components/users-table.tsx +43 -42
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +120 -45
- package/templates/scaffold/app/frontend/src/pages/user-management/user/page.tsx +3 -4
- package/templates/scaffold/app/frontend/src/providers/graphql-provider.tsx +8 -1
- package/templates/scaffold/module/eslint.config.js +8 -0
- package/templates/scaffold/project/__dot__gitignore +1 -0
- package/templates/scaffold/project/__pnpm-workspace.yaml +3 -0
- package/templates/scaffold/project/apps/.gitkeep +0 -0
- package/templates/scaffold/project/modules/.gitkeep +0 -0
- package/templates/scaffold/project/package.json +15 -0
- package/templates/workflows/erp-kit-check.yml +10 -4
- package/templates/scaffold/app/frontend/src/components/ui/badge.tsx +0 -39
- package/templates/scaffold/app/frontend/src/components/ui/button.tsx +0 -60
- package/templates/scaffold/app/frontend/src/components/ui/card.tsx +0 -75
- package/templates/scaffold/app/frontend/src/components/ui/input.tsx +0 -21
- package/templates/scaffold/app/frontend/src/components/ui/table.tsx +0 -90
- /package/src/modules/{supplier-portal → accounting/executor}/.gitkeep +0 -0
- /package/templates/scaffold/app/{docs/actors/.gitkeep → backend/seed/data/AuditEntry.jsonl} +0 -0
- /package/templates/scaffold/app/{docs/business-flow/.gitkeep → backend/seed/data/ChangeDetail.jsonl} +0 -0
- /package/templates/scaffold/app/{docs/resolver/.gitkeep → backend/seed/data/Company.jsonl} +0 -0
- /package/templates/scaffold/app/{docs/screen/.gitkeep → backend/seed/data/PolicyFieldRule.jsonl} +0 -0
- /package/templates/{config → scaffold/project}/license.config.json +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Internal Order Management
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Internal Order Management provides the ability to create and manage internal orders that serve as temporary cost collectors for tracking expenses associated with specific short-to-medium-term activities such as projects, marketing campaigns, R&D initiatives, and corporate events. Unlike cost centers, which are permanent organizational units for ongoing cost accumulation, internal orders are purpose-bound objects with a defined lifecycle that begins at creation and ends at closure once costs have been fully reviewed.
|
|
6
|
+
|
|
7
|
+
Each internal order carries a unique order number, an order type (OVERHEAD, INVESTMENT, or ACCRUAL), a description, responsible person, validity dates, and a reference to the responsible cost center within the company. Internal orders follow a four-stage lifecycle: CREATED, RELEASED, TECHNICALLY_COMPLETED, and CLOSED. Cost postings are only permitted while the order is in RELEASED status. Orders may optionally have a budget assigned to control spending limits. Settlement of internal order costs to receivers (such as cost centers, fixed assets, or other orders) is out of scope for this feature and will be addressed in a dedicated settlement feature.
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
Organizations need internal orders to isolate and monitor costs for discrete activities that cut across the permanent cost center structure:
|
|
12
|
+
|
|
13
|
+
- **Activity-based cost tracking**: Internal orders allow organizations to accumulate costs for specific initiatives (e.g., a trade show, an IT migration project, or a product launch campaign) independently of the department-level cost center hierarchy, providing precise visibility into activity-level spending
|
|
14
|
+
- **Order type classification**: Categorizing orders as OVERHEAD, INVESTMENT, or ACCRUAL mirrors SAP's internal order type model and enables differentiated handling — overhead orders track general expenses, investment orders capitalize costs into fixed assets, and accrual orders manage periodic cost deferrals
|
|
15
|
+
- **Lifecycle gating**: The four-stage lifecycle (CREATED -> RELEASED -> TECHNICALLY_COMPLETED -> CLOSED) ensures that cost postings are only accepted during the appropriate window, preventing premature charges to orders still in setup and accidental postings to orders under final review or already archived
|
|
16
|
+
- **Budget control**: Optional budget assignment to internal orders enables organizations to set spending limits for activities and monitor actual costs against planned budgets, supporting proactive cost governance
|
|
17
|
+
- **Responsible cost center linkage**: Each internal order references a responsible cost center, establishing organizational accountability and ensuring that activity costs can be traced back to the department or unit that owns the initiative
|
|
18
|
+
- **Temporal scoping**: Validity dates (valid-from and valid-to) define the time window during which the order is relevant, supporting planning and ensuring that postings outside the validity period are flagged or rejected
|
|
19
|
+
- **Company-scoped isolation**: Internal orders are scoped to a company, ensuring that cost data for different legal entities remains fully separated
|
|
20
|
+
|
|
21
|
+
## Process Flow
|
|
22
|
+
|
|
23
|
+
```mermaid
|
|
24
|
+
stateDiagram-v2
|
|
25
|
+
[*] --> Created: createInternalOrder
|
|
26
|
+
Created --> Released: releaseInternalOrder
|
|
27
|
+
Released --> TechnicallyCompleted: technicallyCompleteInternalOrder
|
|
28
|
+
TechnicallyCompleted --> Closed: closeInternalOrder
|
|
29
|
+
Created --> [*]: deleteInternalOrder
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```mermaid
|
|
33
|
+
flowchart TD
|
|
34
|
+
A[Identify activity requiring cost tracking] --> B[Create internal order with type, description, responsible person, and cost center]
|
|
35
|
+
B --> C{Assign budget?}
|
|
36
|
+
C -- Yes --> D[Link budget to internal order]
|
|
37
|
+
C -- No --> E[Internal order in CREATED status]
|
|
38
|
+
D --> E
|
|
39
|
+
E --> F[Release internal order]
|
|
40
|
+
F --> G[Costs posted against the order during activity execution]
|
|
41
|
+
G --> H{Activity complete?}
|
|
42
|
+
H -- No --> G
|
|
43
|
+
H -- Yes --> I[Technically complete the order]
|
|
44
|
+
I --> J[Final review of accumulated costs]
|
|
45
|
+
J --> K[Close the order]
|
|
46
|
+
K --> L[Order archived — no further changes]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```mermaid
|
|
50
|
+
flowchart TD
|
|
51
|
+
A[Cost posting request targets internal order] --> B{Order status is RELEASED?}
|
|
52
|
+
B -- No --> C[Reject posting — order not in RELEASED status]
|
|
53
|
+
B -- Yes --> D{Posting date within validity period?}
|
|
54
|
+
D -- No --> E[Reject posting — outside validity window]
|
|
55
|
+
D -- Yes --> F{Budget assigned?}
|
|
56
|
+
F -- Yes --> G{Posting within budget limit?}
|
|
57
|
+
G -- No --> H[Reject or warn — budget exceeded]
|
|
58
|
+
G -- Yes --> I[Accept cost posting]
|
|
59
|
+
F -- No --> I
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Scenario Patterns
|
|
63
|
+
|
|
64
|
+
- **Marketing Campaign Tracking**: The marketing department creates an OVERHEAD internal order to track all costs for a product launch campaign — agency fees, print materials, event venue, and travel. The order is released when planning is finalized, costs are posted throughout the campaign period, and the order is technically completed and closed once all invoices are settled and reviewed
|
|
65
|
+
- **Capital Investment Project**: An INVESTMENT internal order is created for a facility renovation project. Costs for construction, equipment, and consulting are accumulated on the order. Upon project completion, the order is technically completed and the accumulated costs are reviewed before closure (settlement to a fixed asset would occur in a future settlement feature)
|
|
66
|
+
- **R&D Initiative**: An R&D team creates an OVERHEAD internal order with a budget to track development costs for a prototype. The budget cap ensures the team stays within the approved spending limit. When the prototype phase ends, the order is technically completed and costs are reviewed against the budget before closure
|
|
67
|
+
- **Corporate Event**: An internal order is created for an annual company conference. Costs for venue rental, catering, speakers, and logistics are posted during the event planning and execution phases. After the event, the order is technically completed, final costs are reconciled, and the order is closed
|
|
68
|
+
- **Accrual Order for Periodic Costs**: An ACCRUAL internal order is created to manage deferred cost recognition for an annual software license paid upfront. The order tracks the periodic accrual postings over the license term
|
|
69
|
+
- **Order Deletion Before Release**: A planned initiative is cancelled before any costs are incurred. The internal order, still in CREATED status, is deleted rather than progressed through the full lifecycle
|
|
70
|
+
- **Budget Overrun Prevention**: A project manager attempts to post costs to an internal order that would exceed the assigned budget. The system rejects the posting, prompting the manager to request a budget increase or reallocate costs to a different order
|
|
71
|
+
|
|
72
|
+
## Test Cases
|
|
73
|
+
|
|
74
|
+
- Internal order lifecycle follows CREATED -> RELEASED -> TECHNICALLY_COMPLETED -> CLOSED state machine
|
|
75
|
+
- Internal order can only be created in CREATED status
|
|
76
|
+
- Internal order requires a valid order type (OVERHEAD, INVESTMENT, ACCRUAL)
|
|
77
|
+
- Internal order requires a unique order number within the company scope
|
|
78
|
+
- Internal order requires a description
|
|
79
|
+
- Internal order requires a responsible person
|
|
80
|
+
- Internal order must reference a valid companyId; the company must be in ACTIVE status
|
|
81
|
+
- Internal order must reference a valid responsible cost center within the same company
|
|
82
|
+
- Internal order validity dates (valid-from, valid-to) are optional; when both are provided, valid-from must precede valid-to
|
|
83
|
+
- Budget assignment to an internal order is optional
|
|
84
|
+
- When a budget is assigned, the budget entity must exist and belong to the same company
|
|
85
|
+
- Releasing an internal order transitions its status from CREATED to RELEASED
|
|
86
|
+
- Only CREATED orders can be released; releasing a RELEASED, TECHNICALLY_COMPLETED, or CLOSED order fails with an invalid status transition error
|
|
87
|
+
- Cost postings are only accepted when the internal order is in RELEASED status
|
|
88
|
+
- Cost postings to an order in CREATED, TECHNICALLY_COMPLETED, or CLOSED status are rejected
|
|
89
|
+
- Technically completing an internal order transitions its status from RELEASED to TECHNICALLY_COMPLETED
|
|
90
|
+
- Only RELEASED orders can be technically completed; technically completing a CREATED or CLOSED order fails with an invalid status transition error
|
|
91
|
+
- Closing an internal order transitions its status from TECHNICALLY_COMPLETED to CLOSED
|
|
92
|
+
- Only TECHNICALLY_COMPLETED orders can be closed; closing a CREATED or RELEASED order fails with an invalid status transition error
|
|
93
|
+
- CLOSED orders cannot transition to any other status
|
|
94
|
+
- Internal orders in CREATED status can be deleted
|
|
95
|
+
- Internal orders in RELEASED, TECHNICALLY_COMPLETED, or CLOSED status cannot be deleted
|
|
96
|
+
- Internal order fields (description, responsible person, cost center, validity dates) can be updated while the order is in CREATED or RELEASED status
|
|
97
|
+
- Internal order fields cannot be updated when the order is in TECHNICALLY_COMPLETED or CLOSED status
|
|
98
|
+
- Order type cannot be changed after the order is released
|
|
99
|
+
- Cost postings to an internal order with a budget must not exceed the assigned budget amount
|
|
100
|
+
- Cost postings that would exceed the budget are rejected with a budget exceeded error
|
|
101
|
+
- Internal orders are scoped to a company; orders from different companies are fully isolated
|
|
102
|
+
- Cost postings with a date outside the order's validity period (before valid-from or after valid-to) are rejected when validity dates are set
|
|
103
|
+
- Deleting an internal order in CREATED status removes the order and any associated budget assignment
|
|
104
|
+
- Creating an internal order without a responsible cost center reference fails validation
|
|
105
|
+
|
|
106
|
+
## Reference Links
|
|
107
|
+
|
|
108
|
+
- [SAP S/4HANA Internal Orders](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee3509643e954b3da2e0ebfa846c02e1/7ce4944ab36c11d3b44c006094b9ea64.html)
|
|
109
|
+
- [SAP Internal Order Types and Usage](https://help.sap.com/docs/SAP_ERP/3bbd1036dae74238a8e3aab669e0ea3f/2ad1e0af437411d189740000e8323492.html)
|
|
110
|
+
- [Oracle Fusion Project Costing — Cost Collection](https://docs.oracle.com/en/cloud/saas/project-management/24d/oapjm/cost-collection.html)
|
|
111
|
+
- [Odoo Analytic Accounts for Cost Tracking](https://www.odoo.com/documentation/19.0/applications/finance/accounting/reporting/analytic_accounting.html)
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Profit Center Management
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Profit Center Management provides the ability to create, maintain, and organize profit centers for internal profit and loss reporting within the accounting module. A profit center represents a discrete business segment — such as a product line, regional division, or service line — for which management can independently evaluate profitability. Each profit center carries a code, name, description, responsible person, validity period (valid-from/to), and an assignment to a profit center hierarchy node. Profit centers are scoped to a Company and follow a lifecycle from DRAFT through ACTIVE to INACTIVE.
|
|
6
|
+
|
|
7
|
+
Revenue and cost transactions posted in the finance-ledger are tagged with profit center assignments, enabling aggregation of income and expenses at the profit center level. Profit centers are organized into hierarchical groupings (ProfitCenterHierarchy) that form a tree structure, allowing roll-up reporting by business dimension such as region, product line, or service line. This hierarchical structure supports management analyses including return on investment (ROI), economic value added (EVA), and operating profit per segment. Profit centers are distinct from organizational units (sites, departments) managed by the organization module, but may optionally reference them for cross-dimensional reporting.
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
Organizations need profit centers to measure and manage the profitability of individual business segments independently:
|
|
12
|
+
|
|
13
|
+
- **Segment profitability analysis**: Profit centers enable management to evaluate revenue, costs, and profit/loss for each business segment, supporting informed strategic decisions about resource allocation and investment priorities
|
|
14
|
+
- **Hierarchical roll-up reporting**: The tree-structured profit center hierarchy allows aggregation of results from leaf-level profit centers up through intermediate grouping nodes to the enterprise level, supporting multi-dimensional analysis by region, product line, or service line
|
|
15
|
+
- **Internal P&L and balance sheet**: Profit centers serve as the primary dimension for generating internal profit and loss statements and, where applicable, segment balance sheets — going beyond cost center reporting which tracks only the expense side
|
|
16
|
+
- **ROI and EVA analysis**: By capturing both revenue and cost flows, profit centers provide the data foundation for return on investment, economic value added, and operating margin calculations at the segment level
|
|
17
|
+
- **Responsibility accounting**: Each profit center is assigned a responsible person, establishing clear accountability for the financial performance of that business segment
|
|
18
|
+
- **Validity period control**: Valid-from and valid-to dates ensure that profit centers are only available for transaction assignment during their intended operational period, preventing postings to retired or not-yet-active segments
|
|
19
|
+
- **Separation from organizational structure**: Profit centers are deliberately decoupled from the organizational hierarchy (sites, departments) to allow flexible, cross-cutting profitability views that do not depend on the legal or administrative structure
|
|
20
|
+
- **Transaction tagging for aggregation**: Revenue and cost transactions are tagged with profit center assignments at posting time, enabling automated aggregation without requiring separate ledger entries per segment
|
|
21
|
+
- **Cross-module ownership**: The organization and coa-management modules explicitly defer profit center ownership to the accounting module, establishing a single authoritative source for profit center master data
|
|
22
|
+
|
|
23
|
+
## Process Flow
|
|
24
|
+
|
|
25
|
+
```mermaid
|
|
26
|
+
stateDiagram-v2
|
|
27
|
+
[*] --> Draft: createProfitCenter
|
|
28
|
+
Draft --> Draft: updateProfitCenter
|
|
29
|
+
Draft --> Active: activateProfitCenter
|
|
30
|
+
Active --> Active: updateProfitCenter (limited fields)
|
|
31
|
+
Active --> Inactive: deactivateProfitCenter
|
|
32
|
+
Inactive --> Active: reactivateProfitCenter
|
|
33
|
+
Draft --> [*]: deleteProfitCenter
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```mermaid
|
|
37
|
+
flowchart TD
|
|
38
|
+
A[Identify business segment requiring profitability tracking] --> B[Create ProfitCenter in DRAFT status]
|
|
39
|
+
B --> C[Set code, name, description, responsible person, validity period]
|
|
40
|
+
C --> D{Profit center hierarchy exists?}
|
|
41
|
+
D -- No --> E[Create ProfitCenterHierarchy with root node]
|
|
42
|
+
E --> F[Add grouping nodes for business dimensions]
|
|
43
|
+
D -- Yes --> F
|
|
44
|
+
F --> G[Assign profit center to hierarchy node]
|
|
45
|
+
G --> H[Activate profit center]
|
|
46
|
+
H --> I[Profit center available for transaction tagging]
|
|
47
|
+
I --> J[Revenue and cost postings tagged with profit center]
|
|
48
|
+
J --> K[Aggregate P&L by profit center and hierarchy roll-up]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
```mermaid
|
|
52
|
+
flowchart TD
|
|
53
|
+
A[Define profit center hierarchy structure] --> B[Create hierarchy with root node]
|
|
54
|
+
B --> C[Add intermediate grouping nodes by dimension]
|
|
55
|
+
C --> D[Assign profit centers as leaf nodes]
|
|
56
|
+
D --> E{All segments covered?}
|
|
57
|
+
E -- No --> C
|
|
58
|
+
E -- Yes --> F[Hierarchy ready for roll-up reporting]
|
|
59
|
+
F --> G[Generate segment P&L at any hierarchy level]
|
|
60
|
+
G --> H[Drill down from group totals to individual profit centers]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Scenario Patterns
|
|
64
|
+
|
|
65
|
+
- **Regional Profit Center Setup**: A multinational company creates profit centers for each geographic region (North America, EMEA, APAC) and organizes them under a region-based hierarchy. Revenue and cost transactions are tagged with the appropriate regional profit center, enabling management to compare profitability across regions and identify underperforming markets
|
|
66
|
+
- **Product Line Profitability**: A manufacturing company creates profit centers for each product line (Consumer Electronics, Industrial Equipment, Spare Parts) under a product-based hierarchy. Sales revenue and production costs are assigned to the corresponding profit center, allowing product managers to track gross margins and operating profit per product line
|
|
67
|
+
- **Service Line Segmentation**: A professional services firm creates profit centers for each service offering (Consulting, Implementation, Managed Services) to separately measure revenue realization, utilization rates, and profitability. The hierarchy groups these under a single services division for consolidated reporting
|
|
68
|
+
- **Dual-Hierarchy Analysis**: A company maintains two profit center hierarchies — one by region and one by product line — to enable matrix reporting. The same set of profit centers can be analyzed along either dimension, supporting both geographic and product-oriented management views
|
|
69
|
+
- **Profit Center Retirement**: A business segment is discontinued. The responsible controller deactivates the profit center after the final posting period, ensuring no new transactions can be assigned to it while historical data remains available for comparative reporting
|
|
70
|
+
- **Cross-Departmental Profit Center**: A profit center spans multiple organizational departments (e.g., a product line served by both engineering and sales teams). Because profit centers are independent of the organizational hierarchy, revenue from sales and costs from engineering are both captured under the same profit center for unified profitability measurement
|
|
71
|
+
- **New Venture Tracking**: A company launches a new business initiative and creates a profit center in DRAFT status with a future valid-from date. Once the launch date arrives, the profit center is activated and begins receiving transaction assignments, allowing management to track the venture's financial performance from day one
|
|
72
|
+
- **Responsible Person Change**: The manager responsible for a profit center changes due to organizational restructuring. The responsible person field is updated on the active profit center, and the change is recorded in the audit trail for accountability tracking
|
|
73
|
+
|
|
74
|
+
## Test Cases
|
|
75
|
+
|
|
76
|
+
- Profit center lifecycle follows DRAFT -> ACTIVE -> INACTIVE state machine; inactive profit centers can be reactivated to ACTIVE
|
|
77
|
+
- Profit center can only be created in DRAFT status
|
|
78
|
+
- Profit center requires a unique code within the company scope
|
|
79
|
+
- Profit center requires a name
|
|
80
|
+
- Profit center must reference a valid companyId; the company must be in ACTIVE status
|
|
81
|
+
- Profit center description is optional and can be updated in DRAFT or ACTIVE status
|
|
82
|
+
- Profit center responsible person is optional and can be updated in DRAFT or ACTIVE status
|
|
83
|
+
- Valid-from date is required; valid-to date is optional
|
|
84
|
+
- Valid-to date, when specified, must be on or after the valid-from date
|
|
85
|
+
- Activating a DRAFT profit center transitions its status to ACTIVE
|
|
86
|
+
- Activating an already ACTIVE profit center fails with an invalid status transition error
|
|
87
|
+
- Deactivating an ACTIVE profit center transitions its status to INACTIVE
|
|
88
|
+
- Deactivating a DRAFT profit center fails with an invalid status transition error
|
|
89
|
+
- Reactivating an INACTIVE profit center transitions its status to ACTIVE
|
|
90
|
+
- DRAFT profit centers can be deleted; deletion removes the profit center and its hierarchy assignment
|
|
91
|
+
- ACTIVE profit centers cannot be deleted; they must be deactivated first
|
|
92
|
+
- INACTIVE profit centers cannot be deleted
|
|
93
|
+
- Profit center code cannot be changed after activation
|
|
94
|
+
- Only ACTIVE profit centers within their validity period can receive transaction assignments
|
|
95
|
+
- Transactions cannot be assigned to a DRAFT profit center
|
|
96
|
+
- Transactions cannot be assigned to an INACTIVE profit center
|
|
97
|
+
- Transactions cannot be assigned to a profit center outside its validity period (before valid-from or after valid-to)
|
|
98
|
+
- A profit center hierarchy can be created with a root node and a descriptive name
|
|
99
|
+
- Hierarchy nodes can be added as children of existing nodes, forming a tree structure
|
|
100
|
+
- A profit center can be assigned to exactly one node within a given hierarchy
|
|
101
|
+
- A profit center can be assigned to nodes in multiple hierarchies simultaneously
|
|
102
|
+
- Removing a hierarchy node that has child nodes is rejected; children must be reassigned or removed first
|
|
103
|
+
- Removing a hierarchy node that has profit centers assigned is rejected; profit centers must be reassigned first
|
|
104
|
+
- Hierarchy roll-up aggregates financial results from child nodes up to parent nodes
|
|
105
|
+
- Profit centers are scoped to a company; profit centers from different companies are fully isolated
|
|
106
|
+
- Profit center hierarchies are scoped to a company
|
|
107
|
+
- Creating a profit center emits an audit event recording the acting user, timestamp, and initial field values
|
|
108
|
+
- Updating a profit center emits an audit event recording previous and new field values
|
|
109
|
+
- Activating or deactivating a profit center emits an audit event recording the status transition and acting user
|
|
110
|
+
- Assigning or reassigning a profit center to a hierarchy node emits an audit event
|
|
111
|
+
- Profit centers are independent of organizational units (sites, departments) but may optionally reference an organizational unit
|
|
112
|
+
- Only users with appropriate permissions can create, activate, deactivate, or update profit centers
|
|
113
|
+
|
|
114
|
+
## Reference Links
|
|
115
|
+
|
|
116
|
+
- [SAP Profit Center Accounting](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee3509643e954b3da2e0ebfa846c02e1/4cae5a88ecaa7286e10000000a42189b.html)
|
|
117
|
+
- [SAP Profit Center Master Data](https://help.sap.com/docs/SAP_S4HANA_CLOUD/59463d9fe28a4e5f8b38557e1e2bafbb/577ab0e06d6d1014b3fc9283b0e91070.html)
|
|
118
|
+
- [Oracle Fusion Profit Center Reporting](https://docs.oracle.com/en/cloud/saas/financials/24d/oafcf/segment-reporting.html)
|
|
119
|
+
- [Odoo Analytic Accounting for Profit Centers](https://www.odoo.com/documentation/19.0/applications/finance/accounting/reporting/analytic_accounting.html)
|
|
120
|
+
- [NetSuite Department and Class Segmentation](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_N3444641.html)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Variance Analysis
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Variance Analysis is the management accounting capability of the accounting module that compares planned (budget) amounts against actual costs and revenues by cost object and accounting period. A VarianceReport entity captures the cost object reference (cost center, profit center, or internal order), the accounting period, report status (DRAFT or FINAL), and summary totals (total planned, total actual, total variance). Each VarianceReport contains one or more VarianceReportLine child records, each keyed by cost element and accounting period, that capture the planned amount, actual amount, computed variance amount, variance percentage, and variance direction (FAVORABLE or UNFAVORABLE). This cost-element-level detail enables managers to diagnose which cost types are driving deviations rather than only seeing aggregate totals. Actual amounts are sourced from posted journal entries in the finance-ledger module, aggregated by cost element, period, and cost object. Planned amounts are sourced from BudgetLineItems in the budget-management module, which use cost elements as their planning axis.
|
|
6
|
+
|
|
7
|
+
The feature follows a five-step workflow: collect actuals from posted journal entries, collect plan amounts from budget line items, calculate variance per cost element as the difference between actual and planned, categorize the variance direction based on account type, and generate a management report with detail lines. Variance reports are scoped to a Company and reference a specific AccountingPeriod. Reports can be generated at the individual cost object level or aggregated up cost center and profit center hierarchies. Variance analysis typically runs as a period-end process after all postings for the period are complete. Detailed variance categorization (input price, input quantity, volume, mix) and manufacturing-specific variances (price, usage, efficiency) are out of scope for this feature.
|
|
8
|
+
|
|
9
|
+
## Business Purpose
|
|
10
|
+
|
|
11
|
+
Organizations need systematic variance analysis to monitor financial performance against plans and enable timely corrective action:
|
|
12
|
+
|
|
13
|
+
- **Budget adherence monitoring**: Comparing actual costs and revenues against budgeted amounts by cost object reveals where spending is on track and where deviations require management attention
|
|
14
|
+
- **Favorable/unfavorable categorization**: Automatically classifying variances as favorable (actual costs below plan, or actual revenue above plan) or unfavorable (the inverse) provides immediate directional context for decision-makers without manual interpretation
|
|
15
|
+
- **Cost element detail**: VarianceReportLine records break down variances by cost element (salaries, travel, materials, etc.) within each cost object, enabling managers to identify exactly which cost type is driving deviations rather than only seeing an aggregate total — this is essential for actionable root-cause analysis
|
|
16
|
+
- **Cost object granularity**: Generating variance reports per cost center, profit center, or internal order allows managers to pinpoint exactly which organizational unit or project is driving deviations from plan
|
|
17
|
+
- **Hierarchy aggregation**: Rolling up variances along cost center and profit center hierarchies enables both detailed drill-down analysis and executive-level summary reporting in a single feature
|
|
18
|
+
- **Period-end management reporting**: Running variance analysis after all period postings are complete produces accurate, comprehensive reports that inform budget revisions, resource reallocation, and strategic decisions for subsequent periods
|
|
19
|
+
- **Variance quantification**: Calculating both absolute variance amounts and variance percentages allows managers to assess deviations in context — a large absolute variance on a small budget line signals a different issue than the same amount on a large budget line
|
|
20
|
+
- **Draft-to-final lifecycle**: The DRAFT to FINAL status progression allows controllers to review and validate variance reports before distributing them to management, preventing premature or incorrect reporting
|
|
21
|
+
|
|
22
|
+
## Process Flow
|
|
23
|
+
|
|
24
|
+
```mermaid
|
|
25
|
+
stateDiagram-v2
|
|
26
|
+
[*] --> CollectActuals: initiateVarianceAnalysis
|
|
27
|
+
CollectActuals --> CollectPlan: actuals aggregated
|
|
28
|
+
CollectPlan --> CalculateVariance: plan amounts retrieved
|
|
29
|
+
CalculateVariance --> Categorize: variance computed
|
|
30
|
+
Categorize --> GenerateReport: direction assigned
|
|
31
|
+
GenerateReport --> [*]: VarianceReport created (DRAFT)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```mermaid
|
|
35
|
+
flowchart TD
|
|
36
|
+
A[Period-end: all postings complete] --> B[Collect actual amounts from posted journal entries]
|
|
37
|
+
B --> C[Aggregate actuals by cost element + cost object + period]
|
|
38
|
+
C --> D[Collect planned amounts from budget-management BudgetLineItems by cost element]
|
|
39
|
+
D --> E[Match actuals to plan by cost element, cost object, and period]
|
|
40
|
+
E --> F[Calculate variance per cost element: Actual - Planned]
|
|
41
|
+
F --> G{Account type?}
|
|
42
|
+
G -- Cost/Expense --> H{Actual < Planned?}
|
|
43
|
+
H -- Yes --> I[FAVORABLE]
|
|
44
|
+
H -- No --> J[UNFAVORABLE]
|
|
45
|
+
G -- Revenue --> K{Actual > Planned?}
|
|
46
|
+
K -- Yes --> L[FAVORABLE]
|
|
47
|
+
K -- No --> M[UNFAVORABLE]
|
|
48
|
+
I --> N[Compute variance percentage]
|
|
49
|
+
J --> N
|
|
50
|
+
L --> N
|
|
51
|
+
M --> N
|
|
52
|
+
N --> O[Create VarianceReportLine per cost element]
|
|
53
|
+
O --> O2[Create VarianceReport in DRAFT with summary totals and detail lines]
|
|
54
|
+
O2 --> P{Review and validate}
|
|
55
|
+
P -- Approved --> Q[Finalize report: status FINAL]
|
|
56
|
+
P -- Issues found --> R[Investigate and correct source data]
|
|
57
|
+
R --> A
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
```mermaid
|
|
61
|
+
flowchart TD
|
|
62
|
+
A[Select reporting scope] --> B{Report level?}
|
|
63
|
+
B -- Individual cost object --> C[Generate report for single cost center / profit center / internal order]
|
|
64
|
+
B -- Hierarchy --> D[Retrieve child cost objects from hierarchy]
|
|
65
|
+
D --> E[Generate individual reports per child]
|
|
66
|
+
E --> F[Aggregate variances up hierarchy levels]
|
|
67
|
+
F --> G[Produce consolidated hierarchy report]
|
|
68
|
+
C --> H[VarianceReport ready for review]
|
|
69
|
+
G --> H
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Scenario Patterns
|
|
73
|
+
|
|
74
|
+
- **Monthly cost center review**: At month-end close, the controller initiates variance analysis for all cost centers within a company for the current accounting period. The system collects posted journal entry totals by cost center, retrieves corresponding budget line items, computes variances, and generates DRAFT variance reports. The controller reviews and finalizes each report before distributing to cost center managers
|
|
75
|
+
- **Profit center profitability check**: A division head requests a variance report for their profit center to compare actual revenue and costs against the annual plan. The report's detail lines show revenue above plan (FAVORABLE) but the material cost element significantly above plan (UNFAVORABLE), enabling the manager to pinpoint supplier pricing changes as the root cause without needing a separate drill-down report
|
|
76
|
+
- **Internal order cost overrun detection**: A project manager reviews the variance report for an internal order representing a capital project. The report reveals actual spending at 120% of the planned amount with two periods remaining, triggering a budget revision request and scope review
|
|
77
|
+
- **Hierarchy roll-up for executive reporting**: The CFO requests a consolidated variance report across all profit centers. The system generates individual profit center variance reports and then aggregates them up the profit center hierarchy, producing a company-level summary showing total planned vs. actual with net variance amounts and percentages
|
|
78
|
+
- **Cross-period trend analysis**: A controller generates variance reports for the same cost center across multiple consecutive periods to identify whether an unfavorable variance is a one-time event or a recurring trend, informing whether a structural budget adjustment is needed
|
|
79
|
+
- **Revenue variance investigation**: A sales manager receives a variance report showing actual revenue below plan (UNFAVORABLE) for their profit center. The variance percentage of -15% triggers a review of sales pipeline and customer order patterns to understand the shortfall
|
|
80
|
+
- **Period-end sequential processing**: The accounting team completes all journal entry postings and subledger reconciliations for the period, then runs variance analysis as the final step before period close. This sequence ensures variance reports reflect the complete and accurate financial picture for the period
|
|
81
|
+
|
|
82
|
+
## Test Cases
|
|
83
|
+
|
|
84
|
+
- Variance report can only be created for a valid Company that is in ACTIVE status
|
|
85
|
+
- Variance report must reference a valid AccountingPeriod
|
|
86
|
+
- Variance report must reference a valid cost object (cost center, profit center, or internal order)
|
|
87
|
+
- Variance report is created in DRAFT status
|
|
88
|
+
- Variance report can transition from DRAFT to FINAL
|
|
89
|
+
- Variance report in FINAL status cannot be transitioned back to DRAFT
|
|
90
|
+
- A VarianceReport contains one or more VarianceReportLine child records, each keyed by cost element and accounting period
|
|
91
|
+
- Each VarianceReportLine records: cost element reference, accounting period, planned amount, actual amount, variance amount, variance percentage, and variance direction
|
|
92
|
+
- VarianceReport summary totals (total planned, total actual, total variance) are computed from the sum of its detail lines
|
|
93
|
+
- Variance amount on each VarianceReportLine is calculated as actual amount minus planned amount
|
|
94
|
+
- Variance percentage on each VarianceReportLine is calculated as (actual - planned) / planned * 100
|
|
95
|
+
- When planned amount is zero and actual amount is non-zero on a detail line, variance percentage is handled gracefully (not division by zero)
|
|
96
|
+
- For cost/expense cost elements, variance direction is FAVORABLE when actual amount is less than planned amount
|
|
97
|
+
- For cost/expense cost elements, variance direction is UNFAVORABLE when actual amount is greater than planned amount
|
|
98
|
+
- For revenue cost elements, variance direction is FAVORABLE when actual amount is greater than planned amount
|
|
99
|
+
- For revenue cost elements, variance direction is UNFAVORABLE when actual amount is less than planned amount
|
|
100
|
+
- When actual equals planned on a detail line, variance amount is zero and variance direction is FAVORABLE
|
|
101
|
+
- Actual amounts are sourced exclusively from POSTED journal entries in the finance-ledger module
|
|
102
|
+
- DRAFT journal entries are excluded from actual amount aggregation
|
|
103
|
+
- Actual amounts are aggregated by cost element, cost object, and accounting period
|
|
104
|
+
- Planned amounts are sourced from BudgetLineItems in the budget-management module, matched by cost element
|
|
105
|
+
- A variance report cannot be generated if no budget line items exist for the specified cost object and period
|
|
106
|
+
- A VarianceReportLine is created for each cost element that has either a planned amount or an actual amount (or both)
|
|
107
|
+
- A cost element with actual postings but no corresponding budget line item generates a detail line with zero planned amount
|
|
108
|
+
- Variance reports for cost centers aggregate all journal lines assigned to that cost center in the given period, grouped by cost element
|
|
109
|
+
- Variance reports for profit centers aggregate all journal lines assigned to that profit center in the given period, grouped by cost element
|
|
110
|
+
- Variance reports for internal orders aggregate all journal lines assigned to that internal order in the given period, grouped by cost element
|
|
111
|
+
- Hierarchy aggregation for cost centers sums child cost center variances into the parent cost center report
|
|
112
|
+
- Hierarchy aggregation for profit centers sums child profit center variances into the parent profit center report
|
|
113
|
+
- Hierarchy-aggregated reports include both the individual child variances and the consolidated parent totals
|
|
114
|
+
- A DRAFT variance report can be updated (e.g., to correct a cost object reference) before finalization
|
|
115
|
+
- A FINAL variance report cannot be modified
|
|
116
|
+
- Generating a variance report for a period with no posted journal entries results in zero actual amounts
|
|
117
|
+
- Variance reports are scoped to a single company; data from other companies is excluded
|
|
118
|
+
- Multiple variance reports can exist for the same cost object across different accounting periods
|
|
119
|
+
- Regenerating a variance report for the same cost object and period replaces the existing DRAFT report
|
|
120
|
+
- A FINAL variance report is not overwritten by regeneration; a new DRAFT is created alongside it if source data changes
|
|
121
|
+
- Variance report includes both the absolute variance amount and the variance percentage
|
|
122
|
+
- Variance report records the variance direction as either FAVORABLE or UNFAVORABLE
|
|
123
|
+
|
|
124
|
+
## Reference Links
|
|
125
|
+
|
|
126
|
+
- [SAP S/4HANA Variance Analysis in Controlling](https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee3509643e954b3da2e0ebfa846c02e1/b33fa239f4d446e9a6c8a585c4e148c8.html)
|
|
127
|
+
- [Oracle Fusion Budgetary Control and Variance Reporting](https://docs.oracle.com/en/cloud/saas/financials/24d/oafcf/budgetary-control.html)
|
|
128
|
+
- [Odoo Budget Management and Analysis](https://www.odoo.com/documentation/19.0/applications/finance/accounting/reporting/budget.html)
|
|
129
|
+
- [NetSuite Budget vs. Actual Reporting](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_N1584498.html)
|
|
130
|
+
- [CIMA Management Accounting Variance Analysis](https://www.cimaglobal.com/resources/)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# AllocationCycle
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
AllocationCycle is the controlling entity that groups a set of allocation rules for distributing overhead costs from sender cost centers to receiver cost objects (cost centers, profit centers, or internal orders). Each cycle carries a name, allocation type (ASSESSMENT or DISTRIBUTION), company scope, accounting period reference, and a status. Assessment-type allocations post using secondary cost elements, aggregating original cost elements into a single overhead category on the receiver. Distribution-type allocations preserve the original primary cost elements on the receiver side for full cost transparency. Allocation cycles progress through a controlled lifecycle — DRAFT, VALIDATED, EXECUTED, POSTED, and optionally REVERSED — ensuring allocations are reviewed and tested before affecting the general ledger.
|
|
6
|
+
|
|
7
|
+
## Domain Model Definitions
|
|
8
|
+
|
|
9
|
+
### Model type
|
|
10
|
+
|
|
11
|
+
Stateful
|
|
12
|
+
|
|
13
|
+
#### State Transitions
|
|
14
|
+
|
|
15
|
+
```mermaid
|
|
16
|
+
stateDiagram-v2
|
|
17
|
+
[*] --> Draft: createAllocationCycle
|
|
18
|
+
Draft --> Draft: updateAllocationCycle / createAllocationRule / deleteAllocationRule
|
|
19
|
+
Draft --> Validated: validateAllocationCycle
|
|
20
|
+
Validated --> Draft: invalidateAllocationCycle
|
|
21
|
+
Validated --> Executed: executeAllocationCycle (ACTUAL)
|
|
22
|
+
Executed --> Posted: postAllocationCycle
|
|
23
|
+
Posted --> Reversed: reverseAllocationCycle
|
|
24
|
+
Draft --> [*]: deleteAllocationCycle
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Command Definitions
|
|
28
|
+
|
|
29
|
+
- [createAllocationCycle](../commands/CreateAllocationCycle.md) - Create a new allocation cycle in DRAFT status with type, name, company, and accounting period
|
|
30
|
+
- [updateAllocationCycle](../commands/UpdateAllocationCycle.md) - Update mutable fields of a DRAFT allocation cycle (name)
|
|
31
|
+
- [validateAllocationCycle](../commands/ValidateAllocationCycle.md) - Validate a DRAFT cycle, verifying all rules have percentages summing to 100% per sender
|
|
32
|
+
- [invalidateAllocationCycle](../commands/InvalidateAllocationCycle.md) - Return a VALIDATED cycle to DRAFT for further editing
|
|
33
|
+
- [executeAllocationCycle](../commands/ExecuteAllocationCycle.md) - Execute a VALIDATED cycle in ACTUAL mode, creating immutable allocation result records
|
|
34
|
+
- [postAllocationCycle](../commands/PostAllocationCycle.md) - Post an EXECUTED cycle, creating journal entries through finance-ledger subledger integration
|
|
35
|
+
- [reverseAllocationCycle](../commands/ReverseAllocationCycle.md) - Reverse a POSTED cycle by creating reversal journal entries with inverted amounts
|
|
36
|
+
- [deleteAllocationCycle](../commands/DeleteAllocationCycle.md) - Delete a DRAFT allocation cycle and its associated rules
|
|
37
|
+
- [createAllocationRule](../commands/CreateAllocationRule.md) - Add an allocation rule to a DRAFT cycle defining sender, receiver, and percentage
|
|
38
|
+
- [deleteAllocationRule](../commands/DeleteAllocationRule.md) - Remove an allocation rule from a DRAFT cycle
|
|
39
|
+
|
|
40
|
+
### Query Definitions
|
|
41
|
+
|
|
42
|
+
- [GetAllocationCycle](../queries/GetAllocationCycle.md) - Retrieve an allocation cycle by id with its rules and results
|
|
43
|
+
- [ListAllocationCycles](../queries/ListAllocationCycles.md) - List allocation cycles with filters (type, status, company, period)
|
|
44
|
+
|
|
45
|
+
### Models
|
|
46
|
+
|
|
47
|
+
- AllocationCycle
|
|
48
|
+
- AllocationRule
|
|
49
|
+
- AllocationResult
|
|
50
|
+
|
|
51
|
+
### Invariants
|
|
52
|
+
|
|
53
|
+
- Allocation cycle can only be created in DRAFT status
|
|
54
|
+
- Allocation cycle requires a valid type (ASSESSMENT or DISTRIBUTION)
|
|
55
|
+
- Allocation cycle requires a valid name
|
|
56
|
+
- Allocation cycle must reference a valid companyId; the company must be in ACTIVE status
|
|
57
|
+
- Allocation cycle must reference a valid accounting period
|
|
58
|
+
- Allocation rules can only be added to or removed from a DRAFT cycle
|
|
59
|
+
- Allocation rule percentages for a given sender must sum to exactly 100%
|
|
60
|
+
- Allocation rule percentage values must be positive (greater than zero)
|
|
61
|
+
- A sender cost center cannot also appear as a receiver within the same allocation rule set
|
|
62
|
+
- Validating a cycle with no allocation rules fails
|
|
63
|
+
- A VALIDATED cycle can be returned to DRAFT for further editing
|
|
64
|
+
- Executing a cycle that is not in VALIDATED status fails
|
|
65
|
+
- Execution in ACTUAL mode creates immutable AllocationResult records
|
|
66
|
+
- Posting transitions the cycle from EXECUTED to POSTED, creating journal entries
|
|
67
|
+
- Assessment-type allocation postings use secondary cost elements in the generated journal entries
|
|
68
|
+
- Distribution-type allocation postings preserve the original primary cost elements in the generated journal entries
|
|
69
|
+
- Posting an allocation cycle to a CLOSED or PERMANENTLY_CLOSED period is rejected
|
|
70
|
+
- Reversing a POSTED cycle creates reversal journal entries with inverted amounts
|
|
71
|
+
- A REVERSED cycle cannot be reversed again
|
|
72
|
+
- Updating allocation cycle fields is only permitted while in DRAFT status
|
|
73
|
+
- Deleting an allocation cycle is only permitted while in DRAFT status
|
|
74
|
+
- Allocation cycles are scoped to a company; cycles from different companies are fully isolated
|
|
75
|
+
|
|
76
|
+
### Relationships
|
|
77
|
+
|
|
78
|
+
- **References Company**: Each allocation cycle is scoped to a Company via companyId (organization module)
|
|
79
|
+
- **References AccountingPeriod**: Each allocation cycle references an AccountingPeriod via accountingPeriodId (finance-ledger module)
|
|
80
|
+
- **Has Many AllocationRule**: An allocation cycle contains one or more allocation rules defining sender-receiver-percentage mappings
|
|
81
|
+
- **Has Many AllocationResult**: An executed allocation cycle produces immutable allocation result records
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# AllocationResult
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
AllocationResult is an immutable record produced when an allocation cycle is executed in ACTUAL mode, capturing the outcome of a single sender-receiver cost distribution. Each result carries an allocation cycle reference, sender cost center reference, receiver type, receiver id, allocated amount, and cost element reference. Allocation results serve as the authoritative audit trail for cost allocations, linking the cycle, sender, receiver, allocated amount, and cost element used. Once created, allocation result records cannot be modified or deleted — corrections are handled exclusively through cycle reversal and re-execution.
|
|
6
|
+
|
|
7
|
+
## Domain Model Definitions
|
|
8
|
+
|
|
9
|
+
### Model type
|
|
10
|
+
|
|
11
|
+
AppendOnly
|
|
12
|
+
|
|
13
|
+
### Command Definitions
|
|
14
|
+
|
|
15
|
+
- [executeAllocationCycle](../commands/ExecuteAllocationCycle.md) - Allocation results are created as part of executing an allocation cycle in ACTUAL mode
|
|
16
|
+
|
|
17
|
+
### Query Definitions
|
|
18
|
+
|
|
19
|
+
- [GetAllocationCycle](../queries/GetAllocationCycle.md) - Retrieve allocation results as part of the parent allocation cycle
|
|
20
|
+
|
|
21
|
+
### Models
|
|
22
|
+
|
|
23
|
+
- AllocationResult
|
|
24
|
+
|
|
25
|
+
### Invariants
|
|
26
|
+
|
|
27
|
+
- Allocation results are created exclusively during allocation cycle execution in ACTUAL mode
|
|
28
|
+
- Allocation results cannot be modified or deleted after creation
|
|
29
|
+
- Each allocation result references the allocation cycle, sender, receiver, allocated amount, and cost element used
|
|
30
|
+
- Allocation results serve as the immutable audit trail for cost allocations
|
|
31
|
+
|
|
32
|
+
### Relationships
|
|
33
|
+
|
|
34
|
+
- **Belongs to AllocationCycle**: Each allocation result belongs to an AllocationCycle via allocationCycleId
|
|
35
|
+
- **References CostCenter (sender)**: Each allocation result references a sender CostCenter via senderCostCenterId
|
|
36
|
+
- **Polymorphic Receiver**: Each allocation result references a receiver via receiverType and receiverId, which can be a CostCenter, ProfitCenter, or InternalOrder
|
|
37
|
+
- **References CostElement**: Each allocation result references a CostElement via costElementId
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# AllocationRule
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
AllocationRule defines a single sender-receiver-percentage mapping within an allocation cycle, specifying which cost center sends costs, which cost object receives them, and the allocation percentage. Each rule carries an allocation cycle reference, sender cost center reference, receiver type, receiver id, and percentage. Receivers can be cost centers, profit centers, or internal orders (polymorphic reference). Multiple rules within a cycle define how a sender's costs are split across multiple receivers, with the constraint that percentages for a given sender must sum to exactly 100%.
|
|
6
|
+
|
|
7
|
+
## Domain Model Definitions
|
|
8
|
+
|
|
9
|
+
### Model type
|
|
10
|
+
|
|
11
|
+
Standard
|
|
12
|
+
|
|
13
|
+
### Command Definitions
|
|
14
|
+
|
|
15
|
+
- [createAllocationRule](../commands/CreateAllocationRule.md) - Add an allocation rule to a DRAFT allocation cycle
|
|
16
|
+
- [deleteAllocationRule](../commands/DeleteAllocationRule.md) - Remove an allocation rule from a DRAFT allocation cycle
|
|
17
|
+
|
|
18
|
+
### Query Definitions
|
|
19
|
+
|
|
20
|
+
- [GetAllocationCycle](../queries/GetAllocationCycle.md) - Retrieve allocation rules as part of the parent allocation cycle
|
|
21
|
+
|
|
22
|
+
### Models
|
|
23
|
+
|
|
24
|
+
- AllocationRule
|
|
25
|
+
|
|
26
|
+
### Invariants
|
|
27
|
+
|
|
28
|
+
- Allocation rule must reference a valid allocation cycle via allocationCycleId
|
|
29
|
+
- Allocation rule can only be added to or removed from a DRAFT allocation cycle
|
|
30
|
+
- Allocation rule must reference a valid sender cost center
|
|
31
|
+
- Allocation rule must reference a valid receiver cost object (cost center, profit center, or internal order)
|
|
32
|
+
- A sender cost center cannot also appear as a receiver within the same allocation rule set
|
|
33
|
+
- Allocation rule percentage must be a positive value (greater than zero)
|
|
34
|
+
- Allocation rule percentages for a given sender must sum to exactly 100% across all rules in the cycle
|
|
35
|
+
- Allocation rules cannot be modified after the cycle leaves DRAFT status
|
|
36
|
+
|
|
37
|
+
### Relationships
|
|
38
|
+
|
|
39
|
+
- **Belongs to AllocationCycle**: Each allocation rule belongs to an AllocationCycle via allocationCycleId
|
|
40
|
+
- **References CostCenter (sender)**: Each allocation rule references a sender CostCenter via senderCostCenterId
|
|
41
|
+
- **Polymorphic Receiver**: Each allocation rule references a receiver via receiverType and receiverId, which can be a CostCenter, ProfitCenter, or InternalOrder
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Budget
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
Budget is the financial planning entity 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. Each budget carries a name, optional description, budget holder, fiscal year reference, company scope, cost object type and id (polymorphic reference to cost center, profit center, or internal order), plan version reference, total amount, and status. Budgets follow a five-stage lifecycle — DRAFT, SUBMITTED, APPROVED, ACTIVE, CLOSED — enforcing segregation of duties between budget creation, approval, and cost posting. When active, budgets enable budgetary control (funds check) that validates transactions against available budget using the formula: Available = Budget - (Actual + Commitments + Encumbrances).
|
|
6
|
+
|
|
7
|
+
## Domain Model Definitions
|
|
8
|
+
|
|
9
|
+
### Model type
|
|
10
|
+
|
|
11
|
+
Stateful
|
|
12
|
+
|
|
13
|
+
#### State Transitions
|
|
14
|
+
|
|
15
|
+
```mermaid
|
|
16
|
+
stateDiagram-v2
|
|
17
|
+
[*] --> Draft: createBudget
|
|
18
|
+
Draft --> Draft: updateBudget / createBudgetLineItem / deleteBudgetLineItem
|
|
19
|
+
Draft --> Submitted: submitBudget
|
|
20
|
+
Submitted --> Approved: approveBudget
|
|
21
|
+
Submitted --> Draft: rejectBudget
|
|
22
|
+
Approved --> Active: activateBudget
|
|
23
|
+
Active --> Closed: closeBudget
|
|
24
|
+
Draft --> [*]: deleteBudget
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Command Definitions
|
|
28
|
+
|
|
29
|
+
- [createBudget](../commands/CreateBudget.md) - Create a new budget in DRAFT status with name, budget holder, fiscal year, cost object, and plan version
|
|
30
|
+
- [updateBudget](../commands/UpdateBudget.md) - Update mutable fields of a DRAFT budget (name, description, budget holder)
|
|
31
|
+
- [submitBudget](../commands/SubmitBudget.md) - Submit a DRAFT budget for approval review
|
|
32
|
+
- [approveBudget](../commands/ApproveBudget.md) - Approve a SUBMITTED budget, advancing it toward activation
|
|
33
|
+
- [rejectBudget](../commands/RejectBudget.md) - Reject a SUBMITTED budget back to DRAFT with a rejection reason
|
|
34
|
+
- [activateBudget](../commands/ActivateBudget.md) - Activate an APPROVED budget, enabling budgetary control (funds check)
|
|
35
|
+
- [closeBudget](../commands/CloseBudget.md) - Close an ACTIVE budget, preventing further modifications
|
|
36
|
+
- [deleteBudget](../commands/DeleteBudget.md) - Delete a DRAFT budget and all associated line items
|
|
37
|
+
- [createBudgetLineItem](../commands/CreateBudgetLineItem.md) - Add a budget line item to a DRAFT budget specifying cost element, period, and planned amount
|
|
38
|
+
- [deleteBudgetLineItem](../commands/DeleteBudgetLineItem.md) - Remove a budget line item from a DRAFT budget
|
|
39
|
+
|
|
40
|
+
### Query Definitions
|
|
41
|
+
|
|
42
|
+
- [GetBudget](../queries/GetBudget.md) - Retrieve a budget by id with all line items
|
|
43
|
+
- [ListBudgets](../queries/ListBudgets.md) - List budgets with filters (status, company, fiscal year, cost object)
|
|
44
|
+
- [CalculateBudgetAvailability](../queries/CalculateBudgetAvailability.md) - Compute budget availability as Budget - (Actual + Commitments + Encumbrances) for a cost element, period, and cost object
|
|
45
|
+
|
|
46
|
+
### Models
|
|
47
|
+
|
|
48
|
+
- Budget
|
|
49
|
+
- BudgetLineItem
|
|
50
|
+
|
|
51
|
+
### Invariants
|
|
52
|
+
|
|
53
|
+
- Budget can only be created in DRAFT status
|
|
54
|
+
- Budget requires a valid companyId; the company must be in ACTIVE status
|
|
55
|
+
- Budget requires a valid fiscal year reference from finance-ledger
|
|
56
|
+
- Budget requires a name, budget holder, and cost object reference (cost center, profit center, or internal order)
|
|
57
|
+
- Budget must reference a valid PlanVersion (BUDGET, FORECAST, or SIMULATION)
|
|
58
|
+
- A budget with no line items cannot be submitted
|
|
59
|
+
- Only a user different from the budget creator can approve the budget (segregation of duties)
|
|
60
|
+
- Rejection requires a reason text
|
|
61
|
+
- Only one ACTIVE budget of type BUDGET can exist per cost object per fiscal year
|
|
62
|
+
- Multiple FORECAST or SIMULATION versions can coexist for the same cost object and fiscal year
|
|
63
|
+
- Line items can only be added to or removed from a DRAFT budget
|
|
64
|
+
- A CLOSED budget cannot be reopened; no further modifications are permitted
|
|
65
|
+
- Funds check computes BudgetAvailability as Budget - (Actual + Commitments + Encumbrances) for the target cost element, period, and cost object
|
|
66
|
+
- A transaction that exceeds BudgetAvailability is rejected with a budget exceeded error when budgetary control is active
|
|
67
|
+
- Budget periods align with finance-ledger AccountingPeriod boundaries; misaligned periods are rejected
|
|
68
|
+
- Locking a budget period prevents further modifications to planned amounts for that period
|
|
69
|
+
- Budgets are scoped to a company; budgets from different companies are fully isolated
|
|
70
|
+
|
|
71
|
+
### Relationships
|
|
72
|
+
|
|
73
|
+
- **References Company**: Each budget is scoped to a Company via companyId (organization module)
|
|
74
|
+
- **References FiscalYear**: Each budget references a FiscalYear via fiscalYearId (finance-ledger module)
|
|
75
|
+
- **References PlanVersion**: Each budget references a PlanVersion via planVersionId
|
|
76
|
+
- **Polymorphic Cost Object**: Each budget references a cost object via costObjectType and costObjectId, which can be a CostCenter, ProfitCenter, or InternalOrder
|
|
77
|
+
- **Has Many BudgetLineItem**: A budget contains one or more budget line items specifying planned amounts per cost element and period
|