| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Employees (hr) • Invoicing (account) • Purchase (purchase) |
| Lines of code | 1765 |
| Technical Name |
grev_od_purchase_budget_control |
| License | OPL-1 |
| Website | https://www.grevlin.com |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Employees (hr) • Invoicing (account) • Purchase (purchase) |
| Lines of code | 1765 |
| Technical Name |
grev_od_purchase_budget_control |
| License | OPL-1 |
| Website | https://www.grevlin.com |
Purchase Budget ControlReal-Time Budget Monitoring & Control for Procurement Activities
|
|
|
|
|
|
Need Help?For support, contact us at odoo@grevlin.com Follow us on X: @GrevlinGlobal ✓ 30 Days Free Support |
|
Grevlin Global Corp
Professional Odoo Solutions & Procurement Optimization |
Purchase Budget Control
Real-time budget monitoring and enforcement for procurement activities.
The Purchase Budget Control module prevents overspending by enforcing configurable budget limits at purchase order confirmation, automatically capturing actual spend from posted vendor bills, and releasing commitments as invoices are reconciled. It provides full visibility into committed, spent, and available amounts with a complete audit trail at every step.
Overview
Key features:
- Define budgets at five organisational levels (organisation, department, category, project, product)
- Configurable threshold rules per budget: notify, require approval, or hard-block over-budget purchase orders
- Real-time commitment tracking from PO confirmation through to vendor bill reconciliation
- Automatic spend capture when vendor bills are posted; automatic reversal when reset to draft
- Budget adjustment workflow with submit → approve → apply state machine
- Inter-budget fund transfers via a built-in wizard with dual adjustment audit records
- Per-line budget assignment on purchase order lines with multi-currency conversion
- OWL burn-down dashboard with projected budget exhaustion date
- Analytic account integration for cross-module reporting
Configuration
Installation
- Install the module from the Odoo Apps menu.
- Confirm the following dependencies are installed:
- base, purchase, product (Odoo Core)
- account, analytic (Odoo Accounting)
- mail, hr (Odoo Messaging & HR)
- Assign users to the appropriate security groups.
Security Groups
The module provides two access levels:
| Group | Permissions |
|---|---|
| Budget Control User | View and manage budgets; create and submit adjustments; view thresholds (read-only); request approval for over-budget purchase orders |
| Budget Control Manager | Full CRUD on all budget records; approve and apply adjustments; configure thresholds; execute inter-budget fund transfers |
Budget Levels
Configure budgets at different organisational levels:
- Organisation: Company-wide budget allocation
- Department: Budget per department or cost centre
- Category: Product category-specific budgets
- Project: Project or campaign budgets
- Product: SKU-level budget allocation
Budget Periods
Each budget has a period type and a validity date range:
- Annual: Full fiscal year
- Quarterly: Three-month rolling budget
- Monthly: Month-by-month allocation
Note
The end date must be on or after the start date. A budget outside its validity date range remains visible but will not intercept new purchase orders.
Threshold Configuration
Each budget supports multiple configurable thresholds. When a purchase order's projected utilisation crosses a threshold, the configured action triggers automatically:
| Action | Behaviour |
|---|---|
| notify | Sends a threshold breach email and creates an activity for the budget's followers. |
| require_approval | Creates an approval request and blocks PO confirmation until an authorised approver acts on the request. |
| block | Hard-blocks PO confirmation with a validation error. No approval bypass is possible. |
When multiple thresholds are breached simultaneously, the highest-percentage threshold determines the action.
To add a threshold, open a budget record, navigate to the :guilabel:`Thresholds` tab, and add rows specifying the percentage, action, and approver list.
Usage
Creating a Budget
- Navigate to :menuselection:`Budget Control --> Budgets`.
- Click :guilabel:`New`.
- Fill in the required fields:
- Budget Level: Select the organisational level.
- Period Type: Annual, Quarterly, or Monthly.
- Date Range: Start and end dates for the budget period.
- Total Budget: Allocated amount in the company currency.
- Optionally link a department, product category, project, product, or analytic account.
- Add threshold rules in the :guilabel:`Thresholds` tab.
- Click :guilabel:`Activate` to put the budget in effect.
Important
Budgets must be in Active state and their date range must cover the purchase order date for validation to trigger.
Assigning a Budget to a Purchase Order
Open a purchase order and select a budget in the Budget field on the order header. Optionally override the budget on individual order lines to split the cost across multiple budgets.
When the order is confirmed (:guilabel:`Confirm Order`), the module:
- Evaluates all assigned budgets for threshold breaches.
- Creates an approval request if a require_approval threshold is breached, then blocks confirmation.
- Hard-blocks confirmation if a block threshold is breached.
- Creates idempotent commitment records for the confirmed order amount (one per budget assignment).
Budget Tracking
The budget form displays real-time financial positions:
| Field | Description |
|---|---|
| Total Budget | Allocated amount for the period. |
| Committed Amount | Amounts reserved by confirmed purchase orders (net of released commitments). |
| Spent Amount | Amounts captured from posted vendor bills. |
| Available Amount | Remaining budget: Total − Committed − Spent. |
| Utilisation % | (Committed + Spent) / Total × 100 |
Budget Status Indicators
The list view uses colour-coded row decorations:
- Red row: Utilisation ≥ 100% (over-budget)
- Warning row: Utilisation ≥ 80%
- Normal: Utilisation < 80%
Commitment Tracking
A commitment record is created for each purchase order assignment to a budget. Commitments transition through three states as vendor bills are posted:
| State | Description |
|---|---|
| active | Full commitment outstanding; no vendor bills posted yet. |
| partial | One or more vendor bills posted, partially releasing the commitment. |
| released | All vendor bills posted; full commitment released. |
Note
Cancelling a purchase order releases all its active commitments immediately.
Vendor Bill Spend Capture
When a vendor bill linked to a budgeted purchase order is posted, the module automatically:
- Creates a spend line on the budget for each relevant bill line.
- Converts the amount to the budget currency if currencies differ (using the bill date rate).
- Updates the commitment's released_amount (transitioning to partial or released state as appropriate).
When a vendor bill is reset to draft, all corresponding spend lines are removed and commitment states are recalculated.
Note
This module does not create accounting journal entries. It reads bill amounts for budget tracking purposes only.
Budget Adjustments
To request a budget adjustment:
- Open the budget and navigate to the :guilabel:`Adjustments` tab, or go to :menuselection:`Budget Control --> Adjustments`.
- Click :guilabel:`New` and choose Increase or Decrease.
- Enter the amount and a reason, then click :guilabel:`Submit for Approval`.
A Budget Manager can then :guilabel:`Approve` and :guilabel:`Apply` the adjustment, which updates the total_budget on the budget header. Decreasing the budget below committed_amount + spent_amount is prevented.
Budget Transfers
To move funds between two active budgets:
- Open the source budget and click :guilabel:`Transfer Funds` (Budget Manager only).
- Select the target budget (must share the same company currency).
- Enter the transfer amount (must not exceed the source budget's available amount) and a reason.
- Click :guilabel:`Transfer Funds` to execute.
Warning
Budget transfers are immediate and irreversible. Two adjustment records are created automatically — a decrease on the source and an increase on the target — for full auditability.
Approval Requests
When a purchase order breaches a require_approval threshold, an approval request is created automatically and the designated approvers are notified by email.
To review and act on pending requests, navigate to :menuselection:`Budget Control --> Approval Requests`.
The requester is notified by email once the request is approved or rejected. If approved, the purchase order can be confirmed manually.
Burn-Down Dashboard
Navigate to :menuselection:`Budget Control --> Reporting --> Budget Burn-Down` to open the interactive OWL dashboard. For a selected budget, the dashboard displays:
- Daily cumulative spend over the last 30 days
- Remaining budget trend
- Current utilisation percentage
- Daily burn rate
- Projected budget exhaustion date
Workflow States
| State | Description |
|---|---|
| Draft | Budget under construction; validation not yet active. |
| Active | Budget in effect; PO validation and spend capture enabled. |
| Closed | Budget period ended; record is read-only. |
| Cancelled | Budget voided; no further changes permitted. |
Technical Details
Models
| Model | Description |
|---|---|
| grev.purchase.budget | Primary budget header with allocation, dimensions, and computed amounts. |
| grev.purchase.budget.line | Actual spend lines created from posted vendor bills. |
| grev.purchase.budget.commitment | Commitment records created at PO confirmation; released as bills are posted. |
| grev.purchase.budget.adjustment | Increase/decrease requests with draft → submit → approve → apply workflow. |
| grev.purchase.budget.threshold | Configurable utilisation thresholds with notify / require_approval / block actions. |
| grev.purchase.budget.approval.request | Approval requests auto-created when a require_approval threshold is breached. |
| grev.purchase.budget.transfer.wizard | Transient wizard for inter-budget fund transfers. |
Key Fields
Purchase Budget (grev.purchase.budget)
- name: Auto-generated reference (sequence BUD-XXXXX)
- budget_level: organisation | department | category | project | product
- period_type: annual | quarterly | monthly
- date_from / date_to: Budget validity period
- total_budget: Allocated amount (non-negative)
- committed_amount: Sum of net commitments (amount − released_amount, computed stored)
- spent_amount: Sum of spend lines (computed stored)
- available_amount: total_budget − committed_amount − spent_amount (computed stored)
- utilization_percent: (committed + spent) / total_budget × 100 (computed stored)
- forecast_amount: Manual what-if forecast entry for variance analysis
- analytic_account_id: Optional analytic account for cross-module reporting
- state: draft | active | closed | cancelled
Calculation Formulas
Available Budget:
Available = Total Budget − Committed − Spent
Budget Utilisation:
Utilisation % = ((Committed + Spent) / Total Budget) × 100
Variance:
Variance Amount = Total Budget − Forecast Amount Variance % = (Variance Amount / Total Budget) × 100
Savings:
Savings % = Savings Amount / Total Budget × 100
Integration Points
purchase.order (core Odoo Purchase)
- button_confirm() is extended to run budget validation and create commitments.
- button_cancel() is extended to release all active commitments.
account.move (core Odoo Accounting)
- action_post() is extended to capture spend lines from vendor bills.
- button_cancel() is extended to reverse spend lines when a bill is reset to draft.
grev_od_spend_analytics (optional)
Aggregated spend vs budget reporting consumes budget data via read-only access.
Performance
- Budget validation at PO confirmation: < 2 seconds.
- Computed amounts use store=True for query performance.
- Key dimension fields (department_id, category_id, analytic_account_id) are indexed.
- Commitment and spend line creation is idempotency-guarded to prevent duplicates.
Troubleshooting
Budget not validating on PO
Ensure the budget is in Active state and its date_from / date_to range covers the purchase order date. Verify the budget is assigned to the PO header or the relevant order line.
Committed amount not updating after PO confirmation
Verify the purchase order has the correct budget assigned. Check that no duplicate commitment already exists (commitments are idempotency-guarded per PO + budget).
Spend lines not appearing after posting a vendor bill
Confirm the vendor bill has a corresponding purchase order with a budget assigned. Only in_invoice and in_refund move types are processed.
Cannot apply a budget decrease
The module prevents decreasing total_budget below committed_amount + spent_amount. Release or cancel pending commitments before applying the decrease.
Cannot execute a fund transfer
Transfers require both budgets to be in Active state and share the same currency. The transfer amount must not exceed the source budget's available amount.
See Also
- :doc:`../grev_od_purchase_esourcing/doc/index` — RFQ and tender management
- :doc:`../grev_od_purchase_negotiation/doc/index` — Negotiation dashboard
- :doc:`../grev_od_spend_analytics/doc/index` — Spend analytics and KPIs
- :doc:`../grev_od_purchase_intel/doc/index` — Supplier intelligence
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module