Daily updates from Odoo
Monday, July 20, 2026
16 changes · master
Resolved issues and error corrections
This fixes balance receipt printing for SIX payment terminals after a prior change caused the receipt template to be loaded incorrectly. The receipt layout is now provided as its own template file, restoring the expected balance receipt behavior after the module is upgraded.
Original PR description
odoo/enterprise#104683 broke the balance receipt for six terminals trying to load an html template in a template name param. We fix this by extracting the template in its own file. Note: clients will have to upgrade the module in order to make the template available. task-6391500 Forward-Port-Of: odoo/enterprise#124521
Studio approval rules now handle restricted fields without causing an access error for users who do not have permission to see those fields. This prevents sales order confirmations and similar actions from being unexpectedly blocked while keeping the approval logic in place.
Original PR description
Issue: A studio.approval.rule.domain includes a related field that calls an access rights group that the user who used the action isn't apart of, Is blocked by the filtered_domain. To Replicate: 1) Install studio, sale, Accounting and make sure "account_followup" is installed 2) create a related field on the sales.order form related to "customer -> follow up status" 3) Save 4) Create a "Studio Approval Rule" (studio.approval.rule) with a domain using the new related studio field -> method : "action_confirm" -> approver:admin 5) create a test user with no accounting access rights 6) in an incognito browser try and create a sales order, and then confirm it. it will throw the access rights error Fix: add a sudo to the filtered_domain opw-6316069 Forward-Port-Of: odoo/enterprise#124722 Forward-Port-Of: odoo/enterprise#121856
The POS now loads only the Kenya e-invoicing code records that are actually used by products, instead of fetching entire code lists. This reduces unnecessary data loading and can improve POS startup performance for businesses using the Kenya OSCU localization.
Original PR description
Before `product.unspsc.code` and `l10n_ke_edi_oscu.code` records were loaded without domain, which could lead to loading all records of these models in POS, which is not necessary. This commit adds a domain to the loading of these records, so that only the records that are actually used in the products are loaded in POS. Forward-Port-Of: odoo/enterprise#124154 Forward-Port-Of: odoo/enterprise#123684
This fixes an error that could occur when opening a planning calendar popover in Field Service. The calendar now includes the needed user information so users can view planning details without hitting an unexpected crash.
Original PR description
add the user_ids field to the calendar view because its needed in a popover task: 6358644 Forward-Port-Of: odoo/enterprise#122684
VOIP call smart buttons now open the same full set of related records that they count, covering the customer’s company and related contacts. When creating a new record from a call, the system still defaults to the specific contact from the call, reducing confusion and keeping follow-up work accurate.
Original PR description
Commit [1] change the smart buttons on voip.call to count records from all family of the partner (count all record from all partners from the partner's company). However, the actions on the buttons stay the same, they will only open records from the partner itself. This is confusing, we change it to also show records from the whole partner family. [1]: 16772c5c1e604d6beb514f9e5b166fc0c2f452a7 Task-6379569 Forward-Port-Of: odoo/enterprise#123944
Polish currency rate imports now avoid applying an extra one-day date shift. This prevents rates from being dated too far back now that the system already uses the previous day's rate as required.
Original PR description
In Poland, it is mandatory to use the previous day's currency rate. We used to achieve this by shifting the rate's date by one day. Since https://github.com/odoo/odoo/pull/231948, we already use the previous day's rate, so the shift is no longer needed. See: https://www.odoo.com/mail/message/1118975071 Forward-Port-Of: odoo/enterprise#123849
Service sale order lines generated from planning now let Odoo calculate prices automatically instead of forcing a fixed unit price. This ensures customer or product pricelists are applied correctly, reducing incorrect billing for field service work.
Original PR description
Before this commit, in the method `_generate_service_sale_order_lines` the `price_unit` for sale order lines used an explicitly defined unit price. This prevented the pre-computation of the price. It may cause some issues, for example if there was a pricelist defined on the product, we didn't apply the prices from that pricelist. This commit removes explicit definition of the `price_unit` to let the sale order creation process handle it. [error-941068](https://runbot.odoo.com/odoo/error/941068) Forward-Port-Of: odoo/enterprise#124680
This fixes an error that could interrupt stock operations when using Kenya OSCU e-invoicing modules, especially in kit-related picking flows. The change helps ensure stock moves complete reliably without unexpected tracebacks.
Original PR description
**CAUSE** super()._action_done() delete a record from self, and return a new recordset of stock.moves. We filter the old recordset instead of filtering the new one, leading to an MissingError traceback. **STEP TO REPRODUCE** On a fresh db, install: `l10n_ke,l10n_ke_edi_oscu,l10n_ke_edi_oscu_mrp,l10n_ke_edi_oscu_pos,l10n_ke_edi_oscu_stock,l10n_ke_edi_tremol,l10n_ke_hr_payroll,l10n_ke_hr_payroll_account,l10n_ke_reports` and run `TestKitPicking.test_add_sml_with_kit_to_confirmed_picking`. runbot-241262 Forward-Port-Of: odoo/enterprise#124663
Mexican payroll CFDI generation now includes the employer CURP when the company represents an individual, identified by a 13-character RFC. This prevents validation errors for businesses under fiscal regime 621 and allows affected payslips to be generated correctly.
Original PR description
Issue: ---------------------------------------- There is a fiscal regime where the company is actually an individual but is authorized to generate documents. Steps to reproduce:…
Issue: ---------------------------------------- There is a fiscal regime where the company is actually an individual but is authorized to generate documents. Steps to reproduce: ---------------------------------------- - Install "l10n_mx_hr_payroll_account_edi" - Change the current company fiscal regime to '621' - Add an VAT of length 13 to the current company - Add a CURP number on the current company - In Payroll generate a payslip, validate it - Post the Journal entry - On the payslip, click "Generate CFDI" - An error is returned, saying the Emisor:Curp applies to individuals Cause: ---------------------------------------- An RFC of length 13 means that the sender is an individual. It's intended with the fiscal regime '621'. We add the curp number in the CFDI XML only when `self.company_id.partner_id.is_company` is `False`. Since saas-19.1, `is_company` is computed to be truely if a VAT is present. So as soon as the VAT is entered, the CURP number is absent from the XML. Solution: ---------------------------------------- We change the condition to add the CURP number in the XML: A VAT number of length 13 means the contact is an individual (12 for companies). This is what is used to validate the XML: if the vat is of length 13, then the curp number should be present. opw-6351558 Forward-Port-Of: odoo/enterprise#124868 Forward-Port-Of: odoo/enterprise#124027
The Sendcloud delivery test suite was corrected so it runs in regular CI instead of only nightly checks. This helps catch delivery integration issues earlier, including corrected expectations for multi-package weight handling.
Original PR description
Test class was tagged as external although calls are mocked. This means errors were only caught in nightly and not by CI. Removing the tag requires fixing some of the tests. For `test_multicollo`, we send the average weight of packages instead of the total since 97f82442c9fee7dcb3e8c5e9bacddcd6bb864e11. Forward-Port-Of: odoo/enterprise#121665 Forward-Port-Of: odoo/enterprise#111660
VoIP call screens now hide related record shortcuts when a call is not linked to a customer or contact, preventing errors from unexpected clicks. Subscription shortcuts are also shown consistently with the customer page behavior.
Original PR description
Same as in [1], we don't show smart buttons when no partner to prevent unexpected errors. Also remove `invisible="subscription_count == 0"` to make it same as smart button on res.partner. [1]: 0fbb730e02de22b196a45455f801e96321a75167 Forward-Port-Of: odoo/enterprise#124925 Forward-Port-Of: odoo/enterprise#124579
This update improves how email, SMS, and WhatsApp delivery failures and bounces are reflected in marketing automation campaigns. Businesses get more accurate campaign follow-up behavior and clearer failure information, while related tests were expanded to protect these workflows.
Original PR description
RATIONALE In order to prepare upcoming improvements for marketing automation application, as well as performance improvements, status update from sms / mail / whatsapp is checked, tested and fixed. Fixes are done in master mainly because it would be difficult in stable, and because those are not critical. SPECIFICATIONS See sub-commits for more details. Task-6401319: [mail_*] Fixup mail/sms/WA -> Trace -> MarketAuto update Task-4224152: [marketing_automation] Performance / Scalability
Fixed an issue where using the Off-Cycle filter in the payslips list could trigger an error in debug mode. The payroll screen now handles payslips without a pay run correctly, improving reliability for payroll users.
Original PR description
Before this commit, when the user is in debug mode, goes to payslips list view and applies `Off-Cycle` filter, a traceback is occured saying `Invalid props for component 'PayslipActionHelper': 'payrunId' is not a number`.
The reason is because we search the id of the payrun by parsing the domain applied to fetch payslips displayed inside the list view but `Off-Cycle` filter will apply the following domain: `[('payslip_run_id', '=', False)]` and so False is given to PayslipActionHelper but it is not a number.
This commit makes sure to set undefined to payrunId prop of PayslipActionHelper when `payrun_id` found is falsy.
runbot-error-241053
Forward-Port-Of: odoo/enterprise#124897
Forward-Port-Of: odoo/enterprise#124854AI-generated answers with web citations now preserve their original line breaks and spacing. This prevents lists and paragraphs from being accidentally merged, making cited responses easier to read and understand.
Original PR description
AI responses containing web citations lost their original formatting when a citation appeared at the end of a line, causing lists and paragraphs to be merged together. This commit limits the citation parser to ignore only horizontal whitespace around citations, preserving line breaks in the rendered response. task-6391187 Forward-Port-Of: odoo/enterprise#124457
The timesheet grid now uses updated colors for attendance/work rule types. This makes it easier for users to quickly recognize different event types at a glance.
Original PR description
This commit updates the color of AW rule types to help the user to quickly recognize the type of events based on the color. task-6186073 Forward-Port-Of: odoo/enterprise#124838
The Timesheets shortcut now appears whenever a user has an active employee profile in any selected company, not just the current company. This prevents eligible users from losing quick access to timesheet entry when working across multiple companies.
Original PR description
Steps to reproduce: - install Timesheets - create an employee for a user in company B - switch to company A (where the user has no employee) - the systray icon is hidden even though the user can…
Steps to reproduce: - install Timesheets - create an employee for a user in company B - switch to company A (where the user has no employee) - the systray icon is hidden even though the user can create timesheets in company B via the company selector Current behavior: the systray only checks the current company for a valid employee, ignoring other selected companies. Expected behavior: the systray should be visible whenever the user can create timesheets i.e. when they have an active employee in any of the selected companies. Issue: the check used a stored boolean on `res.partner` that has no company scope and becomes stale when an employee is archived (the stored dependency does not re-fire). the timesheet creation logic checks all selected companies for active employees, but the systray did not mirror that. Fix: use `employee_ids` a `One2many` that checks all selected companies and excludes archived employees, matching the timesheet creation logic exactly. task-6330539 Forward-Port-Of: odoo/enterprise#124830 Forward-Port-Of: odoo/enterprise#121730