Vendor Bill Match Check
Three-way match between the purchase order, the receipt and the vendor bill, with a company-level tolerance and one exception report you check before you pay.
3-way match for vendor bills, on the bill itself
Odoo will happily post a vendor bill that does not match what you ordered or what you actually received. This module runs a three way match (purchase order, goods receipt, vendor bill) on every bill line linked to a purchase order line and puts every mismatch on one screen, before that bill gets paid.
It does not block the post, it does not touch the accounting entry, and it does not run an approval workflow. It builds an exception row: what was ordered, what was received, what was billed, and by how much they disagree. Someone in accounting looks at the exceptions and decides what to do about them.
What's included
- A bill match check that runs automatically the moment a vendor bill is posted, and again on demand from a "Check bill match" button on the bill.
- One exception row per mismatching bill line, carrying the ordered quantity, the received quantity, the billed quantity, the ordered unit price, the billed unit price, the quantity variance and the price variance.
- Five exception types: billed over received, billed over ordered, price over ordered, no purchase order on the bill line, and not received at all.
- A quantity tolerance and a price tolerance, set once per company under Accounting settings. A variance inside the tolerance is not an exception; it is simply not reported.
- A smart button on the vendor bill showing the exception count, so you see it without opening a second screen.
- One list view with a pivot, grouped by exception type and by vendor, with a default filter for what is still unresolved.
- A "Resolved" flag with who resolved it and when. Resolving is an acknowledgement with an audit trail, not a wizard and not a correction to the ledger - the bill itself is never touched.
- Recompute is idempotent: running the check again after a bill's lines have not changed leaves the same rows in place, it does not duplicate them.
- Security tied into the standard Odoo accounting groups, Invoicing and Accounting Manager. No separate access group to learn or assign.
- Multi-company data isolation by record rule, so a user working across companies never sees another company's exception rows.
- A business guide and a technical guide, each in English and Standard Arabic, included with the module under its own
doc/folder. - Depends on Odoo's own
account,purchaseandstockmodules only. No OCA dependency, no extra library.
What this does not do, and where the tolerance stops
Odoo Online is not supported. This module installs custom Python code. Odoo Online, the SaaS hosting, does not accept third-party modules that carry Python. It runs on Odoo.sh or on a self-hosted install. If your database is on Odoo Online, this module will not install there. Check before buying.
Single currency only, in this version. The match compares within one currency. When a bill line's currency is different from its purchase order line's currency, the row is flagged with a "Currency Mismatch" marker, the price comparison is skipped for that line, and the quantity comparison is still reported. Version one does not convert currencies to compare a price, and it does not attempt a landed-cost-inflated unit cost. A wrong number is worse than a missing one, so a comparison that cannot be made honestly is not made at all.
No approval workflow, no blocked posting. This is a report, not a gate. Posting a vendor bill is never blocked, delayed or refused because of an exception. Nobody has to approve anything before a bill can be paid. If you need a bill to be held for approval, this module is not that.
The bill itself is never edited. No field on the vendor bill, its lines, or the journal entry it creates is written by this module. Everything it produces lives on its own model, next to the bill.
Creating and resolving an exception row needs Accounting Manager access. Anyone with the standard Invoicing access can see the smart button, the exception count and the list, and can read every row. Recomputing the check, and marking a row resolved, needs the Accounting Manager group - the same group Odoo already uses to close a period. There is no third, module-specific group to assign.
Compatibility
Every series below is built and tested on a real database of that version, not assumed from another branch.
| Odoo version | Status |
|---|---|
| 19.0 | Supported. Automated test suite included under tests/. |
| 18.0 | Supported. Installed and the module's own suite run on a real 18.0 database: 15 tests, no failures and no errors. |
| 17.0 | Supported. Installed and the module's own suite run on a real 17.0 database: 15 tests, no failures and no errors. |
| 16.0 | Supported. Installed and the module's own suite run on a real 16.0 database: 15 tests, no failures and no errors. |
| Odoo Online | Not supported. This module carries custom Python code, which Odoo Online does not accept. Use Odoo.sh or a self-hosted install. |
Documentation
Four documents ship inside the module, under its
doc/ folder: a business guide and a technical
guide, each in English and in Standard Arabic. The business
guide covers the workflow from purchase order to receipt to
bill, the tolerance setting, the exception report screen, and
what the currency mismatch flag means. The technical guide
documents the model, every field, the security groups and
record rules, how the match is computed line by line, and how
to extend the module with an extra exception type.
FYD: built and supported by Mohamad Fayad
Odoo backend developer, Abu Dhabi. Four years building custom Odoo for government, non-profit and private-sector clients in the UAE (Python, XML, JavaScript and PostgreSQL), currently leading the technical side of an Odoo 16 to 19 migration.
FYD is his practice. Every module under it is written and maintained by one developer, not assembled by a catalogue publisher, and support is answered in English and Arabic in Gulf hours.
Questions before you buy: support@mohamadfayad.com
Support
Support requests go to support@mohamadfayad.com, answered in English and Arabic during Gulf hours. The store's refund window covers the usual case: if something advertised on this page is missing or does not work as described, that is a refund, not a back-and-forth. Read "What this does not do" above before buying - this module reports mismatches, it does not block a post, run an approval, or edit the bill.
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Inventory (stock)
• Invoicing (account) • Purchase (purchase) • Discuss (mail) |
| Lines of code | 363 |
| Technical Name |
fyd_bill_match |
| License | OPL-1 |
| Website | https://mohamadfayad.com |
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