Daily updates from Odoo
Monday, July 14, 2025
10 changes · saas-18.3
Resolved issues and error corrections
Deleting bank statement lines after applying a reconciliation model now keeps the model linked by restoring it to the suspense line. This prevents reconciliation setup from being lost and helps accounting users maintain consistent bank matching behavior.
Original PR description
Before this commit when applying a reco model, the reco model is on the lines of the move except the liquidity line which means that when we delete the lines the reco models is lost. Now when deleting a line, if the statement line had a reco model, we place it back on the suspense. Also correcting some demo data where they added the reconcile model on the liquidity but since the reco model will be added at the creation of the reco model, that's not needed. task: 4908501
This update prevents important activity types used by automated business processes from being deleted or changed in ways that could break workflows. It also adds safeguards so apps recover more gracefully if activity configuration data is missing, and reduces unnecessary VOIP update notifications.
Original PR description
Master data protection ====================== In general, be defensive with activity types: avoid crash when activity type has been removed, try to gracefully recover from non existing data, protect…
Master data protection
======================
In general, be defensive with activity types: avoid crash when activity
type has been removed, try to gracefully recover from non existing
data, protect types linked to business code that should not be unlinked
or changed from model.
Introduce a generic way to mark some activity types as master data
* model is fixed and should not be modified, because it is linked
to specific flows e.g. todo should be generic;
* data should not be unlinked, because it is used in automated flows
like plans, business code, ... and cannot easily be replaced;
Mail: make "Call", "Meeting" and "Todo" activity types master data users
cannot remove as they are required in various flows: fleet, plans,
voip, ... Also force their model to be False (aka be cross model).
Mail: make "Warning" and "Upload document" activity types in addition
to "Call" and "Todo", always cross model. As they are used in various
apps it should not be specific to a model.
Hr holidays: prevent from modifying leave activity types, as they are
used in business flows and in automated code.
Fleet: prevent from modifying contract activity type (same reason).
Account Online Synchornization: make "Bank Synchronization" master
data as business behavior dependso on it. Also fix model used for
the type.
Account reports: make "Tax Closing" master data as business flow
depends on it.
Approvals: make "Approval" master data as business flow depends on it
and it is not easy to remove it in their usage.
Hr Payroll: make "Leaves to defer" master data as business flow
depends on it.
Voip: make "Call" activity type master data users cannot remove as it
is required in various flows of VOIP. Also force its model to be False
as it is used in various models and should not suddenly be limited to
a given model. Done in community, as activity is defined in 'mail'.
Studio: make "Approval" master data as approval flow depends on it.
Calendar: fix activities creation
=========================
Current event creation tries to create activities. However code coming
from https://github.com/odoo/odoo/pull/72043 seems quite broken: it tries to find if the
target model accepts activities, but does not by browsing the wrong
model with wrong ids ... which globally turns off activity creation.
This fix rewrites a bit code creating activities when creating an event so
that
* check activity support on the right model;
* it uses the right model on activity type: otherwise you may end up with
models that do not match between record and activity type;
* remove useless (or wrong) code trying to browse 'model ids' on a given
model;
* we now correctly check for activity inheritance using 'is_mail_activity'
field on IrModel;
Task-3777606
Forward-Port-Of: odoo/enterprise#89881
Forward-Port-Of: odoo/enterprise#58164Changing the number of people for an appointment no longer makes the previously chosen date appear unselected. This keeps the booking flow clearer for website visitors and helps avoid confusion when choosing capacity-based appointment slots.
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 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
A translation-related issue in AvaTax address checks has been corrected. This prevents warnings or errors during address validation and helps tax workflows run more reliably for users in translated environments.
Original PR description
Prior to this commit, a translation issue occurred due to the use of a list comprehension. The _get_translation_source function attempts to scan the local variables, but in the context of a list comprehension, only variables defined within the comprehension are accessible. As a result, variables like uuid and cursor were not available to the _get_lang function, ultimately leading to an error. We replaced the list comprehension with a standard for loop to ensure proper access to local variables. runbot-159883
Rental combo products now correctly show available booking dates when stock limits are enabled. This prevents customers from seeing every date as unavailable and helps keep online rental sales working as expected.
Original PR description
Issue: - Create a rental product (with a rental pricing), - Make it storable and don't allow out-of-stock orders, - Now make it a combo product, - Add a rental combo choice (to be able to save it), - Go to the product's page on eCommerce, - Issue: all dates are unavailable. Cause: The date range picker only relies on `allow_out_of_stock_order` to know whether to compute rental availabilities (but not on `is_storable`). Fix: Also rely on `is_storable` to know whether to compute rental availabilities. opw-4846084 Forward-Port-Of: odoo/enterprise#90084
Bank reconciliation now works correctly when analytic accounting details are synchronized with journal entries. This prevents processing loops and helps ensure accounting data stays consistent during reconciliation.
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
Belgian payroll reporting has been updated to match the DmfA requirements for the second quarter of 2025. This helps Belgian employers keep payroll declarations compliant with the latest official reporting rules.
Original PR description
Forward-Port-Of: odoo/enterprise#90016
The Belgian POS blackbox receipt now better matches certification requirements after recent receipt layout changes. It clearly shows whether a ticket is valid and whether an order is a refund, while removing duplicate date and address details already shown elsewhere.
Original PR description
Since this revmap of the POS receipt (https://github.com/odoo/odoo/pull/201105), we have to make some changes on the receipt when using `pos_blackbox_be`: - Display if the ticket is valid or not (Pro Format) & increase its size. - Display if the order was a refund or not. - No need to display the `blackbox_date` since we now have the `date_order` inside `/point_of_sale/static/src/app/screens/receipt_screen/receipt/receipt_header/receipt_header.xml``. - No need to display the `order.company.street` since the whole adress is now displayed inside `/point_of_sale/static/src/app/screens/receipt_screen/receipt/order_receipt.xml`. task-id: 4848882 community PR: https://github.com/odoo/odoo/pull/214394
Fixed an issue that caused an error when creating an Anniversary Discount campaign in Marketing Automation. This ensures eCommerce marketing campaigns can be created reliably and keeps the campaign targeting rules clearer and easier to maintain.
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#89375Italian POS fiscal receipts and invoices no longer add an extra header because supported fiscal printers already include one automatically. This prevents receipts from showing two headers, making printed documents cleaner and compliant 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