Daily updates from Odoo
Monday, April 27, 2026
11 changes · 17.0
Enhancements to existing features
This update expands Odoo's ability to generate Peppol invoices by adding optional fields. This improves compliance with industry standards and allows for more detailed invoice data to be transmitted. It's a backport of a previous improvement, ensuring continued support for Peppol invoicing.
Original PR description
Backport of #245242 OPW-4963157 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This update fixes a problem where the PDF attachment for invoices sent via Peppol would disappear. The issue stemmed from conflicting updates to the PDF's data model, causing errors. This change ensures the PDF attachment is correctly linked to the invoice, guaranteeing proper invoice processing.
Original PR description
**Steps to reproduce:** * Install **Accounting**, **Documents**, and **Peppol** modules. * Enable `Workspace` in Accounting settings to automatically sync documents. * Create and confirm a Customer…
**Steps to reproduce:** * Install **Accounting**, **Documents**, and **Peppol** modules. * Enable `Workspace` in Accounting settings to automatically sync documents. * Create and confirm a Customer Invoice. * Click 'Send & Print', ensure the Peppol checkbox is ticked, and send. **Observed behavior:** * The PDF preview on the invoice disappears. * `invoice_pdf_report_id` on the move is empty. * A `KeyError: 'proforma_pdf_attachment'` may occur in certain fallback conditions because the expected PDF vanished. **Cause:** * When sending an invoice via Peppol, `account_peppol` calls `message_post` to log the API transmission in the chatter. * This chatter message creates new attachments. `documents.document` instantly creates corresponding Documents for these attachments. * Immediately after, Peppol intentionally modifies these attachments, changing their `res_model` to `mail.message`. * The associated Document's `res_model` is a computed field that mirrors its attachment, so the Document's `res_model` also dynamically updates to `mail.message`. * Finally, the core send flow finishes generating the actual invoice PDF (`res_model='account.move'`) and assigns it as the main attachment. * The `documents_account` override intercepts this assignment and links the new PDF to the existing Document. * Inside `documents.document.write()`, a versioning logic detects that a new attachment (`account.move`) is being linked to a Document (`mail.message`). To enforce consistency, it forcefully overwrites the new PDF attachment's `res_model` to `mail.message`. * This breaks the `res_model` of the PDF, preventing `_compute_linked_attachment_id` from finding it, thereby nullifying `invoice_pdf_report_id`. **Fix:** * In `documents_account`, guard the document reuse path with a check that the found document still belongs to `account.move`. * If the document has drifted to any other `res_model` (e.g. `mail.message` after a Peppol chatter message), skip reuse entirely and let `_update_or_create_document` create a fresh document if the document is not exist or update exesting, correctly-linked document for the invoice PDF instead. * This avoids fighting the versioning logic after the fact and addresses the root cause: a drifted document should never be reused as the invoice PDF document. opw-5936331
This update ensures that the 'Source' (origin) field is correctly populated on replacement invoices generated after a cancellation request. Previously, this information was missing, hindering traceability. The fix maintains a link to the original Sales Order, improving document accuracy and compliance.
Original PR description
### Issue before this commit: The "Source" (origin) field was missing from the PDF of replacement invoices. While the original invoice correctly displayed the Sales Order reference, the new invoice…
### Issue before this commit: The "Source" (origin) field was missing from the PDF of replacement invoices. While the original invoice correctly displayed the Sales Order reference, the new invoice generated through the request cancel process had an empty origin field. ### Steps to reproduce the issue: 1. Download Sales and l10n_mx 2. Set a UNSPSC Category for one product 3. Go to Sales, create a new Quotation and confirm it 4. Create invoice, confirm and send & print 5. Request cancel button -> create replacement invoice 6. In the new invoice there is no source origin invoice ### Cause of the issue: The invoice_origin field is defined with copy=False. Since the replacement logic uses the copy_data method without explicitly passing the origin value, the field was automatically cleared during the creation of the new invoice. ### Reason to introduce the fix: To ensure document traceability, the fix explicitly passes the invoice_origin from the original invoice to the replacement. This maintains the link to the Sales Order in the database and ensures the "Source" label appears on the printed PDF. opw-6070016
This update corrects a bug in the `l10n_co_edi` module that incorrectly flagged invoice dates as invalid due to timezone differences. The fix ensures invoice dates are validated accurately based on Colombia's local time (Bogota), preventing reporting issues with DIAN.
Original PR description
**Steps to reproduce:** * Install `l10n_co_edi` module with DEMO DIAN mode enabled. * Go to Accounting > Vendor > Bills and create a new bill. * Select any Colombian partner different from…
**Steps to reproduce:** * Install `l10n_co_edi` module with DEMO DIAN mode enabled. * Go to Accounting > Vendor > Bills and create a new bill. * Select any Colombian partner different from `Consumidor Final`. * Set the invoice date to 6 days in the past. * Select the DIAN Support Documents journal and a product with UNSPSC category. * Confirm the bill and click `Send Support Document to DIAN` after 5 PM Colombia time. **Observed behavior:** * An error is raised stating the issue date cannot be older than 6 days or more than 6 days in the future, even though the invoice date is within the allowed window in Colombia local time. **Cause:** * The date window validation in `_check_move_configuration` used `fields.Datetime.now()` which returns UTC time. Since Colombia is UTC-5, after 5 PM local time the UTC clock has already rolled over to the next calendar day, making a 6-day-old invoice appear 7 days old and failing the validation incorrectly. **Fix:** * Convert the current UTC datetime to the `America/Bogota` timezone and extract its local date before computing the allowed date window. * Compare directly against `move.invoice_date` (a `date` field) instead of using `fields.Datetime.to_datetime()`, keeping the comparison consistent as `date` vs `date`. opw-6011502
This update resolves an error in the Luxembourg VAT reports (FAIA) caused by incorrect TaxType values. The fix ensures the required 'TVA' TaxType is used, aligning with Luxembourg tax regulations and XSD specifications. This prevents report generation failures and ensures accurate VAT reporting.
Original PR description
This is one of several commits fixing the FAIA xml export. The customer in ticket [opw-5427296](https://www.odoo.com/odoo/unassigned-tasks/5427296) received several errors which mention that the `TaxType` element should be 'TVA'. This is corroborated by one of these elements in the XSD files for the FAIA report. The XSD files can be found at the link below. https://pfi.public.lu/dam-assets/backup/FAIA/FAIA/XSD_Files.zip opw-6118272 [link](https://www.odoo.com/odoo/project.task/6118272)
This update resolves a bug where changes to time off types within an allocation didn't trigger necessary validation checks. Previously, updating the time off type didn't prevent the creation of duplicate overtime adjustments. The fix ensures accurate validation and prevents incorrect overtime calculations, improving data integrity.
Original PR description
Steps to reproduce: ------------------------------------- 1. Install `hr_holidays_attendance` module 2. Time off > configurations > Time off types 3. Create new time off type as follows: * Set…
Steps to reproduce: ------------------------------------- 1. Install `hr_holidays_attendance` module 2. Time off > configurations > Time off types 3. Create new time off type as follows: * Set Approval to Approved by time off officer * Change Take time off In to Hours 4. Save the record and enable Deduct Extra Hours 5. Go to Management > Allocations 6. Create new allocation with created time off type and select 'Audrey Peterson' in Employee 7. Try to save record > Validation Error > Discard changes 8. Change time off type to Paid Time Off > add 'Audrey Peterson' > save record 9. Now change Time Off type to Created Time Off type > Save Observation: ------------------------------------- No Validation Error raised, as the employee and time off type are still the same as they were during creating allocation. Issue: ------------------------------------- In `write` method, there was no any check for the employee if it has enough overtime hours when we change Time off type (`holiday_status_id`) to overtime-deductible leave type. Check was only present in the `create` method: https://github.com/odoo/odoo/blob/a95c639db68f98351c7162de58a041a1c0ee13c5/addons/hr_holidays_attendance/models/hr_leave_allocation.py#L39-L49 Solution: ------------------------------------- 1. Create new function for validate overtime and to create adjustment 2. Added that function to `create` as well as in `write` method 3. Prevents creating a duplicate overtime adjustment for an allocation that already has one opw-5937185
This update fixes an issue where product discounts weren't accurately calculated when a customer was associated with a pricelist based on another pricelist. Now, the base price from the pricelist is used, ensuring discounts are displayed correctly for customers using these tiered pricing structures. This improves the accuracy of pricing and customer experience.
Original PR description
A customer that belongs to a pricelist that is based on another pricelist sees the price set on the product as the base price used to display the discount Steps to reproduce: 1. Install eCommerce 2.…
A customer that belongs to a pricelist that is based on another pricelist sees the price set on the product as the base price used to display the discount Steps to reproduce: 1. Install eCommerce 2. Go to Settings > Website > Shop - Products and enable "Advanced price rules" 3. Go to Website > eCommerce > Products, create a new product called "test" with price $1000 and publish it to the website 4. Go to Website > eCommerce > Pricelists and create a new pricelist called "pricelist1" with a price rule with a fixed price of $500 5. Create another pricelist called "pricelist2" with Discount Policy "Show public price & discount to the customer", Selectable enabled and with a price rule with Computation "Formula", Based on "Other Pricelist", Other Pricelist "pricelist1" and Discount "50.00" 6. Open the eCommerce, select "pricelist2" and open the product page of product "test" 7. The base price of the product is $1000, it should show $500 Issue: We always use the product price as the base price to compute the discount on a product page Solution: When a user belongs to a pricelist that is based on another pricelist, use the price set on the base pricelist as base price opw-6122009
This update fixes an issue where signatures were incorrectly duplicated on generated order PDFs after a signed order was modified. Moving forward, signatures will only be printed on documents created directly by the signature process, ensuring accurate and consistent order documentation. This improves the reliability of our sales records.
Original PR description
A signed order can be modified afterward while retaining the signature on the newly generated PDF. After this commit, we will only print the signature on the document generated by the signature itself and not on any generated PDF afterwards. opw-6159170
This update ensures the Odoo spreadsheet component is running the latest version (17.0.91). It includes a fix to preserve spaces in data validation fields, improving the accuracy of spreadsheet data entry. This change enhances the overall stability and usability of the spreadsheet functionality.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/03d3725dce [REL] 17.0.91 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/03707771eb [FIX] data_validation: preserve spaces in dv values [Task: 5418098](https://www.odoo.com/odoo/2328/tasks/5418098) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update corrects an issue in the l10n_cz VAT return report, ensuring accurate classification of financial entries. Previously, entries were incorrectly categorized based on amount thresholds. Now, all entries without VAT numbers and those using specific VAT regimes are consistently classified under section A5, regardless of their value.
Original PR description
backport of: 7463184bd3548f0027caf1309707aece3b487d43 Before this commit, the l10n_cz VAT return report classified entries in section A4 if their total amount exceeded 10,000 CZK, and in section A5 if the amount was 10,000 CZK or less. - In l10n_cz, create an invoice with a cz partner without vat, over 10000. - In tax return the entry will be in section A4. With this commit: - Entries with no partner VAT number are now always classified under A5, regardless of the total amount. - Entries using a special VAT regime (l10n_cz_scheme_code), corresponding to Section 89 – travel services and Section 90 – margin scheme) are also always classified under A5, regardless of the amount. opw-4953787
This update prevents unnecessary invitation notifications from being sent when adding attendees to events that have already passed. This improves the user experience by reducing email clutter and ensures that invitations are only triggered for relevant, upcoming events. This change was originally implemented in the 19.0 release.
Original PR description
Backport of fix in 19.0 (https://github.com/odoo/odoo/pull/259844) Prevents invitations to be triggered when adding new attendees to an event in the past. OPW-6125052 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260050