| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Invoicing (account) • Purchase (purchase) |
| Lines of code | 2300 |
| Technical Name |
grev_od_purchase_comparator |
| License | OPL-1 |
| Website | https://www.grevlin.com |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Invoicing (account) • Purchase (purchase) |
| Lines of code | 2300 |
| Technical Name |
grev_od_purchase_comparator |
| License | OPL-1 |
| Website | https://www.grevlin.com |
Purchase ComparatorFrom Raw Supplier Quotes to TCO-Ranked, Compliance-Checked, Approval-Ready Decisions — All in Odoo.
|
|
|
|
|
|
|
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 Comparator
Evaluate every supplier offer on price, TCO, and risk — then negotiate from a position of strength.
The Purchase Comparator module provides a structured, data-driven workflow for multi-supplier bid evaluation inside Odoo. It aggregates raw price quotes, normalises pricing across payment terms and currencies, computes full landed cost and total cost of ownership (TCO), runs weighted multi-criteria scoring with what-if scenarios, tracks multi-round negotiations, and coordinates split award allocation — all with a complete approval trail.
Note
grev_od_purchase_esourcing is an optional dependency used for the bid import wizard. Integration with grev_od_purchase_intel, grev_od_purchase_negotiation, and grev_od_purchase_compliance is also optional but recommended.
Overview
Key Features
- Offer aggregation — import bids from eSourcing events or enter manually; overwrite or merge on re-import
- Volume price tiers — auto-selects applicable price break based on requested quantity
- MOQ compliance & packaging — flags non-compliant offers, calculates overage cost and packaging efficiency
- Payment term NPV adjustment — time-value-of-money comparable price across different payment terms using financing rate and delay
- Currency risk modelling — applies a hedge cost percentage per offer to model FX exposure in TCO ranking
- Landed cost breakdown — freight, customs, inspection, warranty, admin overhead, carbon cost per offer line; Incoterm defaults auto-populate freight/customs percentages
- Total Cost of Ownership — single per-unit TCO figure combining all cost components; the definitive comparison metric
- Quote expiry tracking — per-line validity dates, visual expired flags, daily cron auto-marks comparisons expired
- Benchmark price tracking — configure a benchmark price and source; computes price advantage vs. benchmark per offer and overall
- Weighted multi-criteria scoring — 12 configurable criteria types (price, TCO, NPV price, lead time, quality, MOQ, delivery reliability, landed cost, currency risk, compliance, and more) with custom weights and direction (lower-better / higher-better)
- What-if scenario modelling — create named scenarios with weight overrides; apply any scenario to recompute rankings instantly without losing the original
- Supplier intel integration — auto-fetch on-time rate, quality score, avg. historical price, and risk rating from grev_od_purchase_intel
- Compliance status — per-line compliance flag and note from grev_od_purchase_compliance; non-compliant suppliers are penalised in scoring
- Multi-round negotiation tracking — snapshot each negotiation round; per-supplier price delta computed automatically vs. prior round
- Split award allocation — wizard proposes multi-supplier volume split with concentration limits; buyer confirms and documents rationale per allocation
- Threshold-based approval workflow — amount and quantity thresholds per company; manager approval required before negotiation handoff above threshold
- Negotiation handoff — push best offer or bulk-send multiple comparisons to the Negotiation Dashboard; full comparison context travels with the handoff
Configuration
Installation
- Install the module from :menuselection:`Apps` (search for grev_od_purchase_comparator).
- Ensure the following dependencies are installed:
- purchase — Odoo Purchase
- grev_od_purchase_esourcing — eSourcing (optional; required only for bid import)
- Optional integrations (install if available):
- grev_od_purchase_intel — Supplier Intelligence (auto-fetch intel per offer)
- grev_od_purchase_negotiation — Negotiation Dashboard (negotiation handoff)
- grev_od_purchase_compliance — Compliance (per-supplier compliance flags)
Security Groups
The module provides three access levels:
| Group | Permissions |
|---|---|
| Comparator User | Read-only access to all comparisons, lines, and criteria |
| Comparator Analyst | Create, edit, and calculate comparisons; import bids; run intel fetch |
| Comparator Manager | Full CRUD, approve/reject comparisons, delete records, manage criteria |
Company Approval Thresholds
To configure approval thresholds for your company:
- Go to :menuselection:`Settings --> General Settings --> Purchase Comparator`.
- Set :guilabel:`Approval Amount Threshold` (default: 10,000.00 in company currency).
- Optionally set :guilabel:`Approval Quantity Threshold`.
- Comparisons whose best-offer total exceeds either threshold will require manager approval before the :guilabel:`Send to Negotiation` action becomes available.
Evaluation Criteria
Default criteria are created during installation. To customise them:
- Go to :menuselection:`Purchasing --> Comparator --> Evaluation Criteria`.
- Adjust the :guilabel:`Weight` and :guilabel:`Direction` for each criterion.
- Add new criteria using the 12 available :guilabel:`Criteria Type` options.
Important
Weights do not need to sum to 100 %. The scoring engine normalises each criterion's min-max score and applies weights relatively. An advisory warning appears if weights deviate significantly from 100 %.
Usage
Creating a Comparison
- Navigate to :menuselection:`Purchasing --> Comparator --> Comparisons`.
- Click :guilabel:`Create`.
- Select the :guilabel:`Product` to compare and specify the :guilabel:`Requested Qty` and :guilabel:`Unit of Measure`.
- Optionally link to a :guilabel:`RFQ Event` from eSourcing and set a :guilabel:`Target Price` and :guilabel:`Benchmark Price` for savings tracking.
- Click :guilabel:`Save`.
Importing Bids from eSourcing
- With a comparison open, click :guilabel:`Import Bids`.
- Select the :guilabel:`eSourcing Event` from which to import.
- Choose the bids to import from the available list.
- Toggle :guilabel:`Overwrite Existing` to replace matching lines on re-import.
- Click :guilabel:`Import`.
Tip
You can also add lines manually by clicking :guilabel:`Add a line` in the Comparison Lines tab.
Volume Price Tiers
For each comparison line:
- Expand the :guilabel:`Price Tiers` sub-table on the line.
- Add rows with :guilabel:`Min Qty` and :guilabel:`Unit Price` for each price break.
- The system marks the highest applicable tier as active based on the comparison's :guilabel:`Requested Qty` and uses that price as the effective unit price.
NPV Adjustment & Currency Risk
On each comparison line:
- Set :guilabel:`Payment Term` and :guilabel:`Payment Delay (Days)` to compute the NPV-adjusted price using the configured :guilabel:`Financing Rate (%)`.
- Set :guilabel:`Supplier Currency` and :guilabel:`Hedge Cost (%)` to compute currency risk cost, which feeds into TCO.
Landed Cost & TCO
On each comparison line, expand the :guilabel:`Landed Cost` section:
- Select the :guilabel:`Incoterm` — freight and customs percentage defaults are populated automatically from the incoterm configuration.
- Enter :guilabel:`Freight`, :guilabel:`Customs`, :guilabel:`Inspection`, :guilabel:`Warranty`, :guilabel:`Admin Overhead`, and :guilabel:`Carbon Cost`.
- The system computes :guilabel:`Total Landed Cost` and then :guilabel:`Total TCO / Unit` combining all cost components.
Weighted Scoring & Ranking
- After entering all offers, click :guilabel:`Calculate`.
- The scoring engine normalises each criterion across all lines (min-max scaling) and multiplies by the configured weight and direction.
- Each line receives a :guilabel:`Weighted Score` and a :guilabel:`Rank`.
- The line with the highest score is marked as :guilabel:`Best Offer`.
- Click :guilabel:`Recommend` to promote the best offer and move the comparison to Recommended state.
What-If Scenarios
- In the :guilabel:`What-If Scenarios` tab, click :guilabel:`Add a line`.
- Give the scenario a name (e.g. "Finance Priority — lowest TCO").
- Add scenario lines to override individual criterion weights.
- Click :guilabel:`Apply Scenario` to recompute rankings with the overridden weights. The original weighted scores are preserved; the scenario result is posted to the chatter.
Multi-Round Negotiation Tracking
- Click :guilabel:`New Round` to create a negotiation round snapshot.
- The current line scores, prices, and TCO values are copied into the round.
- After a negotiation session, update the comparison lines with revised offers and recalculate. The next round will automatically compute price deltas vs. the prior round.
Split Award
- Click :guilabel:`Split Award` to open the wizard.
- Set a :guilabel:`Max Single Supplier %` concentration limit (default: 70 %).
- Optionally set a minimum reliability threshold.
- Click :guilabel:`Propose Split` to receive an automatic allocation based on weighted scores.
- Adjust allocations, set the :guilabel:`Primary Reason` per supplier, and click :guilabel:`Confirm`.
Note
Split award allocations appear in the :guilabel:`Award Allocations` tab of the comparison and are available to the Negotiation module and AI Assistant.
Approval Workflow
When a comparison's best-offer total exceeds the configured company threshold:
- The :guilabel:`Recommend` action transitions the approval state to Pending Approval.
- A manager receives an activity notification to review.
- The manager clicks :guilabel:`Approve` or :guilabel:`Reject` with an optional note.
- Only approved comparisons can proceed to :guilabel:`Send to Negotiation`.
Sending to Negotiation
- Click :guilabel:`Send to Negotiation` on a Recommended (and approved, if required) comparison.
- The best-offer line and full comparison context are pushed to the Negotiation Dashboard.
- State transitions to Sent to Negotiation; a reference is stored in :guilabel:`Negotiation Ref`.
- To send multiple comparisons at once, use :menuselection:`Action --> Bulk Negotiate` from the list view.
Technical Details
Models
| Model | Description |
|---|---|
| grev.purchase.comparator.result | Main comparison record — product, state, best offer, approval, benchmark |
| grev.purchase.comparator.line | Supplier offer line — all pricing, cost, scoring, intel, and compliance fields |
| grev.purchase.comparator.criteria | Weighted evaluation criteria — type, weight, direction |
| grev.purchase.comparator.tier | Volume price break per offer line |
| grev.purchase.comparator.scenario | What-if scenario header with weight override lines |
| grev.purchase.comparator.scenario.line | Per-criteria weight override for a scenario |
| grev.purchase.comparator.round | Negotiation round snapshot header |
| grev.purchase.comparator.round.line | Per-supplier snapshot with price delta vs. prior round |
| grev.purchase.comparator.award | Split award allocation — percent, quantity, amount, rationale |
| grev.purchase.import.bid.wizard | Transient wizard — import bids from eSourcing event |
| grev.purchase.split.award.wizard | Transient wizard — propose and confirm split award allocations |
| grev.purchase.bulk.negotiate.wizard | Transient wizard — bulk send multiple comparisons to negotiation |
State Flow
Draft ──► Calculated ──► Recommended ──► Sent to Negotiation
│
(if above threshold)
│
Pending Approval ──► Approved ──► Recommended
└──► Rejected ──► Draft
Comparison Line Computed Fields
The following fields are computed server-side from inputs on the line:
- applicable_unit_price — tier-selected unit price or base unit price
- npv_adjusted_price — NPV of payment-adjusted effective unit price
- currency_risk_cost — hedge cost percentage applied to effective price
- moq_compliant — True if quantity ≥ MOQ
- moq_overage_cost — extra cost when quantity < MOQ
- packaging_efficiency — ordered qty / packaging qty ratio
- total_landed_cost — sum of freight, customs, inspection, warranty, overhead
- total_tco — effective price + currency risk + landed cost + carbon + admin
- weighted_score — normalised multi-criteria weighted score (0–100)
- rank — position among lines on the comparison
- is_best_offer — True for the highest-ranked line
Integration Points
Upstream:
- grev_od_purchase_esourcing — optional; import bids from eSourcing events via wizard
- grev_od_purchase_intel — auto-fetch supplier performance data (on-time, quality, risk)
- grev_od_purchase_compliance — per-supplier compliance flag and note
Downstream:
- grev_od_purchase_negotiation — negotiation handoff with full comparison context
- grev_od_purchase_ai_assistant — aggregated comparison results available to AI insights
Cross-Module Service Calls
The following calls use try/except guards so the module degrades gracefully if the optional dependency is not installed:
# Fetch supplier intel (optional) intel = self.env['grev.supplier.intel'].search([('partner_id', '=', line.partner_id.id)]) # Check compliance status (optional) compliance = self.env['grev.purchase.compliance.service'].run_compliance_checks( line.partner_id, 'purchase_award' )
See Also
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