Daily updates from Odoo
Monday, July 14, 2025
12 changes
Resolved issues and error corrections
Italian POS fiscal receipts and invoices no longer add a manual header because supported fiscal printers already print one automatically. This prevents customers from receiving receipts with duplicated header information, improving receipt clarity and compliance with printer behavior.
Original PR description
The printer is already adding a header by default so we don't need to add one manually. Steps to reproduce: ------------------- * Setup an Italian fiscal printer in the POS * Open the POS and create a new order * Add a product and validate the order > Observation: The printed receipt has 2 headers. Why the fix: ------------ According to the Italian fiscal printer documentation, the header is automatically added by the printer, so we don't need to add it manually. Ticket before and after the fix:  opw-4794322 Forward-Port-Of: odoo/enterprise#89856 Forward-Port-Of: odoo/enterprise#89419
Self-order tickets in restaurant POS can now print without showing an unnecessary error after online payment. The change adds safer checks before using session data, preventing a failed print flow when expected records are missing.
Original PR description
Previously, when a self-order ticket was printed in a POS restaurant configuration, an error "list index out of range" occurred because there was an empty pos_session array returned by the method "pos.order.get_order_to_print". Steps to reproduce: 1. Configure and open a POS restaurant session 2. Enable self-ordering and online payment 3. Create and pay an order using the self-service interface 4. The ticket is printed in the restaurant session, but an error is displayed This commit ensures we check for the existence of required records before assigning data to avoid this error Community PR: https://github.com/odoo/odoo/pull/218629
Creating the Anniversary Discount marketing campaign from the eCommerce marketing tab now works reliably. The campaign targeting rules were simplified to avoid an error while preserving the intended customer selection.
Original PR description
We had a traceback when trying to create an Anniversary Discount marketing campaing
due to the domain's construction.
Steps to reproduce:
-------------------
* Go to Marketing Automation app
* Go to eCommerce tab --> anniversary discount
* Click " Create Campaign"
> Observation:
File "/data/build/enterprise/marketing_automation/models/marketing_activity.py", line 142, in _compute_inherited_domain
literal_eval(activity.campaign_id.domain or '[]')])
Why the fix:
------------
The problematic line was introduced in this REV: 1aa05c89f3371981922e3dc52d8334104aa425b9.
The domain was originally built in this IMP: cf2124f4f20a805077502587f9a8be0af0a753c3.
The domain was intended to be used dynamically, but after the revision, that usage changed—so the domain needed to be rebuilt.
We've simplified the domain to eliminate overlapping conditions, ensuring the same logic and result, but with improved readability.
opw-4857722
Forward-Port-Of: odoo/enterprise#89375This update aligns Belgian payroll DmfA reporting with the 2025/2 requirements. It helps ensure payroll declarations remain compliant with the latest Belgian reporting rules.
Original PR description
Forward-Port-Of: odoo/enterprise#90016
The Payroll app no longer shows an error when users open the Payslips menu before any payslips have been created. This prevents an unnecessary interruption and makes the menu usable for new or empty payroll setups.
Original PR description
This PR fixes a traceback that occurred when opening the Payslips menu in the Payroll app without any existing payslips. Root Cause: The issue was caused by passing a null or undefined payrunId to the PayslipActionHelper component, which was not handled properly. Solution: Since payrunId is optional, we added a conditional check in the parent view (hr_payslip_list_renderer) to only pass the payrunId to PayslipActionHelper if it is defined. Related task: 4919933.
The VoIP softphone now uses a clearer minimize icon instead of a minus icon, aligning the interface with designer feedback. This small visual adjustment helps users better understand the button's purpose without changing functionality.
Original PR description
Following feedback from the designers. Forward-Port-Of: odoo/enterprise#89949
This fix updates stored image information so website and marketing email content uses the current image data fields. It helps prevent broken or inconsistent image handling after the html builder changes.
Original PR description
*: marketing_automation_website_sale When `html_builder` was introduced, some data attributes related to images have changed. Unfortunately, the attributes on static data were not adapted accordingly. Because of this, both namings might appear in this version. This commit migrates images and background images attributes to use the new attributes. Dataset changes: - copy `originalId` to `attachmentId` - rename `originalMimetype` to `formatMimetype` task-4367641
Bank reconciliation now correctly coordinates with analytic tracking updates to avoid repeated update loops. This helps users reconcile bank transactions reliably when analytic distributions are involved.
Original PR description
Since a recent fix[^1], the analytic distribution on journal entries is updated with any update made on analytic items. In order to avoid loops and do things in the right order, a context key was added. However, the reconciliation widget was also manipulating analytic items, so it needed to use the context key as well. opw-4936028 opw-4933629 opw-4935236 opw-4933456 opw-4933652 opw-4935789 opw-4938570 opw-4938388 opw-4935709 opw-4940233 opw-4938849 [^1]: https://github.com/odoo/odoo/commit/8194c6e2bfedc9437964090b1a498c3e8cff225c Forward-Port-Of: odoo/enterprise#90175
Helpdesk tickets created directly in a closed stage are now marked as closed immediately. This keeps the customer portal's Open Tickets filter accurate, reducing confusion for portal users and support teams.
Original PR description
**Steps to reproduce:** 1. Install the Helpdesk module. 2. Create a ticket directly in a closed stage (e.g., 'Solved') and add the portal user as a customer. 3. Log in as the portal user. 4. Apply the Open filter. **Issue:** - The ticket appears under Open Tickets, even though it was created in a closed stage. **Cause:** - Currently we consider a stage as closed if 'floded in kanban' is True and When a ticket is created directly in a closed stage, the close_date field is not set. Since the portal filter relies on close_date to distinguish open from closed tickets, this shows closed tickets in open filter. https://github.com/odoo/enterprise/blob/c34256932e593ac2774fa65af813d64edb70ec43/helpdesk/controllers/portal.py#L63 **Solution:** - During ticket creation, if the specified stage is a closing stage, set the close_date field to the current time. opw-4847097 Forward-Port-Of: odoo/enterprise#88983 Forward-Port-Of: odoo/enterprise#87293
This fixes a barcode receipt issue where changing the unit of measure updated the completed quantity but left the reserved quantity unchanged. Businesses processing receipts in different units, such as dozens instead of individual units, now get consistent stock quantities and fewer inventory discrepancies.
Original PR description
Steps to reproduce:
- Create a storable product “P1”:
- UoM: Unit
- Create a receipt for 200 units of P1
- Mark it as To Do
- Go to the barcode module and start processing the receipt
- Edit the quantity:
- Set it to 2 and change the UoM to Dozen
- Save
Problem
The quantity done is correctly set to 2 dozens, But the reserved quantity remains 200
Solution:
When the UoM is changed, compute and update the reserved quantity accordingly
OPW-4716104
Forward-Port-Of: odoo/enterprise#89312
Forward-Port-Of: odoo/enterprise#85004Product pages now show subscription pricing in the correct layout. This makes prices clearer for shoppers and helps avoid confusion when products are sold as subscriptions.
Original PR description
This commit fixes the price layout when the product is offered as a subscription. task-4894315 COM: https://github.com/odoo/odoo/pull/215794
Changing the number of people on an appointment booking no longer makes the previously chosen date appear unselected. This keeps the booking flow clearer for customers and helps avoid confusion while selecting availability.
Original PR description
Step to reproduce: 1. Install appointment and website 2. Go to Appointment > create a new appointment with availability on 'resources' 3. select a 'resource' and check 'manage capacities' 4. go to…
Step to reproduce: 1. Install appointment and website 2. Go to Appointment > create a new appointment with availability on 'resources' 3. select a 'resource' and check 'manage capacities' 4. go to website by smart button 5. Select a date slot. 6. Select the Number of People. Issue: - Previously selected date gets visually deselected or does not retain active state after changing the number of people. Cause: https://github.com/odoo/enterprise/blob/955edd68837c3a8302dcd34b1a6edee28e95ba23/appointment/static/src/interactions/appointment_select_appointment_slot.js#L460 - The logic attempted to restore the previously selected date by calling .click() on the date element. However, this click() call silently failed to trigger the desired behavior. Solution: - Instead of relying on .click() to re-trigger the selection, the handler onClickDaySlot() is now called directly, passing the appropriate DOM element as currentTarget. opw-4859743 Forward-Port-Of: odoo/enterprise#87514