Aller au contenu

Budget Lines Management (BUDMGT) — PRD+FSD Hybrid

Module Code: BUDMGT

Product: [BOTH] (Papillon HR Suite + ALTARYS ENTERPRISE HR Suite)

Country Scope: CI (Côte d'Ivoire) — MVP

Version: 1.0

Date: 27/02/2026

Author: ANALYST (Claude Code)

Input documents:

- docs/specs/budget-lines-management.md (Tier 2 human-written minimal spec)

- docs/prd/platform-vision-prd.md (Platform Vision PRD+FSD v1.0)

- docs/research/3_validated/budget-lines-legal-validated.md (validated legal research)

- docs/research/2_audit/budget-lines-legal-audit.md (legal audit gaps)


PART A — Product Requirements (PRD)


A.1 Executive Summary

The Problem

Most SMEs in the OHADA zone operate without any formal budget. A 2023 study of 201 Abidjan SMEs found that budget management is rare, ad hoc, and rarely digitized. The consequences:

  • Budget blindness: No one knows how much has been spent or committed against a plan until month-end reconciliation — or year-end, when it's too late.
  • Overspending: Multiple departments commit or spend without visibility into remaining budget. By the time the DG notices, the budget is blown.
  • No early warning: Budget overruns are discovered after the fact, not prevented.
  • Audit weakness: While budget management is NOT legally mandatory for private companies (confirmed by legal research — OHADA AUDCIF does not require it), OHADA encourages budget management as a governance best practice. Statutory auditors (CAC) often expect a budget vs. actual report.

The Solution

Budget Lines Management (BUDMGT) is a governance best-practice module — not a compliance module — that gives companies real-time visibility and configurable control over their spending. It provides:

  • An annual budget structure broken into budget lines (categories of planned spending)
  • Real-time balance tracking: allocation vs. committed vs. spent vs. available
  • Configurable controls: three-level enforcement (warn / require-override / hard-block) per budget line
  • Budget transfer workflow with one-step approval
  • A real-time dashboard and Excel/CSV exports for budget monitoring

BUDMGT is NOT sellable standalone. It auto-activates when either Expense Management (EXPMGT) or Commitment Management (COMMIT) is purchased. It deactivates only when neither is active (see Platform Vision FR-PV-032).

Module Code & Activation

Attribute Value
Module code BUDMGT
Sellable No — auto-included with EXPMGT or COMMIT
Activation rule ACTIVE when EXPMGT.status = ACTIVE OR COMMIT.status = ACTIVE
Deactivation rule INACTIVE only when EXPMGT.status ≠ ACTIVE AND COMMIT.status ≠ ACTIVE
Hard dependencies Control Plane (tenant context, auth, org structure, fiscal year)
Soft dependencies COMMIT (events: CommitmentApproved, CommitmentCancelled), EXPMGT (events: ExpenseApproved)

Key finding from legal research: Budget management is NOT legally mandatory under OHADA (AUDCIF), SYSCOHADA, or Côte d'Ivoire national regulations for private-sector companies — regardless of company size or form (SARL, SA, SAS, Entreprise Individuelle).

BUDMGT is therefore a governance best-practice tool, not a legal compliance tool. All blocking behavior, approval chains, threshold alerts, and reporting features are product design decisions, not legal mandates.

Exception: Non-profit entities (associations, NGOs) governed by SYCEBNL (December 2022) ARE required to produce a "Tableau d'exécution budgétaire." Non-profit compliance mode is documented as V2 (see §A.8 Out of Scope).


A.2 User Personas

P1: Directeur Général (DG) / CEO — [BOTH]

  • BUDMGT role: Validates the annual budget. Approves budget transfers. Dashboard overview of budget health.
  • Papillon context: In S1-S2 companies (2-29 employees), the DG IS the comptable. They create AND validate the budget themselves. Needs a simple, visual dashboard — not spreadsheet-style tables.
  • Enterprise context: Reviews consolidated budget dashboards. Delegates transfer approvals to Finance Director. Needs high-level KPIs, not line-level detail.

P3: Comptable / Accountant — [BOTH]

  • BUDMGT role: Primary budget creator and manager. Creates budget lines, sets allocations, monitors consumption, requests transfers, exports reports.
  • Papillon context: Often an external accountant (cabinet comptable) managing 5-20 client companies via tenant switcher. Needs efficient multi-tenant workflows. Familiar with SYSCOHADA chart of accounts.
  • Enterprise context: In-house finance controller managing departmental budgets with multiple budget line owners.

P3b: Responsable Finance / Finance Director — [BOTH]

  • BUDMGT role: Approves budget transfers. Views all budgets. Can override thresholds. Secondary to DG for budget validation.
  • Papillon context: Exists only in larger SMEs (S4-S6, 50-350 employees). In smaller companies, this role is collapsed into DG.
  • Enterprise context: Key operational user. Manages budget discipline across departments.

P2-N+1: Manager / Department Head — [BOTH]

  • BUDMGT role: Read-only view of budget lines scoped to their department. Sees allocation, committed, spent, and available for their department's lines only. No company-wide budget visibility.
  • Papillon context: May check budget status before approving a commitment or expense in their department.
  • Enterprise context: Actively monitors departmental budget consumption. May request transfers for their lines.

P4: Employé — [BOTH]

  • BUDMGT role: No access. Budget management is not employee-facing.

A.3 User Stories

US-BUD-001: Annual Budget Creation [BOTH]

As a Comptable or DG, I want to create an annual budget with budget lines organized by categories, So that my company has a structured spending plan for the fiscal year.

Acceptance Criteria: - Given I am a Comptable or DG, When I access BUDMGT for the first time in a new fiscal year, Then I see a guided wizard prompting me to create my first budget. - Given I am creating a budget, When I add a budget line, Then I must specify: label, category, allocation amount (XOF, 0 decimals), and optionally a department scope. - Given budget categories are pre-seeded, When I create a budget line, Then I can select from pre-seeded categories or create a custom one. - Given I create a budget line, When the system prompts "Souhaitez-vous associer un compte SYSCOHADA ?", Then I can optionally map it to a Classe 6x account or skip.

US-BUD-002: Budget Validation [BOTH]

As a DG, I want to validate the annual budget once it's complete, So that it becomes the official spending plan and budget lines are locked against informal changes.

Acceptance Criteria: - Given a budget is in DRAFT status, When the DG clicks "Valider le budget", Then the budget status changes to ACTIVE and all budget line allocations become locked. - Given a budget is ACTIVE, When a Comptable tries to edit a budget line allocation directly, Then the system blocks the edit and displays "Le budget est validé. Utilisez un virement budgétaire pour modifier les allocations." - Given a budget is ACTIVE, When I view the budget, Then I see a "Validé le [date] par [DG name]" stamp.

US-BUD-003: Real-Time Balance Tracking [BOTH]

As a Comptable, DG, or Finance Director, I want to see the real-time balance of each budget line (allocation, committed, spent, available), So that I know exactly where my company stands financially at any moment.

Acceptance Criteria: - Given a budget is ACTIVE, When I view a budget line, Then I see: Allocation, Engagé (Committed), Réalisé (Spent), Disponible (Available) = Allocation - Committed - Spent. - Given a commitment is approved against a budget line, When I refresh the dashboard, Then the Committed amount has increased by the commitment amount and Available has decreased. - Given an approved commitment converts to an expense, When the system processes the conversion, Then the Committed amount decreases (release) and the Spent amount increases (consume) by the respective amounts.

US-BUD-004: Budget Transfer [BOTH]

As a Comptable, I want to transfer budget from one line to another, So that I can reallocate funds to where they're most needed without changing the total budget.

Acceptance Criteria: - Given I am a Comptable, When I create a budget transfer, Then I must specify: source line, destination line, amount, and justification. - Given the transfer amount exceeds the source line's available amount, When I submit, Then the system blocks the transfer with "Montant insuffisant sur la ligne source." - Given the transfer is submitted, When the DG or Finance Director approves it, Then the source line's allocation decreases and the destination line's allocation increases by the transfer amount. - Given the transfer is approved, When I view the audit trail, Then the transfer is recorded with requester, approver, amount, source, destination, justification, and timestamps.

US-BUD-005: Configurable Threshold Alerts [BOTH]

As a Comptable or DG, I want to configure warning and blocking thresholds on budget lines, So that the system alerts me before a budget line is exhausted.

Acceptance Criteria: - Given I am configuring budget settings, When I set tenant-level defaults, Then I can configure three thresholds: Warn (default 80%), Alert (default 95%), Action (default 100%). - Given a budget line's consumption reaches the Warn threshold, When the threshold is crossed, Then the system sends an in-app notification to the Comptable and DG. - Given a budget line has a per-line threshold override, When consumption is checked, Then the per-line threshold takes precedence over the tenant default. - Given the Action threshold is reached and the blocking level is set to "hard-block", When a commitment/expense is submitted against this line, Then the system blocks the operation.

US-BUD-006: Budget Dashboard [BOTH]

As a DG, Comptable, or Finance Director, I want to see a visual dashboard of budget consumption, So that I can quickly assess the overall budget health of my company.

Acceptance Criteria: - Given I have access to the budget dashboard, When I open it, Then I see: total budget allocation, total committed, total spent, total available, and a consumption percentage. - Given the dashboard is open, When I view it, Then I see budget consumption broken down by category and by department (for department-scoped lines). - Given I want detailed data, When I click "Exporter", Then I can download an Excel/CSV file with all budget lines and their current balances.

US-BUD-007: Department-Scoped Budget View (Manager) [BOTH]

As a department manager, I want to see the budget lines allocated to my department, So that I can monitor my department's spending within budget.

Acceptance Criteria: - Given I am a Manager, When I access the budget view, Then I see ONLY budget lines scoped to my department. - Given my department has no budget lines assigned, When I access the budget view, Then I see "Aucune ligne budgétaire affectée à votre service." - Given I am a Manager, When I try to access company-wide budget data, Then the system restricts access and shows only my department's lines.

US-BUD-008: Offline Budget Viewing [BOTH — PAPILLON FOCUS]

As a Comptable or DG using the app in an area with poor connectivity, I want to view cached budget line balances offline, So that I have a reference for budget status even without internet.

Acceptance Criteria: - Given I have previously loaded the budget dashboard while online, When I go offline, Then I can still see the last-cached budget balances. - Given I am viewing offline data, When I see the dashboard, Then a visible banner states "Données hors ligne — dernière mise à jour : [timestamp]." - Given I am offline, When I try to submit a budget transfer or any mutation, Then the system shows "Opération impossible hors ligne. Connectez-vous pour effectuer des modifications budgétaires."

US-BUD-009: Mid-Year Budget Creation [BOTH]

As a Comptable or DG whose company starts using BUDMGT mid-fiscal year, I want to create a partial-year budget for the remaining months, So that I can start tracking budget consumption immediately without waiting for the next fiscal year.

Acceptance Criteria: - Given the current fiscal year is already in progress, When I create my first budget, Then the system allows me to set the budget start date to today (or any date within the current fiscal year). - Given I create a mid-year budget, When I set allocations, Then the allocation represents the remaining budget for the rest of the fiscal year (not a pro-rated annual amount).

US-BUD-010: Next-Year Budget Preparation [BOTH]

As a Comptable, I want to prepare next year's budget as a DRAFT while the current year's budget is still ACTIVE, So that I can plan ahead without disrupting current-year operations.

Acceptance Criteria: - Given the current fiscal year's budget is ACTIVE, When I create a budget for the next fiscal year, Then it is created in DRAFT status. - Given two fiscal-year budgets coexist (current ACTIVE + next DRAFT), When I navigate the budget module, Then I can switch between fiscal years via a year selector. - Given the new fiscal year starts, When the system detects the date change, Then it prompts: "Le nouvel exercice a commencé. Voulez-vous activer le budget [year] et clôturer [previous year] ?"


A.4 Non-Functional Requirements

Requirement Target Notes
Response time — balance check API < 100ms (p95) Called synchronously by COMMIT and EXPMGT during approval flows. Must be fast.
Response time — dashboard < 2 seconds on 3G Aggregate queries across all budget lines for a tenant.
Atomicity Budget reserve/consume/release operations MUST be atomic. No double-spending. Concurrency strategy delegated to ARCHITECT (pessimistic or optimistic locking).
Data isolation Every query includes tenant_id context. Zero cross-tenant data leakage. Platform rule — not BUDMGT-specific.
Audit trail Every budget mutation produces an immutable audit entry. Reserve, consume, release, transfer, validation, status changes.
Data retention 10 years (aligned with OHADA AUDCIF Art. 24 by analogy). Budget data is lightweight. No hard deletes — deactivation only.
Offline Read-only cache of budget balances. All writes are online-only. Aligns with FR-PV-062 (financial operations require connectivity).
Scale 100,000+ tenants, up to 500 budget lines per tenant, up to 10,000 budget mutations/day per tenant. Large enterprise tenants may exceed 500 lines — V2 concern.
Currency XOF only (MVP). Zero decimal places. Space as thousands separator. XAF support in V2 when BJ/CM countries are added.
Localization French UI only (MVP). All labels, messages, reports in French. English for CM bilingual in V2.

A.5 MVP Scope

In MVP [BOTH]

  • Fiscal year configuration (follows tenant's fiscal year from Control Plane — FR-PV-100/101/102)
  • Mid-year budget creation (first budget can start mid-fiscal year)
  • Budget line CRUD (label, category, allocation, optional department scope, optional SYSCOHADA account)
  • Budget category management (pre-seeded + customizable, mapping to SYSCOHADA Classe 6x)
  • Budget lifecycle: DRAFT → ACTIVE (validated) → CLOSED (year-end)
  • Immutable allocations once ACTIVE (changes only via transfer workflow)
  • Real-time balance tracking: allocation, committed, spent, available
  • Three-level enforcement per budget line: WARN / REQUIRE_OVERRIDE / HARD_BLOCK
  • Tenant-level default thresholds (80% warn, 95% alert, 100% action), overridable per line
  • Budget availability check API (synchronous — called by COMMIT and EXPMGT)
  • Reserve / Consume / Release API (atomic operations for budget mutations)
  • Commitment→Expense conversion: Release committed + Consume spent (net neutral)
  • Budget transfer workflow (request → one-step DG/Finance Director approval → execute)
  • No transfer limits beyond source line's available balance
  • Dashboard: budget consumption per line, per category, per department
  • Excel/CSV export of budget vs. actual data
  • Next-year budget preparation (DRAFT coexists with current-year ACTIVE)
  • Year-end hard close (no carry-over)
  • Auto-seed budget categories on module activation
  • Guided setup wizard for first budget creation
  • Audit trail on all budget mutations
  • Manager read-only view (department-scoped only)
  • Offline: cached balance read-only with staleness indicator

Out of MVP (V2+)

  • [V2] Budget revision workflow (increase/decrease annual allocation mid-year with DG approval)
  • [V2] Monthly phasing (distribute allocation across months, track monthly actuals vs. plan)
  • [V2] Budget carry-over rules (configurable: carry forward unspent amounts, migrate open commitments)
  • [V2] Project/cost center-based budgeting (new Project entity, budget lines assigned to projects)
  • [V2] Budget templates (copy last year's structure for new fiscal year)
  • [V2] Multi-year budget comparison (year-over-year analysis)
  • [V2] Formatted PDF "Budget vs. Actual" report with company branding
  • [V2] Automated monthly email summary to DG/Comptable
  • [V2] Budget import from Excel
  • [V2] Non-profit compliance mode (SYCEBNL "Tableau d'exécution budgétaire")
  • [V2] Integration with Accounting module (automatic journal entries for budget consumption)
  • [V2] Multi-level approval chains for transfers/revisions (FR-PV-024)
  • [V2] Board approval requirements for budget revisions (configurable thresholds per company statutes)
  • [ENTERPRISE ONLY — V2] Multi-entity budget consolidation (group-level view)
  • [ENTERPRISE ONLY — V2] Batch budget line creation (import 200+ lines from Excel)
  • [ENTERPRISE ONLY — V2] Batch transfers and batch approvals
  • [ENTERPRISE ONLY — V2] Multi-currency budgets (XOF + XAF with conversion)
  • [ENTERPRISE ONLY — V2] Advanced forecasting / projections based on consumption trends
  • [ENTERPRISE ONLY — V2] Complex approval chains for revisions (amount-based routing)
  • Country expansion (V2): Bénin and Cameroun country adaptations (Month 9 target)
  • Regulated industries: Banking, insurance, mining sector-specific budget templates — out of scope

A.6 Open Questions

# Question Priority Status
OQ-BUD-01 Cooperatives (sociétés coopératives): Do companies governed by the OHADA Uniform Act on Cooperatives have different budget requirements? Not researched. Likely irrelevant for Papillon's SME target. 🟢 LOW Unresolved — monitor
OQ-BUD-02 Public subsidies / government contracts: Do CI companies receiving public funds face additional budget documentation requirements? Could affect some Papillon clients. 🟢 MEDIUM Unresolved — needs targeted research if demand arises
OQ-BUD-03 AUSCGIE Art. 376 / 853-12 national modifications: The statutory audit thresholds (Bilan > 125M, CA > 250M, Effectif > 50 for SARL/SAS) are presented as uniform per AUSCGIE, but some OHADA states may have national modifications. Flag for verification if a CAC client reports different thresholds. 🟢 LOW Monitor

A.7 Temporarily Validated

# Item Current Value Risk Action Required
TV-BUD-01 SMT revenue thresholds CA < 60M/40M/30M FCFA (per AUDCIF Art. 13 — exact article unverified) LOW — contextual, not used in any BUDMGT calculation Verify exact AUDCIF article numbers if SMT classification becomes a BUDMGT feature
TV-BUD-02 CI tax regime thresholds Entreprenant ≤50M, Micro 50–200M, Réel simplifié 200–500M, Réel normal >500M (source: legal research, CI CGI article unspecified) LOW — contextual, not used in any BUDMGT calculation Verify CI CGI articles if these thresholds are ever surfaced in the UI
TV-BUD-03 SYSCOHADA Account 408 as commitment equivalent Account 408 "Fournisseurs — factures non parvenues" cited as closest SYSCOHADA equivalent to budget engagement (commitment) LOW — informational only for BUDMGT, may be important for COMMIT module Verify with SYSCOHADA Plan Comptable before COMMIT PRD

PART B — Functional Specifications (FSD)


B.1 Functional Rules

Budget Lifecycle

Rule Description
FR-BUD-001 A budget belongs to exactly one fiscal year. The fiscal year is determined by the tenant's configured fiscal year (Control Plane FR-PV-100/101/102). BUDMGT does NOT have a separate budget period configuration.
FR-BUD-002 A budget has a lifecycle status: DRAFTACTIVECLOSED. Only one budget per fiscal year per tenant.
FR-BUD-003 IF a new fiscal year budget is being prepared while the current year's budget is ACTIVE THEN both can coexist: current year = ACTIVE, next year = DRAFT. Maximum of two budgets can exist simultaneously (one ACTIVE, one DRAFT).
FR-BUD-004 IF the DG validates a DRAFT budget THEN the status changes to ACTIVE. The validation is irreversible. Validation date, validator user_id, and validator name are recorded.
FR-BUD-005 IF a budget is ACTIVE THEN all budget line allocations are locked. Allocation changes are possible ONLY through the budget transfer workflow (FR-BUD-040 to FR-BUD-048). Budget revision (direct allocation increase/decrease) is V2.
FR-BUD-006 IF the fiscal year ends THEN the ACTIVE budget must be manually closed by the DG or Comptable. The system prompts closure but does NOT auto-close. On closure: status → CLOSED, all open alerts are resolved, and the year-end balance is frozen.
FR-BUD-007 IF a budget is CLOSED THEN it is read-only. No mutations (reserve, consume, release, transfer) are possible. Historical data remains accessible for reporting.
FR-BUD-008 IF a tenant starts using BUDMGT mid-fiscal year THEN they can create a budget with a start date later than the fiscal year start. The budget's effective period runs from the specified start date to the fiscal year end. Allocations represent the remaining-year budget, not a pro-rated annual amount.

Budget Categories

Rule Description
FR-BUD-010 Budget categories are grouping labels for budget lines. Each category has: id, tenant_id, name, code (unique per tenant), syscohada_account_prefix (nullable), is_system (boolean), status (ACTIVE / INACTIVE), sort_order.
FR-BUD-011 On BUDMGT module activation, the system auto-seeds the following budget categories (is_system = true):

Pre-seeded categories:

Code Name SYSCOHADA Account Prefix Description
CHPERS Charges de personnel 66 Salaries, social charges, training costs
FRNGEN Frais généraux 61 Rent, utilities, maintenance, insurance
FOURNI Fournitures et consommables 604/605 Office supplies, consumables
DEPLAC Déplacements et missions 625 Travel, per diem, transport
SRVEXT Services extérieurs 62/63 Professional fees, consulting, outsourced services
COMMUN Communication et marketing 627 Advertising, communication, events
INVEST Investissements (CAPEX) 2x Equipment, vehicles, IT hardware (Classe 2)
FISCAL Impôts et taxes 64 Non-income taxes, duties, fees
DIVERS Charges diverses 65/67 Miscellaneous expenses
Rule Description
FR-BUD-012 Tenant admin (Comptable/DG) can: rename system categories, deactivate system categories (not delete), create custom categories, edit custom categories, deactivate custom categories.
FR-BUD-013 A category CANNOT be deactivated if active budget lines reference it. The system displays: "Cette catégorie est utilisée par [N] lignes budgétaires actives. Réaffectez-les avant de désactiver."

Budget Lines

Rule Description
FR-BUD-020 A budget line belongs to exactly one budget (fiscal year) and one category. It has: id, tenant_id, budget_id (FK), category_id (FK), label, allocation (BigDecimal, XOF 0 decimals), committed (BigDecimal), spent (BigDecimal), org_unit_id (FK, nullable — for department scoping), syscohada_account (nullable — full account code), enforcement_level (nullable — overrides tenant default), warn_threshold_pct (nullable — override), alert_threshold_pct (nullable — override), action_threshold_pct (nullable — override), status (ACTIVE / INACTIVE), created_at, updated_at.
FR-BUD-021 available is a computed value: available = allocation - committed - spent. It is NOT stored. It is calculated at query time.
FR-BUD-022 allocation, committed, and spent are stored as BigDecimal. All arithmetic MUST use BigDecimal operations. Never double/float. (Platform rule #4.)
FR-BUD-023 XOF has zero decimal places. All amounts are whole numbers. IF a user enters a decimal value THEN the system rejects it: "Les montants en XOF doivent être des nombres entiers."
FR-BUD-024 IF org_unit_id is NULL THEN the budget line is company-global — any commitment/expense across the company can draw from it.
FR-BUD-025 IF org_unit_id is set THEN the budget line is department-scoped — only commitments/expenses from employees in that org unit (or its children) can draw from it.
FR-BUD-026 During budget line creation, the system displays a prompt: "Souhaitez-vous associer un compte SYSCOHADA ?" with a searchable dropdown of Classe 6x (and 2x for CAPEX) accounts. The field is optional. If skipped, no SYSCOHADA mapping is recorded.
FR-BUD-027 Budget lines are never hard-deleted. They can be deactivated (status → INACTIVE). An INACTIVE budget line is hidden from new operations but preserved in the database for historical reference. Existing commitments/expenses retain their FK reference.
FR-BUD-028 A budget line CANNOT be deactivated if committed > 0 (active commitments exist). The system displays: "Cette ligne a des engagements en cours ([amount] XOF). Annulez-les avant de désactiver."

Balance Tracking & Budget Mutations

Rule Description
FR-BUD-030 Reserve (called by COMMIT module on commitment approval): IF available >= requested_amount THEN committed += requested_amount. ELSE the behavior depends on the budget line's enforcement level (FR-BUD-035).
FR-BUD-031 Consume (called by EXPMGT module on expense approval): IF available >= requested_amount THEN spent += requested_amount. ELSE the behavior depends on the enforcement level (FR-BUD-035).
FR-BUD-032 Release (called by COMMIT module on commitment cancellation): committed -= released_amount. IF committed would go negative THEN reject the operation and log an error. This should never happen in normal operation — indicates a data integrity issue.
FR-BUD-033 Commitment-to-Expense conversion: When an approved commitment materializes as an expense: (1) Release the commitment amount (committed -= commitment_amount), (2) Consume the expense amount (spent += expense_amount). These two operations are executed atomically. The net budget impact equals the difference between the expense amount and the commitment amount. If they are equal, the net impact on available is zero.
FR-BUD-034 All budget mutations (reserve, consume, release) MUST be atomic. No partial updates. If the operation fails mid-way, the entire transaction rolls back. The ARCHITECT determines the concurrency/locking strategy (pessimistic vs. optimistic).
FR-BUD-035 Enforcement levels (configurable per budget line, defaults from tenant settings):

Enforcement Level Decision Table:

Budget Line Available Enforcement Level Threshold Crossed → System Behavior
available > 0 AND consumption < warn_threshold Any None ✅ Allow. No alert.
consumption ≥ warn_threshold AND < alert_threshold Any Warn ✅ Allow. Send in-app notification to Comptable + DG. Publish BudgetThresholdReached event (level=WARN).
consumption ≥ alert_threshold AND < action_threshold Any Alert ✅ Allow. Send in-app + email notification to Comptable + DG. Publish BudgetThresholdReached event (level=ALERT).
consumption ≥ action_threshold WARN Action ✅ Allow. Send urgent notification. Visual warning on the budget line. Log the over-budget operation.
consumption ≥ action_threshold REQUIRE_OVERRIDE Action ⏸️ Block. Operation enters PENDING_OVERRIDE status. Requires DG or Finance Director to approve the over-budget operation. On approval: operation proceeds. On rejection: operation cancelled.
consumption ≥ action_threshold HARD_BLOCK Action ❌ Block. Operation rejected. Error: "Budget insuffisant sur la ligne [label]. Disponible : [available] XOF. Demandé : [amount] XOF."
Rule Description
FR-BUD-036 Threshold percentages are calculated as: consumption_pct = (committed + spent) / allocation * 100.
FR-BUD-037 IF allocation = 0 THEN any reserve/consume operation triggers the action threshold behavior immediately (you can't spend from an empty line).
FR-BUD-038 Notifications for threshold crossing are sent once per threshold per budget line per fiscal year. The system tracks which thresholds have already been triggered to avoid notification spam.
FR-BUD-039 IF a release or transfer increases available back below a previously crossed threshold THEN the threshold is reset and can trigger again if re-crossed.

Budget Transfers

Rule Description
FR-BUD-040 A budget transfer moves allocation from one budget line (source) to another (destination) within the same fiscal year. It does NOT change committed or spent amounts.
FR-BUD-041 A transfer has: id, tenant_id, budget_id, source_line_id, destination_line_id, amount (BigDecimal), justification (text, mandatory), requested_by, requested_at, approved_by (nullable), approved_at (nullable), status (PENDING / APPROVED / REJECTED / CANCELLED).
FR-BUD-042 IF transfer.amount > source_line.available THEN the transfer request is rejected at submission: "Montant insuffisant. Disponible sur la ligne source : [available] XOF."
FR-BUD-043 The only limit on transfer amount is the source line's available balance. No percentage cap. No maximum amount. The approval workflow is the control mechanism.
FR-BUD-044 Transfer approval is one-step: the request is routed to the DG (P1) or Finance Director (P3b). Either can approve.
FR-BUD-045 IF the transfer is approved THEN: source_line.allocation -= transfer.amount AND destination_line.allocation += transfer.amount. These two updates are atomic.
FR-BUD-046 IF the transfer is rejected THEN: no allocation changes. The rejection reason is recorded.
FR-BUD-047 The requester can cancel a PENDING transfer before it is approved/rejected.
FR-BUD-048 A budget transfer is only possible on an ACTIVE budget. IF the budget is DRAFT or CLOSED THEN transfers are not available.

Threshold Configuration

Rule Description
FR-BUD-050 Tenant-level default thresholds are stored in the tenant's BUDMGT settings: warn_threshold_pct (default 80), alert_threshold_pct (default 95), action_threshold_pct (default 100), default_enforcement_level (default WARN).
FR-BUD-051 Each budget line can override the tenant defaults by setting its own warn_threshold_pct, alert_threshold_pct, action_threshold_pct, and enforcement_level. IF a per-line value is NULL THEN the tenant default applies.
FR-BUD-052 Threshold validation: warn_threshold_pct < alert_threshold_pct < action_threshold_pct. All values must be between 1 and 200 (allowing over-100% for soft-warn scenarios).
FR-BUD-053 The default_enforcement_level has three values: WARN, REQUIRE_OVERRIDE, HARD_BLOCK. Default shipped value: WARN (best-practice positioning — not punitive by default).

Year-End Closure

Rule Description
FR-BUD-060 At fiscal year end, the DG or Comptable manually triggers budget closure. The system prompts: "Clôturer le budget [year] ? Cette action est irréversible."
FR-BUD-061 On closure: budget status → CLOSED. Final balances are frozen. No further reserve/consume/release/transfer operations are accepted.
FR-BUD-062 IF there are open (non-zero) committed amounts at closure THEN the system displays a warning: "[N] lignes ont des engagements en cours totalisant [amount] XOF. Ces engagements seront perdus à la clôture." The DG/Comptable must acknowledge this warning to proceed.
FR-BUD-063 On closure, unspent budget amounts are NOT carried forward. The next fiscal year starts with a clean budget (if one exists in DRAFT, it can be activated). Budget carry-over is V2.
FR-BUD-064 On closure, open commitments are NOT migrated to the next fiscal year. They remain associated with the closed year's budget for historical reference. The COMMIT module should flag these to the user for manual resolution.

Permissions & Roles

Rule Description
FR-BUD-070 DG (P1): Full access — create/edit DRAFT budget lines, validate budget, approve transfers, approve over-budget overrides, view all lines, close budget, configure thresholds.
FR-BUD-071 Comptable (P3): Create/edit DRAFT budget lines, manage categories, request transfers, view all lines, export data, close budget (if DG delegates). Cannot validate budget (DG only).
FR-BUD-072 Responsable Finance (P3b): Approve transfers, approve over-budget overrides, view all lines, export data. Cannot create/edit budget lines or validate budget.
FR-BUD-073 Manager (N+1): Read-only view of budget lines scoped to their department ONLY. No company-wide budget visibility. No mutation capability.
FR-BUD-074 Employé (P4): No access to BUDMGT. Budget information is not exposed to employees.
FR-BUD-075 All permission checks use the platform RBAC system (Control Plane). BUDMGT defines required permissions (e.g., BUDGET_CREATE, BUDGET_VALIDATE, BUDGET_TRANSFER_APPROVE, BUDGET_VIEW_ALL, BUDGET_VIEW_DEPARTMENT) and maps them to platform roles.

B.2 State Machines

Budget Lifecycle

stateDiagram-v2
    [*] --> DRAFT : Budget created for fiscal year

    DRAFT --> ACTIVE : DG validates budget (FR-BUD-004)
    DRAFT --> DRAFT : Lines added/edited/removed

    ACTIVE --> CLOSED : DG/Comptable closes year-end (FR-BUD-060)
    ACTIVE --> ACTIVE : Transfers, reserves, consumes, releases

    CLOSED --> [*] : Read-only archive (10-year retention)

Budget Transfer Lifecycle

stateDiagram-v2
    [*] --> PENDING : Comptable submits transfer request

    PENDING --> APPROVED : DG or Finance Director approves
    PENDING --> REJECTED : DG or Finance Director rejects
    PENDING --> CANCELLED : Requester cancels

    APPROVED --> [*] : Allocations updated atomically
    REJECTED --> [*] : No changes, reason recorded
    CANCELLED --> [*] : No changes

Over-Budget Override Lifecycle (REQUIRE_OVERRIDE enforcement only)

stateDiagram-v2
    [*] --> PENDING_OVERRIDE : Operation exceeds action threshold on a REQUIRE_OVERRIDE line

    PENDING_OVERRIDE --> APPROVED : DG or Finance Director approves override
    PENDING_OVERRIDE --> REJECTED : DG or Finance Director rejects override

    APPROVED --> [*] : Budget mutation proceeds (reserve or consume)
    REJECTED --> [*] : Original commitment/expense rejected, budget unchanged

B.3 Decision Tables

Budget Mutation Authorization

User Role Budget Status Operation Department Match? → Allowed?
DG ACTIVE Reserve/Consume Any ✅ Yes (system-initiated via COMMIT/EXPMGT events)
Comptable ACTIVE Reserve/Consume Any ✅ Yes (system-initiated)
Any DRAFT Reserve/Consume ❌ No — budget not yet validated
Any CLOSED Reserve/Consume ❌ No — budget closed
Any ACTIVE Reserve/Consume Line is dept-scoped, employee not in dept ❌ No — department mismatch

Transfer Approval Routing

Requester → Approver(s)
Comptable (P3) DG (P1) OR Finance Director (P3b)
Finance Director (P3b) DG (P1)
DG (P1) Self-approved (auto-approve with SELF_APPROVED status, logged in audit trail)

Module Auto-Activation Logic

EXPMGT Status COMMIT Status → BUDMGT Status
ACTIVE ACTIVE ACTIVE
ACTIVE INACTIVE ACTIVE
INACTIVE ACTIVE ACTIVE
INACTIVE INACTIVE INACTIVE
TRIAL INACTIVE ACTIVE (budget available during trial)
INACTIVE TRIAL ACTIVE (budget available during trial)

B.4 Data Requirements

Key Entities

Budget

Field Type Required Notes
id UUID Yes PK
tenant_id UUID Yes FK → Tenant. Tenant isolation.
fiscal_year_start Date Yes Fiscal year start date
fiscal_year_end Date Yes Fiscal year end date
effective_start Date Yes May differ from fiscal_year_start for mid-year budgets
label String(100) Yes E.g., "Budget 2026"
status Enum Yes DRAFT / ACTIVE / CLOSED
validated_by UUID Nullable FK → User. Set on validation.
validated_at Timestamp Nullable Set on validation.
closed_by UUID Nullable FK → User. Set on closure.
closed_at Timestamp Nullable Set on closure.
created_by UUID Yes FK → User
created_at Timestamp Yes
updated_at Timestamp Yes

Constraints: - UNIQUE(tenant_id, fiscal_year_start) — one budget per fiscal year per tenant - Only one budget with status=ACTIVE per tenant at any time - Only one budget with status=DRAFT per tenant at any time

BudgetCategory

Field Type Required Notes
id UUID Yes PK
tenant_id UUID Yes FK → Tenant
name String(100) Yes E.g., "Charges de personnel"
code String(20) Yes E.g., "CHPERS". UNIQUE per tenant.
syscohada_account_prefix String(10) Nullable E.g., "66", "61", "2x"
is_system Boolean Yes True for pre-seeded, false for custom
status Enum Yes ACTIVE / INACTIVE
sort_order Integer Yes Display ordering
created_at Timestamp Yes
updated_at Timestamp Yes

Constraints: - UNIQUE(tenant_id, code)

BudgetLine

Field Type Required Notes
id UUID Yes PK
tenant_id UUID Yes FK → Tenant
budget_id UUID Yes FK → Budget
category_id UUID Yes FK → BudgetCategory
label String(200) Yes E.g., "Fournitures de bureau"
allocation BigDecimal Yes Initial (and current, after transfers) allocated amount. XOF, 0 decimals.
committed BigDecimal Yes Default 0. Increased by reserve, decreased by release.
spent BigDecimal Yes Default 0. Increased by consume.
org_unit_id UUID Nullable FK → OrganisationalUnit. NULL = company-global.
syscohada_account String(20) Nullable Full SYSCOHADA account code (e.g., "6041")
enforcement_level Enum Nullable WARN / REQUIRE_OVERRIDE / HARD_BLOCK. NULL = use tenant default.
warn_threshold_pct Integer Nullable NULL = use tenant default
alert_threshold_pct Integer Nullable NULL = use tenant default
action_threshold_pct Integer Nullable NULL = use tenant default
status Enum Yes ACTIVE / INACTIVE
created_at Timestamp Yes
updated_at Timestamp Yes
version Integer Yes Optimistic locking version (if ARCHITECT chooses optimistic).

Constraints: - allocation >= 0, committed >= 0, spent >= 0 - committed + spent <= allocation is NOT a DB constraint (can be exceeded with WARN or REQUIRE_OVERRIDE enforcement) - UNIQUE(tenant_id, budget_id, label) — no duplicate line names within a budget

BudgetTransfer

Field Type Required Notes
id UUID Yes PK
tenant_id UUID Yes FK → Tenant
budget_id UUID Yes FK → Budget
source_line_id UUID Yes FK → BudgetLine
destination_line_id UUID Yes FK → BudgetLine
amount BigDecimal Yes XOF, 0 decimals, > 0
justification Text Yes Mandatory reason for transfer
status Enum Yes PENDING / APPROVED / REJECTED / CANCELLED
requested_by UUID Yes FK → User
requested_at Timestamp Yes
approved_by UUID Nullable FK → User
decided_at Timestamp Nullable Approval or rejection timestamp
rejection_reason Text Nullable Reason for rejection
created_at Timestamp Yes

Constraints: - source_line_id ≠ destination_line_id - amount > 0

BudgetOverrideRequest

Field Type Required Notes
id UUID Yes PK
tenant_id UUID Yes FK → Tenant
budget_line_id UUID Yes FK → BudgetLine
operation_type Enum Yes RESERVE / CONSUME
requested_amount BigDecimal Yes
available_at_request BigDecimal Yes Snapshot of available at time of request
source_entity_type String(50) Yes "COMMITMENT" or "EXPENSE"
source_entity_id UUID Yes FK to commitment or expense
status Enum Yes PENDING_OVERRIDE / APPROVED / REJECTED
requested_by UUID Yes FK → User (the person who submitted the commitment/expense)
requested_at Timestamp Yes
decided_by UUID Nullable
decided_at Timestamp Nullable
created_at Timestamp Yes

BudgetSettings (tenant-level)

Field Type Required Notes
id UUID Yes PK
tenant_id UUID Yes FK → Tenant. UNIQUE.
default_enforcement_level Enum Yes Default: WARN
warn_threshold_pct Integer Yes Default: 80
alert_threshold_pct Integer Yes Default: 95
action_threshold_pct Integer Yes Default: 100
created_at Timestamp Yes
updated_at Timestamp Yes

ThresholdAlert (tracking triggered thresholds)

Field Type Required Notes
id UUID Yes PK
tenant_id UUID Yes FK → Tenant
budget_line_id UUID Yes FK → BudgetLine
threshold_level Enum Yes WARN / ALERT / ACTION
threshold_pct Integer Yes The threshold percentage that was crossed
consumption_pct_at_trigger Integer Yes Actual consumption % when triggered
triggered_at Timestamp Yes
resolved Boolean Yes Default false. Set true if available drops back below threshold.
resolved_at Timestamp Nullable

B.5 Multi-Tenant Implications

Concern Shared DB Schema-per-Tenant DB-per-Tenant BYO-DB
Tenant isolation tenant_id on every table. Every query includes WHERE tenant_id = ?. Budget lines, categories, transfers, settings — all scoped. Schema-level isolation. No tenant_id filter needed. Full DB isolation. Tenant-provided DB.
Pre-seeded categories Inserted per tenant at BUDMGT activation. Each tenant gets their own copy (can customize independently). Same — per-schema insertion. Same — per-DB insertion. Same.
Budget settings One row per tenant in shared budget_settings table. Per-schema table. Per-DB table. Per-DB table.
Cross-module API calls Same DB transaction for budget mutations triggered by COMMIT/EXPMGT events (via Spring Modulith Application Events). Same schema context. Cross-DB coordination may be needed if modules are in different DBs — unlikely for MVP. Same.
Audit trail Tenant-scoped rows in shared audit table. Per-schema audit table. Per-DB. Per-DB.
External accountant (multi-tenant user) Accountant switches tenant context → sees that tenant's budget. JWT re-issued with tenant_id. No cross-tenant budget visibility. Same behavior, schema context changes. Same, DB connection changes. Same.
Module gating check Before any BUDMGT API call: verify tenant_modules table has BUDMGT = ACTIVE for the requesting tenant_id. Same check per schema. Same per DB. Same.

B.6 Cross-Module Dependencies

Events Consumed by BUDMGT

Event Published By Payload (key fields) BUDMGT Action
CommitmentApproved Commitment Mgmt (COMMIT) commitmentId, budgetLineId, amount, tenantId Execute Reserve: budget_line.committed += amount. Apply enforcement rules (FR-BUD-035).
CommitmentCancelled Commitment Mgmt (COMMIT) commitmentId, budgetLineId, amountToRelease, tenantId Execute Release: budget_line.committed -= amountToRelease. Reset threshold alerts if applicable (FR-BUD-039).
ExpenseApproved Expense Mgmt (EXPMGT) expenseId, budgetLineId, amount, tenantId, linkedCommitmentId (nullable) IF linkedCommitmentId is not null THEN execute Commitment→Expense conversion (FR-BUD-033): release commitment + consume expense atomically. ELSE execute Consume: budget_line.spent += amount. Apply enforcement rules.
OrganisationUnitCreated Org & Master Data (CP) unitId, tenantId, type, name, parentId No immediate action. New org units become available for budget line scoping.
OrganisationUnitDeactivated Org & Master Data (CP) unitId, tenantId, deactivatedDate IF any active budget lines are scoped to this org unit THEN flag them for review (in-app notification to Comptable). Do NOT auto-deactivate — the lines may still have active commitments.
EmployeeReassigned Employee Mgmt (EMPMGT) or CP employeeId, tenantId, oldUnitId, newUnitId, effectiveDate No immediate BUDMGT action. Future commitments/expenses by this employee will draw from budget lines scoped to the new unit. Existing committed amounts on old-unit lines remain unchanged.

Events Published by BUDMGT

Event Consumed By Payload (key fields) Trigger
BudgetThresholdReached Notification Service tenantId, budgetLineId, budgetLineName, thresholdLevel (WARN/ALERT/ACTION), consumptionPct, availableAmount When consumption crosses a configured threshold (FR-BUD-035, FR-BUD-038).
BudgetExhausted Notification Service, COMMIT, EXPMGT tenantId, budgetLineId, budgetLineName, enforcementLevel When available = 0 (or available < 0 with WARN/REQUIRE_OVERRIDE enforcement).
BudgetOverrideRequested Notification Service tenantId, budgetLineId, overrideRequestId, requestedAmount, availableAmount, sourceEntityType, sourceEntityId When a REQUIRE_OVERRIDE enforcement triggers (FR-BUD-035). Notifies DG/Finance Director.
BudgetTransferRequested Notification Service tenantId, transferId, sourceLineName, destLineName, amount, requestedByName When a transfer request is submitted. Notifies approvers.
BudgetTransferDecided Notification Service tenantId, transferId, decision (APPROVED/REJECTED), decidedByName When a transfer is approved or rejected. Notifies requester.
BudgetValidated Notification Service tenantId, budgetId, fiscalYear, validatedByName When DG validates a DRAFT budget. Notifies Comptable(s).
BudgetClosed COMMIT (to flag open commitments) tenantId, budgetId, fiscalYear, closedAt When a budget is closed at year-end.

API Endpoints Exposed by BUDMGT (Synchronous)

Endpoint Method Called By Purpose Auth
/api/v1/budget-lines/{id}/balance GET COMMIT, EXPMGT Returns: allocation, committed, spent, available, enforcementLevel Tenant-scoped, module-gated
/api/v1/budget-lines/{id}/reserve POST COMMIT (on approval) Body: { amount, commitmentId }. Atomically reserves budget. Returns: new balance or error. Tenant-scoped, module-gated
/api/v1/budget-lines/{id}/consume POST EXPMGT (on approval) Body: { amount, expenseId, linkedCommitmentId? }. Atomically consumes budget (with optional commitment release). Returns: new balance or error. Tenant-scoped, module-gated
/api/v1/budget-lines/{id}/release POST COMMIT (on cancellation) Body: { amount, commitmentId }. Atomically releases reserved budget. Returns: new balance. Tenant-scoped, module-gated
/api/v1/budget-lines/by-department/{orgUnitId} GET COMMIT, EXPMGT (for department-scoped line lookup) Returns active budget lines scoped to the given org unit (or its ancestors) for the current ACTIVE budget. Tenant-scoped, module-gated
/api/v1/budgets/current GET COMMIT, EXPMGT, Dashboard Returns the current ACTIVE budget with summary (total allocation, committed, spent, available). Tenant-scoped, module-gated

API Endpoints Consumed by BUDMGT (Synchronous)

Endpoint Provided By Purpose
GET /api/v1/org-units/{id} Control Plane Resolve org unit name, parent, and manager for department-scoped budget lines and approval routing.
GET /api/v1/org-units/{id}/manager Control Plane Get approver for budget transfer routing.
GET /api/v1/auth/permissions Control Plane Check user permissions (BUDGET_CREATE, BUDGET_VALIDATE, etc.).
GET /api/v1/tenants/{id}/fiscal-year Control Plane Get the tenant's configured fiscal year start/end dates.
GET /api/v1/tenant-modules?moduleCode=BUDMGT Control Plane Verify BUDMGT is ACTIVE for the requesting tenant.

PART C — Constraints & Boundaries


C.1 Regulatory Compliance

OHADA / SYSCOHADA (Supranational)

Regulation Impact on BUDMGT Status
AUDCIF (Acte Uniforme relatif au Droit Comptable et à l'Information Financière) Budget management is NOT required by AUDCIF for private companies. AUDCIF governs financial accounting, not management accounting/budgeting. Art. 1, 5, 11 define the scope — budget is outside it. Confirmed by legal research. No compliance risk.
AUDCIF Art. 7 Fiscal year = calendar year (Jan 1 – Dec 31). BUDMGT follows the tenant's fiscal year config from Control Plane (FR-PV-100/101/102). BUDMGT inherits this behavior — no separate handling.
AUDCIF Art. 22 Immutability of validated accounting records. BUDMGT applies this as a best practice for validated budget allocations (FR-BUD-005). Best practice adoption, not legal mandate for budgets.
AUDCIF Art. 24 10-year retention for accounting documents. BUDMGT applies 10-year retention by analogy (not legally required for budget data). Conservative choice. Budget data is lightweight — cost is negligible.
AUSCGIE Art. 376, 853-12 Statutory audit (CAC) thresholds: Bilan > 125M FCFA, CA > 250M FCFA, Effectif > 50 for SARL/SAS. SA always requires CAC. A CAC may expect budget reports as part of governance review. Contextual. BUDMGT's Excel export satisfies any CAC request for budget data.
SYCEBNL (December 2022) Non-profit entities MUST produce a "Tableau d'exécution budgétaire." BUDMGT does NOT implement this in MVP. V2 — non-profit compliance mode.

Côte d'Ivoire (CI) — National [ALL-SCOPED]

Regulation Impact on BUDMGT
CI Loi de Finances No budget obligation exists for private companies under any CI fiscal law. Confirmed by legal research.
CI DGI tax regimes Entreprenant (≤50M), Micro (50–200M), Réel simplifié (200–500M), Réel normal (>500M). These affect accounting requirements, NOT budget requirements. No BUDMGT impact.
CI Loi n°2013-450 (Data Protection) Budget data is company-level, not personal data. No specific data protection impact. General platform compliance (FR-PV-090-093) applies.

Summary

BUDMGT has NO legal compliance obligations in CI for private companies. All module behavior is governed by product design decisions, not regulatory mandates. This is the lowest-risk module from a legal perspective.


C.2 Localization Requirements

Dimension MVP (CI) V2
Language French only. All labels, error messages, reports, tooltips in French. English (CM bilingual)
Currency XOF only. Zero decimal places. Space as thousands separator (e.g., 15 000 000 XOF). XAF (CEMAC zone). Multi-currency budgets (Enterprise).
Date format DD/MM/YYYY (e.g., 27/02/2026) Same across OHADA zone
Number format Space as thousands separator. Comma as decimal separator (though XOF has no decimals). E.g., 1 500 000. Same
Fiscal year Default Jan-Dec. Configurable per tenant (with OHADA warning). Same
Pre-seeded category names In French. Bilingual naming (V2).
Account chart SYSCOHADA (shared across all OHADA countries). Same Classe 6x structure in CI, BJ, CM. Same

C.3 Security Requirements

Requirement Implementation
Tenant isolation Every query includes tenant_id. Budget data from Tenant A is never visible to Tenant B. Enforced at repository layer.
Role-based access DG, Comptable, Finance Director: full or partial access per FR-BUD-070-075. Manager: department-scoped read-only. Employee: no access.
Audit trail Every budget mutation (reserve, consume, release, transfer, validation, closure, threshold change, category change) produces an immutable audit entry with: user_id, action, entity_type, entity_id, before/after values, timestamp.
Immutability ACTIVE budget allocations are locked (FR-BUD-005). Audit entries are immutable (FR-PV-091). Closed budgets are read-only (FR-BUD-007).
Input validation All monetary amounts validated as BigDecimal, >= 0, whole numbers (XOF). Labels validated for length and sanitized. Justification text sanitized.
API authorization All BUDMGT endpoints check: (1) user authenticated, (2) tenant has BUDMGT ACTIVE, (3) user has required permission.
No sensitive personal data BUDMGT contains no personal employee data. Budget data is company-level financial planning data. Lowest PII risk of any module.

C.4 Out of Scope

This module does NOT handle:

Exclusion Responsible Module/Phase
Spending (expense claims, receipts, approvals) EXPMGT (Expense Management)
Commitments (purchase orders, contracts, approval workflows) COMMIT (Commitment Management)
Payroll budget calculation or salary mass projections PAYROL (Payroll) — V2
Accounting journal entries for budget consumption Accounting module — V2
Cost center / project-based budgeting BUDMGT V2 (project entity)
Multi-entity budget consolidation (group-level) ENTERPRISE ONLY — V2
Budget import from Excel V2
Budget templates (copy last year's structure) V2
Multi-year comparison reporting V2
Budget forecasting / projections ENTERPRISE ONLY — V2
Monthly phasing of allocations V2
Budget carry-over rules V2
Non-profit SYCEBNL compliance ("Tableau d'exécution budgétaire") V2
Multi-level approval chains for transfers V2 (FR-PV-024)
Budget revision workflow (mid-year allocation increase/decrease) V2
Regulated industry (banking, insurance, mining) budget templates Out of scope — monitor demand
Cooperatives (OHADA Uniform Act on Cooperatives) budget requirements Out of scope — monitor demand
Batch budget line operations (import 200+ lines) ENTERPRISE ONLY — V2
Multi-currency budgets (XOF + XAF) ENTERPRISE ONLY — V2
PDF formatted "Budget vs. Actual" report V2
Automated monthly email summary V2
Country-specific adaptations beyond CI BJ + CM at Month 9 target

End of PRD+FSD for Budget Lines Management (BUDMGT) v1.0