How we imagine the pricing engine
A quote line goes in as (client, SKU, quantity). This is the path it takes to come out as a final price — built entirely from rules confirmed this week, not invented from scratch.
✅ confirmed ready to build now
🔧 needs build rule known, no data model yet
❓ open genuinely unresolved, needs a person
0
Routing — which Odoo company owns this order?
✅ SPAIN-1
- Proposal only, no sale yet → Odoo Spain
- Actual sale (dropship) → Odoo Portugal (Aronlight España as customer, real client only in delivery address)
- Not Spain-related → default company (Portugal)
↓
1
Resolve "Lista de Preços"
✅ LIQUIDO-1
Read the order's own pricelist first. Fall back to the client's default (
property_product_pricelist) only if the order doesn't have one yet.
Confirmed real 2026-07-13 on Carla's Dinolux order: the order used a different pricelist ("sem desconto visível") than the client's stored default — this is exactly why a naive "always use the client default" approach would have gotten this one wrong.
↓
2
Look for a líquido (fixed) price
✅ LIQUIDO-2 / LIQUIDO-3
Search the resolved pricelist for a product-specific fixed-price rule.
- 2+ quantity tiers on this product? → pick the highest tier ≤ requested quantity
- Found a líquido price? → use it, skip step 3 entirely
↓
3
Fallback — standard % discount
✅ LIQUIDO-2
Only reached if step 2 found nothing. Uses the pricelist's single global rule. Verified: one pricelist has exactly 231 fixed-price rules + 1 global percentage rule — this is Odoo's own rule-matching order, not custom logic we'd have to build.
↓
4
Second discount, market-specific
🔧 DISC-1
- Spain → ad hoc, salesperson-entered. Never computed — just preserved.
- Italy → fixed, per client. No storage exists yet (
aronlight#398). - Portugal / France → unknown. No evidence either way.
↓
5
Known gaps — flag, don't silently trust
❓ LIQUIDO-4 / LIQUIDO-5
- Sales-team ad hoc exceptions — trigger unknown, route to a human
- "Caixa fechada" (box quantity) — the data exists (
product.packaging, 215+ products), but it's not confirmed to affect price on the one product we checked - Pricelist rules may get hand-tuned over time — Carla's case shows a live example
↓
6
Display — show the discount, or hide it?
🔧 needs UI
Per-user default + always-available per-case override. The "sem desconto visível" pattern found this week suggests this may already be half-built at the Odoo level — the platform may just need to surface it, not invent it.
Rules confirmed so far
| ID | Rule | Confidence | Evidence |
|---|---|---|---|
SPAIN-1 | Proposal (Odoo Spain) vs. sale (Odoo Portugal) routing | HIGH | Confirmed by Adriana directly |
LIQUIDO-1 | Every pricelist duplicated across PT + ES companies, same name | HIGH | WhatsApp + Odoo data (40/43 pairs confirmed) |
LIQUIDO-2 | Líquido price always wins over computed discount | HIGH | WhatsApp + Odoo data (231 fixed + 1 global rule) |
LIQUIDO-3 | Volume tiers = líquido prices gated by min_quantity | HIGH | Odoo data, 66/232 products confirmed |
OD-4 | Tabela vs. Odoo source-of-truth split | HIGH (code) | Read directly in the matching code |
DISC-1 | Second-discount semantics are market-specific | MEDIUM | Spain + Italy confirmed; PT/France open |
LIQUIDO-4 | Ad hoc price-table exceptions — not yet codifiable | LOW | Explicitly "não sei" from Nuno — needs sales team |
LIQUIDO-5 | "Caixa fechada" — data location confirmed, pricing link not | MEDIUM (location) / LOW (link) | Odoo data (product.packaging) |
What we still need from this call
In priority order — the first two are the ones most likely to change what gets built next.
- Is "sem desconto visível" deliberate infrastructure, or ad hoc per client? This is very likely the answer to the "hide discount" feature request from back office. If it's standard, we may just need to expose it, not build it.
- Do pricelist rules get edited/retuned over time? Carla's Dinolux order shows a real case where replaying today's rule gives a different price than what was actually charged in July. Is there a change history we can access?
- What are the known ad hoc pricing exceptions (
LIQUIDO-4)? Nuno pointed to the sales team for this — if you know, this is the single biggest gap left in what's buildable today. - Why is "ITALIA 50+20%" assigned to zero customers? The combined pricelist exists and works — just needs assignment, unless something's blocking it.
- The Spain +25% markup (some ES clients see prices above PT list) — legitimate separate base pricing, or a data error nobody's caught?
- Portugal / France second-discount behavior — do either follow Spain's ad hoc pattern, Italy's fixed pattern, or something else entirely?