Daily updates from Odoo
Navigate
Branch
Tuesday, January 27, 2026
206 changes
26 changes
Enhancements to existing features
This update allows users to easily navigate to specific sections within Odoo's accordion items on the website. The changes automatically scroll to the selected accordion item and expand it, improving the user experience and making content more accessible. This enhancement was driven by a request to simplify navigation within complex information displays.
Original PR description
*=html_builder This PR introduces the following changes: - Add `.accordion-item` selector in the `AnchorPlugin`. - Expands the list of titleEls selectors to include `.h1-fs, .h2-fs, .h3-fs, .h4-fs, .h5-fs, .h6-fs, .display-1-fs, .display-2-fs, .display-3-fs, .display-4-fs, .base-fs, .o_small-fs`. - Enhances the "AnchorSlide" interaction by adding the "handleAccordionAnchor" method, called in "animateClick" and "setup" to automatically scroll to and expand accordion items. The method uses the `show()` function from bootstrap `Collapse` component, which efficiently manages the expansion of required accordion item and collapse the rest. task-5065165 Forward-Port-Of: odoo/odoo#226091
This update introduces the ability to temporarily 'snooze' products in the Point of Sale system. When a product is snoozed, it appears grayed out and unavailable for a set period (1-4 hours or session), visually indicating it's temporarily out of stock. This provides a way to manage product availability without permanently removing items from the system.
Original PR description
The PR will add an extra availability section on the product info popup which shows whether a product is currently available. From that section the product can then be 'snoozed', which will make it unavailable for a specified period of time. (1, 2, 4 hours, or for the entire session). When the product is unavailable there's a countdown timer on the popup showing when the product will be available again. Products which are 'snoozed' still show up on the product screen, but grayed out. The effect is purely cosmetic, as they can still be added to new orders. Task-[5170696](https://www.odoo.com/odoo/project/1737/tasks/5170696) Previous discussion-[#232625](https://github.com/odoo/odoo/pull/232625) Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update allows staff to temporarily hide products in the Point of Sale system by 'snoozing' them. When a product is snoozed, it appears grayed out on the product screen, but remains available for new orders. This helps manage stock levels and avoid overselling.
Original PR description
The PR will add an extra availability section on the product info popup which shows whether a product is currently available. From that section the product can then be 'snoozed', which will make it unavailable for a specified period of time. (1, 2, 4 hours, or for the entire session). When the product is unavailable there's a countdown timer on the popup showing when the product will be available again. Products which are 'snoozed' still show up on the product screen, but grayed out. The effect is purely cosmetic, as they can still be added to new orders. Task-[5170696](https://www.odoo.com/odoo/project/1737/tasks/5170696) Previous discussion-[#232625](https://github.com/odoo/odoo/pull/232625) Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- 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 resolves a crash that occurred when confirming purchase orders linked to multiple sales orders (grouped RFQs). The fix ensures that each purchase order is associated with only one sales order, preventing a data conflict. This improves the stability of the dropshipping process.
Original PR description
An error occurs when confirming a purchase order linked to multiple sales orders. Steps to reproduce: 1) Install sale_stock & sale_management and enable dropshipping. 2) Create a vendor with…
An error occurs when confirming a purchase order linked to multiple sales orders. Steps to reproduce: 1) Install sale_stock & sale_management and enable dropshipping. 2) Create a vendor with group_rfq 'always'. 3) Create a product with dropship route and add that vendor. 4) Create a Quotation with that product, confirm it, duplicate and confirm. 5) From the magic button go to Purchase Orders and confirm the PO. Reference video for steps : https://drive.google.com/file/d/1xglkuZAWNxcz0WSj_49Hemjkxx4KjSqv/view?usp=sharing Error: `ValueError: Wrong value for stock.picking.sale_id: sale.order(26, 27)` Root Cause: The computed field `sale_id` receives multiple `sale.order` records from `move_ids.sale_line_id.order_id` (see [1]). Since `sale_id` is a Many2one field, it can only accept one record or False. Assigning multiple records causes the error. Fix: * Create only one sale order per purchase order for drop-shipping picking types. For existing databases, set the value to the first available sale_id, or False if none exists. [1]- https://github.com/odoo/odoo/blob/38cffd1d1580693c56f0d897b8c8e60b938a8e85/addons/sale_stock/models/stock.py#L175-L179 opw-5344535 Forward-Port-Of: odoo/odoo#237945
This update fixes an issue where users couldn't adjust the quantity of optional products added through the portal's upsell feature. The change ensures that the 'optional' status is correctly applied to new order lines, allowing users to accurately update product quantities and manage their subscriptions.
Original PR description
Version: - 19.0 Steps to Reproduce: - Enable the Add Products option in the recurring plan. - Create a subscription with the same plan and add optional products. - Confirm the subscription and create invoice for current period. - From the portal, click on Add Quantity to create an upsell order. Before: - Users were not able to update the quantity of products added as optional products from portal. - This happened because the `is_optional` field value was not copied to the new order line created during the upsell. After: - The `is_optional` field value is now copied to the new order line created for upsell and renewal orders. - This allows users to update the quantity of optional products correctly. Impact: - Users can update the quantity of optional products from the portal without issues. task-5427585 Forward-Port-Of: odoo/enterprise#102670
This update resolves a problem where toggling image captions caused layout disruptions, particularly when images were placed within tables or other non-paragraph containers. The fix ensures images remain correctly positioned within their original layout structure, improving the visual consistency of records.
Original PR description
Description of the issue this PR addresses: - When toggling an image caption, the logic only checks whether the image or figure’s closest block is editable. This causes images inside non-paragraph containers (such as table cells, list items, blockquotes, and columns) to be repositioned, breaking the original layout. Desired behavior after PR is merged: - Image caption toggling correctly handles paragraph-related containers, ensuring the image remains within its original structural context (tables, lists, blockquotes, columns) without altering the layout. Steps to Reproduce: - Open a to-do record. - Insert a table. - Add an image inside any table cell. - Toggle the image caption multiple times (3–4 times). task-5485697 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245227 Forward-Port-Of: odoo/odoo#243454
This update resolves an issue where users would encounter an error when creating inherited views. The fix ensures that a validation error is triggered if the XPath syntax is incorrect, preventing the application from crashing and improving the user experience when customizing views.
Original PR description
Currently, an error occurs when a user creates an inherited view. **Steps to Reproduce:** - Go to `Settings > Technical > User Interface > Views`. - Create a new view by entering `name` and selecting…
Currently, an error occurs when a user creates an inherited view.
**Steps to Reproduce:**
- Go to `Settings > Technical > User Interface > Views`.
- Create a new view by entering `name` and selecting any `inherited view`.
- In the `Architecture`, enter the below code:
```
<xpath position="replace">
<field name="name"/>
</xpath>
```
- Now save the view.
`TypeError: Argument must be bytes or unicode, got 'NoneType'`
Cause:
As we can see, when the user enters an xpath without the expr attribute, and when it goes to find the inherited node [1]. Since the expr is missing, its value becomes None [2]. Passing this None as an argument [3] causes the error.
This commit ensures that when a user creates or edits a view with an xpath that is missing the expr attribute, a ValidationError is raised indicating that the expr attribute is missing in the XPath.
[1]: https://github.com/odoo/odoo/blob/4876a54e8cfb3a115b5423db102fc2b7a40b196a/odoo/tools/template_inheritance.py#L145
[2]: https://github.com/odoo/odoo/blob/4876a54e8cfb3a115b5423db102fc2b7a40b196a/odoo/tools/template_inheritance.py#L76
[3]: https://github.com/odoo/odoo/blob/4876a54e8cfb3a115b5423db102fc2b7a40b196a/odoo/tools/template_inheritance.py#L78
[4]: https://github.com/odoo/odoo/blob/4876a54e8cfb3a115b5423db102fc2b7a40b196a/odoo/addons/base/models/ir_ui_view.py#L377-L384
sentry-7161414430
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#242203This update resolves an issue causing a 'NameError' in the TFN dashboard warning, preventing incorrect warnings from appearing for employees applying for TFN. The fix ensures the system correctly identifies and displays relevant warnings related to TFN status, improving payroll accuracy. This upgrade was necessary to maintain consistent reporting.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_au_hr_payroll. 2. Enable multi-company and switch to an AU company. 3. Change an existing employee’s company to the AU company ([employee…
Steps to reproduce:
-------------------
1. Install l10n_au_hr_payroll.
2. Enable multi-company and switch to an AU company.
3. Change an existing employee’s company to the AU company
([employee created more than 28 days ago](https://github.com/odoo/enterprise/blob/7adab8bfdccf5f0e97eb2894e065b63ea8200d20/l10n_au_hr_payroll/data/hr_payroll_dashboard_warning_data.xml#L31)).
4. Under the payroll tab, set the TFN Status to:
"Employee applied for TFN but didn't receive it yet, less than 28 days ago".
5. Open Payroll.
Issue:
--------
A traceback occurred:
```
Error: NameError("name 'invalid_employees' is not defined")
```
Cause:
------
The evaluation code computes `warning_count` using
an undefined `invalid_employees` variable.
Solution:
---------
Define `invalid_employees` before using it to compute
`warning_count` and `warning_records`.
**NOTE:**
The [upgrade script](https://github.com/odoo/upgrade/blob/ed5bc3fd99ef6fba4bc7162934df36396ae9fc3f/migrations/l10n_au_hr_payroll/saas~18.4.1.0/end-migrate.py#L30) is already available from version 18 to 19.
opw-5459998
Forward-Port-Of: odoo/enterprise#103777This update enhances traceability for EDI and e-Way Bill requests by storing all request payloads as JSON attachments. This improves debugging, simplifies audits, and strengthens compliance efforts related to these important tax processes. Task 4896516.
Original PR description
Before this PR: - Request payloads sent for EDI and e-Way Bill generation were not persisted. making debugging and audits difficult. After this PR: - all EDI and e-Way Bill request payloads are stored as JSON attachments, ensuring better traceability, troubleshooting, and compliance support. Task: 4896516 Forward-Port-Of: odoo/odoo#241704
This update resolves a bug where overtime entries were being incorrectly generated and overlapping due to a flawed system for managing overtime rules. The fix ensures accurate overtime calculations and prevents overlapping entries, improving the reliability of attendance tracking.
Original PR description
STEP TO REPRODUCE:
------------------
0- Go to attendance > Configuration > Overtime Ruleset 1- Create the following overtime ruleset (all rules are paid and with the entry type overtime):
rule 1: timing rule on worked day with this timing : 0AM -> 8AM
rule 2: timing rule on worked day with this timing : 12AM -> 1PM
rule 1: timing rule on worked day with this timing : 5PM -> 12PM
2- Go to attendance > configuration > settings
3- Enable Time Management
4- ANd change the extra hours validation by automatically approved 5- create an employee and give to him this overtime ruleset 6- Create for an attendance for him from 6AM to 8PM 7- to go the form view of this attendance
8- Approve it; you wwill have a traceback
REASON:
-------
The way to handle the reorganization of the overtime line on an attendance was badly done; everything was shift with the same shift so some overtime was overlapping the others
Forward-Port-Of: odoo/enterprise#105173This update ensures that new partners created during shared sign requests automatically use the signer's name instead of their email address. Previously, the system defaulted to using the email as the partner name, which caused confusion and potential data inconsistencies. This change improves data accuracy and user experience.
Original PR description
Version: - saas-18.2 Steps to reproduce: - Create a shared sign request. - Open the shared signing link and complete the signature process. - During signing, a new partner gets created for the signer if not already exists. Before: - When the user signs the shared sign request and a new partner is created, the partner name is not set and email is used as name. After: - Now, when a user signs a shared sign request and a new partner is created, the system automatically sets the partner name using the signer name. task-5776339 Forward-Port-Of: odoo/enterprise#105271 Forward-Port-Of: odoo/enterprise#104869
This update fixes an issue where a specific error occurred when a leave request was linked to a refused allocation, triggering the 'Time Off: Cancel invalid leaves' cron job. The fix addresses a problem with how data was being accessed, preventing a traceback and ensuring the system handles refused allocations correctly.
Original PR description
When a leave is linked to a refused allocation and the cron ``Time Off: Cancel invalid leaves`` runs, a traceback occurs. Steps to reproduce the error: - Install ``hr_holidays`` without demo data -…
When a leave is linked to a refused allocation and
the cron ``Time Off: Cancel invalid leaves`` runs, a traceback occurs.
Steps to reproduce the error:
- Install ``hr_holidays`` without demo data
- Create a new Time Off Type > Time Off Requests, Approval: No Validation >
Allow Negative Cap: True > Maximum Excess Amount: 2
- Create an Accrual Plan using default values
- Create a New Allocation
- Allocation Type: Accrual Allocation
- Set the Time Off Type and Accrual Plan created above
- Allocation: 1 day > Approve
- Create a new Time Off in the near future (in the current month) and select the Time Off Type created above
- Go back to the Allocation > Refuse
- Run the cron ``Time Off: Cancel invalid leaves``
Traceback:
``IndexError: list index out of range``
https://github.com/odoo/odoo/blob/bc5f24195a486112574900015ecbcf0e3ba32145/addons/hr_holidays/models/hr_leave.py#L1535-L1536
Here, ``leave_type_data`` becomes ``defaultdict(<class 'list'>, {})``
because when the allocation is refused and the cron runs,
the ``get_allocation_data`` method returns an empty defaultdict.
As a result, accessing the index leads to the above traceback.
sentry-6874651972
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#243505
Forward-Port-Of: odoo/odoo#227201This update corrects a minor technical issue related to printer disconnection tracking. Previously, a specific device configuration caused a system error. The fix ensures accurate disconnection counts, improving the stability and reliability of the printer interface.
Original PR description
This commit fixes an edge-case between the disconnect counter logic, and the logic added in odoo/odoo#224200 to prevent printers switching between `lpd` and `socket` protocols. In this case, a device is returned that only has the `identifier` key set. Because the driver has already been instantiated, this didn't break anything before, but now it also clears the `disconnect_counter` key, leading to a traceback on the next iteration of the interface when it tries to check the `disconnect_counter`. The fix is simply to include the `disconnect_counter` as well. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245719
This update resolves a bug that caused the follow-up report to crash when users unfolded partner lines while prefix groups were enabled. The fix ensures the report correctly handles data retrieval, preventing a key error and improving stability for users.
Original PR description
When prefix groups were enabled, and a prefix group line had been unfolded, the report crashed when trying to unfold the partner. This happened because res_ids_map is computed for each of the unfolded lines, including the prefix groups one, which then had no 'res.partner' key, causing a key error. Forward-Port-Of: odoo/enterprise#105525
This update corrects an issue with how URLs are encoded in the website's sales functionality. The fix ensures that all necessary data is properly transmitted, preventing potential errors and improving the reliability of the sales process. This is a routine maintenance update.
Original PR description
Oversight of https://github.com/odoo/odoo/pull/238396 Calling `urlencode` with the result of `parse_qs` is incorrect, and requires `doseq=True` to work as expected. opw-none --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a visual glitch in the time-off UI for Belgian employees. Previously, sickness relapse fields appeared unexpectedly after approving time off. The fix adjusts the layout to properly position these fields, ensuring a consistent and user-friendly experience.
Original PR description
Bug production steps: Select employee works in Belgium company, go to timeoff and approve >= 1 months time off and select new timeoff after 1-2 days and there Sickness Relapse fields occur in the shifted UI. Bug cause: The field sickness_relapse added after attach file part, before there was label for the attach file part and it was occupying 2 columns, after removing column it occupies only 1 and the first part of the boolean sickness relapse fields come next to the attach file part. Bug solution: Make the colspan 2 for the attach file part, by that way the sickness_relapse will start from the below line. task - 5493425 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245605 Forward-Port-Of: odoo/odoo#243753
This update resolves a bug where enabling the 'Auto Crop' feature for product images in the online shop didn't actually crop the images as expected. The previous code was overriding the intended image settings, leading to a broken feature. This fix ensures that 'Auto Crop' now correctly adjusts the product image size.
Original PR description
Steps to reproduce: =================== 1- Go to website > shop & open edit mode 2- Select any product and click on "paint-brush" icon 3- Click on "Image ratio" option and enable "Auto crop" -> nothing happens to the images. Cause: ====== After this commit [1] `object-fit-contain` was used even for auto crop which will override the `o_wsale_products_opt_thumb_cover` class object-fit value. Solution: ========= Apply basic fit contain only when autocrop is disabled. [1]: https://github.com/odoo/odoo/pull/238108/commits/002a8a1ff65fd48fd69e41c9a881fddceee34bf5 opw-5868057 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245258
This update resolves an issue preventing NFC-e refunds from being processed correctly in Point of Sale. Previously, a technical error caused a 'not found' message when attempting to retrieve the original invoice. The fix ensures the system accurately identifies and uses invoice references during the refund process, enabling successful transactions.
Original PR description
**Steps to reproduce:**
- Setup a database that supports NFC-e
- Go to PoS, make a purchase, then refund it
- A traceback appears, saying we couldn't find the original invoice
**Why the fix:**
Before this commit the way we checked if there was already an invoice in the payload we give to the API was wrong, as it was always true. This happens because before the
*def _get_l10n_br_avatax_service_params(self):* call, we set res['invoice_refs'] as {}, then we were supposed to fill it. But if we check https://github.com/odoo/enterprise/blob/32b73b12f9f8f5600b820d9a938bfbb0cf10054d/l10n_br_edi_pos/models/account_move.py#L13 'invoice_refs' is found in res, even though it is empty, so we never entered the if statement.
We now check if there is a value in res['invoice_refs'] and if not we set it.
opw-5359407
Forward-Port-Of: odoo/enterprise#104987
Forward-Port-Of: odoo/enterprise#102770This update fixes an issue where the 'Inventory Reason' entered during barcode inventory counts wasn't being recorded in the system. Now, when completing an inventory count via the Barcode app, the specified reason is correctly logged in the Moves History, ensuring accurate tracking of inventory adjustments. This improves the reliability of inventory reporting.
Original PR description
## Issue When completing an *Inventory Count* from the Barcode app, the *Inventory Reason* requested to the user is not registered anywhere. ## Steps to reproduce 1. Install the *Barcode* app…
## Issue
When completing an *Inventory Count* from the Barcode app, the *Inventory Reason* requested to the user is not registered anywhere.
## Steps to reproduce
1. Install the *Barcode* app (`stock_barcode`)
2. In the *Barcode* app, click *Count Inventory*
3. Add a product and set a quantity for it
4. Click *Confirm* (do not scan to confirm)
5. Write an *Inventory Reason* and click *Apply Now*
6. Go to Inventory > Reporting > Moves History
- **The _Inventory Reason_ given in step 5 does not appear anywhere**
If the inventory adjustment is done through Inventory > Operations > Physical Inventory, the user can also provide an *Inventory Reason*, but this time, it will appear in the *Moves History* in the *Reference* (`stock.move.line.reference`) column.
## Cause
Since https://github.com/odoo/enterprise/commit/3efea75a88120519ef4be1a41c8faa7278bc332c, the value provided by the user is never passed to the Python side.
opw-5423934
Forward-Port-Of: odoo/enterprise#104763This update fixes a bug where tax return labels weren't correctly translated when a new language was installed. The system now automatically generates translations for all existing tax return labels upon language installation, ensuring consistent and accurate labeling across all supported languages. This improves the user experience for international users.
Original PR description
**Commit 1:** [FIX] account_reports: translation of account returns states Steps to reproduce: - Open the tax returns - Set an account opening date to generate some returns - Add another language to…
**Commit 1:** [FIX] account_reports: translation of account returns states Steps to reproduce: - Open the tax returns - Set an account opening date to generate some returns - Add another language to the database and select it -> The states of the returns (the little bubble in the kanban cards) aren't translated even though the translation is present in the pot and po files. **Commit 2:** [FIX] account_reports: translation of date in returns title Steps to reproduce: - Have 2 languages on the db - Generate the tax returns by going to Accounting/Tax Returns and set the opening date - Switch to the second language -> The period displayed in the name of each return isn't translated **Commit 3:** [FIX] account_reports: translate account returns name after lang installation Steps to reproduce: - Generate the tax returns by going to Accounting/Tax Returns and set the opening date - Install another language -> The names of the returns aren't translated in the new language. Solution: When installing a new language, generates the translation of the title for all existing returns task-5421659 Forward-Port-Of: odoo/enterprise#102559
This update addresses a limitation in the account online synchronization process where access tokens expire quickly. We've implemented a new consent token system – a unique, secure identifier linked to the user – to ensure reliable consent management and continued synchronization functionality. This change improves the user experience and data integrity.
Original PR description
In this commit:bf5b7d0 we introduce a message on the account_online_link to be able to manage the consent. (one needed fix in this commit:https://github.com/odoo/enterprise/commit/1c84804fd3f0c0d1d23916b9f6a388616f66ac7e) This commit will change the way we manage the consent since the access token is in fact available only for 30 min, so the link in the chatter would not work. We decided to have a consent token which is a uuid4 encoded in base64 (url safe) and link it to the odoofin user. task-5187621 Forward-Port-Of: odoo/enterprise#105392 Forward-Port-Of: odoo/enterprise#105202
This update corrects a compatibility issue with the Bulgarian National Bank (BNB) exchange rate provider. Due to Bulgaria joining the Eurozone, the BNB now provides rates in EUR, not BGN. This change ensures that companies using EUR as their main currency can correctly sync exchange rates without errors.
Original PR description
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the…
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the BNB now provides rates against EUR. This caused the error "Your main currency (EUR) is not supported by this exchange rate provider" when Bulgarian companies with EUR as their main currency tried to sync exchange rates. refs: We can compare the data here from 31 December using the WayBackMachine: https://web.archive.org/web/20251231193558/https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm Compared to today: https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm And see the comparison used to be to BGN but is now for EUR Steps To Reproduce: 1. Create a company for Bulgaria with EUR as the main currency. 2. Go to Accounting Settings -> Automatic Currency Rates. 3. Select "[BG] Bulgaria National Bank" as the service provider. 4. Click the sync button. 5. Error appears: "Your main currency (EUR) is not supported by this exchange rate provider. Please choose another one." The fix updates the base currency from BGN to EUR, matching the current BNB XML format which now provides rates against EUR. Note: Companies with BGN as main currency will now get the same error, which is expected since the BNB no longer provides BGN-based rates. This behavior was discussed and confirmed with the PO. Ticket [link](https://www.odoo.com/odoo/project.task/5483771) opw-5483771 Forward-Port-Of: odoo/enterprise#105074
This update fixes an issue preventing bookings from being scheduled for the last hour of the day in the appointment system. The previous code incorrectly treated the end of the day as an unavailable slot, blocking bookings. This change ensures that appointments can now be booked for the full 24-hour period, resolving a common user frustration.
Original PR description
**Steps to reproduce:** - Go to Appointment app - Edit an appointment type - Ensure its availability is on resources - Set duration to 1 hour - Add a schedule slot ending in 00:00 - Save and go to…
**Steps to reproduce:** - Go to Appointment app - Edit an appointment type - Ensure its availability is on resources - Set duration to 1 hour - Add a schedule slot ending in 00:00 - Save and go to the website page of the appointment - Last slot is not showing (23:00-00:00) **Issue:** When computing the appointment slots of a resource using time range, the end of day is considered as an unavaibility resource slot with this interval in `_get_unavailable_intervals`: `i_start = 23:59:59.999999` `i_stop = 00:00` this conflicts with the given range (23:00-00:00) in `self._slot_availability_is_resource_available` It comes from `_attendance_intervals_batch`, as `float_to_time(24.0)` is converted to `time.max` (23:59:59.999999) by: `day_to = datetime.combine(day, float_to_time(attendance.hour_to))` This introduces the microsecond unavaibility at the end of the day, which blocks the booking. (it's working properly for availability on users appointments) **Fix:** Changed the condition so that 23:59:59.999999 is considered as equal to 00:00. opw-5163892 Forward-Port-Of: odoo/enterprise#104927 Forward-Port-Of: odoo/enterprise#100853
This update fixes a layout issue where image gallery indicators become cramped with many images and improves the overall responsiveness of image carousels, particularly on Firefox. By preloading images and optimizing the loading process, the gallery now appears smoother and more reliable.
Original PR description
## [FIX] website: add versioning for GallerySlider interaction The GallerySlider interaction (and its edit mode counterpart) is not up to date: the logic is still written for old snippets (before…
## [FIX] website: add versioning for GallerySlider interaction
The GallerySlider interaction (and its edit mode counterpart) is not up
to date: the logic is still written for old snippets (before [9042b1c],
so before 18.0).
In the meantime, the pagination for the indicators was lost, meaning
that if you add too many images, the indicators will have less and less
space.
Steps to reproduce:
- Drop an Image Gallery snippet
- Set the indicators to squared or rounded miniatures
- Add 15 or more images
=> All the indicators are crammed into the same line.
With this commit, we deprecate the old `GallerySlider` interaction and
create a `GallerySlider001` for the snippets dropped since 18.0.
For the indicators, instead of a pagination, we now use a horizontal
scrolling container which centers on the active indicator.
[9042b1c]: https://github.com/odoo/odoo/commit/9042b1c
## [FIX] website: preload available carousel images
As images are lazy loaded, it means that in the context of a carousel or
an image gallery, they only start loading once the user clicks either on
its indicator or on the previous / next button (or after completing an
auto-slide). While Chrome seems to optimize that to make it seemless, on
Firefox this causes the carousel slide to appear blank for a moment
before the image suddenly pops up, as the sliding animation arrives to
its end.
In effect, this causes a flicker and a feeling that the carousels, and
especially the gallery, is extremely laggy.
To mitigate that while trying to keep the advantages of image lazy
loading, this commit partially backports [08d837e], which loads the
images of the next and the previous carousel items.
Additionally, we prefetch the target images on pointerdown / keydown on
an indicator. That may seem like too small of a difference to be
interesting, but it actually gives a little bit of time between the
pointerdown and pointerup (which triggers the slide event) to start
loading the images, which with a correct connexion already goes a long
way towards mitigating the laggy feeling.
[08d837e]: https://github.com/odoo/odoo/commit/08d837e70f28a84a9bd97974f5d15d387a42b7c0
task-5245513
Forward-Port-Of: odoo/odoo#245144
Forward-Port-Of: odoo/odoo#232147This update resolves an issue where the 'All Warehouses' placeholder in the product routing settings was misleading. Previously, it prevented users from correctly setting up reordering rules to prioritize specific warehouses. This change ensures the placeholder accurately reflects the functionality, allowing for proper route configuration and improved inventory management.
Original PR description
Update warehouse_ids placeholder ("All Warehouses") to a new placeholder that reflect its behavior.
### Steps to reproduce:
* Enable multi-Step Routes
* Inventory > Routes > Buy > Warehouses
* Select the checkbox but leave the field empty (placeholder says "All Warehouses")
### Steps to verify behavior:
* Leaving the warehouse_ids fields empty ("All Warehouses")
* Create a product tracked by quantity and add a vendor
* Create a Reordering Rule
-> It doesn't put the "Buy" route by default as it should
opw-5264571
Forward-Port-Of: odoo/odoo#245547This update fixes an issue where tooltip labels and help text appeared on the same line in tree views. The change ensures that tooltips now display with proper line breaks, improving readability and the overall user experience. This enhances the clarity of information presented within the Odoo application.
Original PR description
Tooltip `label` and `help` appear on the same line because the `o-tooltip--string` on the `help` make it display inline. Move `o-tooltip--string` to be on the entire component instead. reference comment: https://github.com/odoo/odoo/pull/243295#issuecomment-3742599307 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
9 changes
Resolved issues and error corrections
This update resolves a technical issue causing a 'NameError' in the TFN dashboard warning, preventing incorrect warnings from appearing for employees applying for TFN. The fix ensures the warning calculation accurately identifies employees meeting the criteria, improving payroll reporting accuracy. This upgrade is part of the standard Odoo 18.4 release.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_au_hr_payroll. 2. Enable multi-company and switch to an AU company. 3. Change an existing employee’s company to the AU company ([employee…
Steps to reproduce:
-------------------
1. Install l10n_au_hr_payroll.
2. Enable multi-company and switch to an AU company.
3. Change an existing employee’s company to the AU company
([employee created more than 28 days ago](https://github.com/odoo/enterprise/blob/7adab8bfdccf5f0e97eb2894e065b63ea8200d20/l10n_au_hr_payroll/data/hr_payroll_dashboard_warning_data.xml#L31)).
4. Under the payroll tab, set the TFN Status to:
"Employee applied for TFN but didn't receive it yet, less than 28 days ago".
5. Open Payroll.
Issue:
--------
A traceback occurred:
```
Error: NameError("name 'invalid_employees' is not defined")
```
Cause:
------
The evaluation code computes `warning_count` using
an undefined `invalid_employees` variable.
Solution:
---------
Define `invalid_employees` before using it to compute
`warning_count` and `warning_records`.
**NOTE:**
The [upgrade script](https://github.com/odoo/upgrade/blob/ed5bc3fd99ef6fba4bc7162934df36396ae9fc3f/migrations/l10n_au_hr_payroll/saas~18.4.1.0/end-migrate.py#L30) is already available from version 18 to 19.
opw-5459998
Forward-Port-Of: odoo/enterprise#103777This update resolves a technical issue that could cause errors when processing Peruvian electronic invoices (PE DI) within Odoo Enterprise. The fix ensures that the system handles cases where invoice data is missing, preventing unexpected tracebacks and improving the reliability of the invoicing process. This ensures smoother and more accurate invoice generation and submission for our Peruvian clients.
This update addresses a limitation in how users manage their consent for online synchronization. Previously, a short-lived access token caused issues with the consent link in the chat interface. Now, a more stable consent token is used, linked to the user, ensuring a reliable process for granting access.
Original PR description
In this commit:bf5b7d0 we introduce a message on the account_online_link to be able to manage the consent. (one needed fix in this commit:https://github.com/odoo/enterprise/commit/1c84804fd3f0c0d1d23916b9f6a388616f66ac7e) This commit will change the way we manage the consent since the access token is in fact available only for 30 min, so the link in the chatter would not work. We decided to have a consent token which is a uuid4 encoded in base64 (url safe) and link it to the odoofin user. task-5187621 Forward-Port-Of: odoo/enterprise#105392 Forward-Port-Of: odoo/enterprise#105202
This update corrects a compatibility issue with the Bulgarian National Bank (BNB) exchange rate provider. Due to Bulgaria's adoption of the Euro, the BNB now provides rates in EUR, not BGN. This change ensures that companies using EUR as their main currency can correctly sync exchange rates without errors.
Original PR description
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the…
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the BNB now provides rates against EUR. This caused the error "Your main currency (EUR) is not supported by this exchange rate provider" when Bulgarian companies with EUR as their main currency tried to sync exchange rates. refs: We can compare the data here from 31 December using the WayBackMachine: https://web.archive.org/web/20251231193558/https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm Compared to today: https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm And see the comparison used to be to BGN but is now for EUR Steps To Reproduce: 1. Create a company for Bulgaria with EUR as the main currency. 2. Go to Accounting Settings -> Automatic Currency Rates. 3. Select "[BG] Bulgaria National Bank" as the service provider. 4. Click the sync button. 5. Error appears: "Your main currency (EUR) is not supported by this exchange rate provider. Please choose another one." The fix updates the base currency from BGN to EUR, matching the current BNB XML format which now provides rates against EUR. Note: Companies with BGN as main currency will now get the same error, which is expected since the BNB no longer provides BGN-based rates. This behavior was discussed and confirmed with the PO. Ticket [link](https://www.odoo.com/odoo/project.task/5483771) opw-5483771 Forward-Port-Of: odoo/enterprise#105074
This update fixes an issue preventing appointment bookings from showing correctly at the end of the day. The system was incorrectly interpreting the end of the day as an unavailable slot, blocking bookings that started at 23:00. The fix ensures that the end-of-day slot is properly recognized, allowing for bookings to be scheduled until 23:59:59.
Original PR description
**Steps to reproduce:** - Go to Appointment app - Edit an appointment type - Ensure its availability is on resources - Set duration to 1 hour - Add a schedule slot ending in 00:00 - Save and go to…
**Steps to reproduce:** - Go to Appointment app - Edit an appointment type - Ensure its availability is on resources - Set duration to 1 hour - Add a schedule slot ending in 00:00 - Save and go to the website page of the appointment - Last slot is not showing (23:00-00:00) **Issue:** When computing the appointment slots of a resource using time range, the end of day is considered as an unavaibility resource slot with this interval in `_get_unavailable_intervals`: `i_start = 23:59:59.999999` `i_stop = 00:00` this conflicts with the given range (23:00-00:00) in `self._slot_availability_is_resource_available` It comes from `_attendance_intervals_batch`, as `float_to_time(24.0)` is converted to `time.max` (23:59:59.999999) by: `day_to = datetime.combine(day, float_to_time(attendance.hour_to))` This introduces the microsecond unavaibility at the end of the day, which blocks the booking. (it's working properly for availability on users appointments) **Fix:** Changed the condition so that 23:59:59.999999 is considered as equal to 00:00. opw-5163892 Forward-Port-Of: odoo/enterprise#104927 Forward-Port-Of: odoo/enterprise#100853
This update automatically matches bank statements with invoices when the reference information is identical. Previously, the system prevented this match, requiring manual intervention. This change ensures faster and more accurate reconciliation of bank statements, streamlining financial processes.
Original PR description
The aim of this commit is to make the automatic reconciliation works in case of an obvious matching that was prevented because the reference of the invoice was also it's payment reference. It also…
The aim of this commit is to make the automatic reconciliation works in case of an obvious matching that was prevented because the reference of the invoice was also it's payment reference. It also modify a docstring of a test because it was lying about what it was really testing. The usecase it says it forbid is actually enforced by `test_matching_algorithm_for_multiple_invoices`. ### Before this commit: - functionally: The obvious matching was denied and the accountant had to manually make the match. - technically: The `aml.ref` and the `move.payment_reference` were the exact same and thus postgres regrouped the invoice (through aml) with itself as if there were 2 invoices matching the same word. ### After this commit: - functionally: The obvious match is made. - technically: The initial intend was to avoid having several invoices (proxy by amls) reported for a specific matching word preventing the system to take a difficult and arbitrary functional decision which might be wrong. In order to comply with that and to not block the match of an invoice that would be matched through several matching words, we don't gather twice the same aml for the same word. task-id: None (The issue arose on odoo.com and was brought by APFA)
This update resolves an issue where users with limited sign rights couldn't access the sample document template. The fix ensures that users can create and manage sign items for the copied template, allowing them to successfully use the sample. This improves the user experience for all users.
Original PR description
**Issue** Users without 'Admin' Sign rights could in some cases not access the sample template. **Steps to reproduce** 1. Go to 'Templates' and archive the existing one in order to have the 'Try our…
**Issue** Users without 'Admin' Sign rights could in some cases not access the sample template. **Steps to reproduce** 1. Go to 'Templates' and archive the existing one in order to have the 'Try our sample document' shown and click on it. 2. Add some sign items to the template, and send it for a signature request. 3. With an user having only 'User: Own Templates' Sign rights, go to 'Templates' and click 'Try our sample document'. Access Error: Blame the following rules: - sign.item: group_sign_user: Create and manage template items **Cause** When the template has an associated sign request, it is copied. The problem is that the user currently doesn't have enough rights to create sign items for the copied template: https://github.com/odoo/enterprise/blob/2e8fb2ca274a0cf15d7b78a663bffe9cbb700153/sign/security/security.xml#L92-L101 **Change** Change the `user_id` of the new template to allow creating the sign items for it. opw-5254566 Forward-Port-Of: odoo/enterprise#102227
This update resolves a technical problem in the demo data for the Mexican payroll modules. Previously, the demo company name was being overwritten, causing issues with invoice and payment processing (CFDI stamping) within the demo environment. This change ensures the demo data accurately reflects the company and partner information.
Original PR description
The demo data of the Mexican payroll modules was overriding the company and partner name during installation, which can break the CFDI stamping flow for invoices and payment complements in demo databases. Forward-Port-Of: odoo/enterprise#103870 Forward-Port-Of: odoo/enterprise#102558
This update resolves a bug that caused the follow-up report to crash when users unfolded partner lines while prefix groups were enabled. The fix corrects an error in how the report processed data, ensuring stability and reliable report generation for all users.
Original PR description
When prefix groups were enabled, and a prefix group line had been unfolded, the report crashed when trying to unfold the partner. This happened because res_ids_map is computed for each of the unfolded lines, including the prefix groups one, which then had no 'res.partner' key, causing a key error. Forward-Port-Of: odoo/enterprise#105525
9 changes
Resolved issues and error corrections
This update fixes an issue where dialog boxes were hidden behind chat windows, making them difficult to use. Now, dialogs appear above all chat windows except the AI chat window, ensuring a clearer and more intuitive user experience.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ Dialogs were rendered behind chat windows, making them difficult to see and interact with. **Current behavior before PR:** --------------------------------- - The dialog appears behind the chat window **Desired behavior after PR is merged:** ----------------------------------------- - Dialogs are displayed above all chat windows except AI - The AI chat window remains intentionally above dialogs **Task:** 5367135
This update corrects a technical issue that was causing an error message to appear on the TFN dashboard, specifically related to employee TFN status reporting. The fix ensures accurate warning calculations for employees applying for TFNs, improving payroll reporting reliability. This resolves a potential data discrepancy.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_au_hr_payroll. 2. Enable multi-company and switch to an AU company. 3. Change an existing employee’s company to the AU company ([employee…
Steps to reproduce:
-------------------
1. Install l10n_au_hr_payroll.
2. Enable multi-company and switch to an AU company.
3. Change an existing employee’s company to the AU company
([employee created more than 28 days ago](https://github.com/odoo/enterprise/blob/7adab8bfdccf5f0e97eb2894e065b63ea8200d20/l10n_au_hr_payroll/data/hr_payroll_dashboard_warning_data.xml#L31)).
4. Under the payroll tab, set the TFN Status to:
"Employee applied for TFN but didn't receive it yet, less than 28 days ago".
5. Open Payroll.
Issue:
--------
A traceback occurred:
```
Error: NameError("name 'invalid_employees' is not defined")
```
Cause:
------
The evaluation code computes `warning_count` using
an undefined `invalid_employees` variable.
Solution:
---------
Define `invalid_employees` before using it to compute
`warning_count` and `warning_records`.
**NOTE:**
The [upgrade script](https://github.com/odoo/upgrade/blob/ed5bc3fd99ef6fba4bc7162934df36396ae9fc3f/migrations/l10n_au_hr_payroll/saas~18.4.1.0/end-migrate.py#L30) is already available from version 18 to 19.
opw-5459998
Forward-Port-Of: odoo/enterprise#103777This update resolves an issue preventing portal users from filtering job listings by department. The fix corrects a permissions error that restricted access, ensuring all users can utilize the department filter on the Jobs page. This improves the user experience for job seekers.
Original PR description
## Issue: Filtering by Department on the Jobs page as a Portal user raised a Forbidden Error ## Cause: Portal users lacked access rights on hr.department, even though public users have it ## Steps to reproduce: You need a portal user and a published job position in a department (you can use demo data) - Open the Website > Jobs page as Admin - Edit > Customize > Enable Department filter > Save - Login with Portal User - Access the jobs page and set a Department filter opw-4948838
This update resolves an issue in Odoo Studio where incorrectly configured related fields could cause warnings and errors. The change ensures that Studio only creates relational fields with searchable data types, preventing these technical problems and improving stability for business users. This resolves a previous operational issue.
Original PR description
Before this commit studio allowed to make a related field with a non-searchable field (ie standard computed fields) in the the chain. This triggered a warning at creation (at fields.py:resolve_depends) and errors when using in a business setting. After this commit, the filter to build the relational field is modified to take into account this. opw-5436158
This update addresses a limitation in the account online synchronization process where access tokens expire quickly. We've implemented a new consent token system – a unique, secure identifier linked to the user – to ensure reliable consent management and continued synchronization functionality. This change improves the user experience and maintains data consistency.
Original PR description
In this commit:bf5b7d0 we introduce a message on the account_online_link to be able to manage the consent. (one needed fix in this commit:https://github.com/odoo/enterprise/commit/1c84804fd3f0c0d1d23916b9f6a388616f66ac7e) This commit will change the way we manage the consent since the access token is in fact available only for 30 min, so the link in the chatter would not work. We decided to have a consent token which is a uuid4 encoded in base64 (url safe) and link it to the odoofin user. task-5187621 Forward-Port-Of: odoo/enterprise#105392 Forward-Port-Of: odoo/enterprise#105202
This update fixes an access error that prevented users with standard inventory permissions from generating serial numbers for tracked products. The issue stemmed from a specific write operation within the system's serial number generation process. The fix ensures that users can correctly generate serial numbers without encountering access restrictions.
Original PR description
**Behavior:** Behavior: When logged in as a user with group_user access (member), trying to generate the next few serial numbers for a tracked product from receipts will cause an access error. This…
**Behavior:** Behavior: When logged in as a user with group_user access (member), trying to generate the next few serial numbers for a tracked product from receipts will cause an access error. This happens because there is a write operation on the ir.sequence linked to the serial number at the end of the process that happens only when the 'New' button was previously pressed. And since access rights to ir.sequence are dependant on the base group of the user, changing the user Inventory rights to admin will not resolve the issue. A test has been created to ensure no access error is created when generating sequence numbers as a lower access user, this test would pass without the fix since it is focused on the python function. **Steps to reproduce:** - Create a product that is tracked by serial number - Log in as a user with group_user access (member role) - Go to Inventory -> Operations -> Receipts - Create a new picking and add the product - After clicking on Mark as Todo you'll see Details pop up in the product line - After clicking Details, select Generate Serial/Lots - Click New, then Generate, and you'll get an access error for ir.Sequence opw-5368553
This update fixes a bug where users could successfully pay invoices with expired Sales Orders. Now, the system automatically prevents payment attempts when the Sales Order's expiry date has passed, ensuring accurate financial records and preventing incorrect payments. This improves the reliability of our payment processing.
Original PR description
## Issue: Payment link should expire if payment is expired. #### Steps to reproduce: 1- Create a new quotation. 2- Set the expiry date in the past. 3- Open the action menu and generate a payment link. 4- Open the payment link and pay. Expected result: The payment should fail if the so is expired. opw-5478691 Forward-Port-Of: odoo/odoo#245601 Forward-Port-Of: odoo/odoo#244061
This update corrects a bug that prevented companies using the Euro as their main currency from syncing exchange rates correctly. The BNB now provides rates in EUR, and this change ensures the system recognizes and utilizes the updated data. Companies with BGN as their currency will also experience this error.
Original PR description
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the…
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the BNB now provides rates against EUR. This caused the error "Your main currency (EUR) is not supported by this exchange rate provider" when Bulgarian companies with EUR as their main currency tried to sync exchange rates. refs: We can compare the data here from 31 December using the WayBackMachine: https://web.archive.org/web/20251231193558/https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm Compared to today: https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm And see the comparison used to be to BGN but is now for EUR Steps To Reproduce: 1. Create a company for Bulgaria with EUR as the main currency. 2. Go to Accounting Settings -> Automatic Currency Rates. 3. Select "[BG] Bulgaria National Bank" as the service provider. 4. Click the sync button. 5. Error appears: "Your main currency (EUR) is not supported by this exchange rate provider. Please choose another one." The fix updates the base currency from BGN to EUR, matching the current BNB XML format which now provides rates against EUR. Note: Companies with BGN as main currency will now get the same error, which is expected since the BNB no longer provides BGN-based rates. This behavior was discussed and confirmed with the PO. Ticket [link](https://www.odoo.com/odoo/project.task/5483771) opw-5483771 Forward-Port-Of: odoo/enterprise#105074
This update resolves errors in the SAF-T export process for Romanian companies when partner information (country or name) is missing. The fix ensures accurate invoice generation and SAF-T file creation by correctly handling missing partner details, specifically the RegistrationNumber format.
Original PR description
Fix SAF-T export errors when partners have no country or name. For Romanian companies, the RegistrationNumber should be generated as “04 + partner ID” for customers not subject to VAT and with unknown CNP, without including the country code. Steps to reproduce country issue: - Configure a Romanian company with l10n_ro_saft installed - Create a contact without a country - Create and validate an invoice for this contact - Export the SAF-T file from the General Ledger report You you will get a TypeError because you cant concatenate Bool and String. Steps to reproduce name issue: - Create a main contact - Add a child contact without a name - Change the child type to “Company” - Create and validate an invoice - Export the SAF-T file from the General Ledger report This prevents KeyError when printing the first 70 characters of the partner name in the report. opw-5499918 Forward-Port-Of: odoo/enterprise#105406 Forward-Port-Of: odoo/enterprise#105020
4 changes
Resolved issues and error corrections
This update corrects a technical error in the l10n_au_hr_payroll module that was causing a warning message to appear incorrectly on the TFN dashboard. The fix ensures accurate reporting of TFN status for employees, preventing potential confusion and compliance issues. This resolves a bug related to undefined variables in the payroll calculation.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_au_hr_payroll. 2. Enable multi-company and switch to an AU company. 3. Change an existing employee’s company to the AU company ([employee…
Steps to reproduce:
-------------------
1. Install l10n_au_hr_payroll.
2. Enable multi-company and switch to an AU company.
3. Change an existing employee’s company to the AU company
([employee created more than 28 days ago](https://github.com/odoo/enterprise/blob/7adab8bfdccf5f0e97eb2894e065b63ea8200d20/l10n_au_hr_payroll/data/hr_payroll_dashboard_warning_data.xml#L31)).
4. Under the payroll tab, set the TFN Status to:
"Employee applied for TFN but didn't receive it yet, less than 28 days ago".
5. Open Payroll.
Issue:
--------
A traceback occurred:
```
Error: NameError("name 'invalid_employees' is not defined")
```
Cause:
------
The evaluation code computes `warning_count` using
an undefined `invalid_employees` variable.
Solution:
---------
Define `invalid_employees` before using it to compute
`warning_count` and `warning_records`.
**NOTE:**
The [upgrade script](https://github.com/odoo/upgrade/blob/ed5bc3fd99ef6fba4bc7162934df36396ae9fc3f/migrations/l10n_au_hr_payroll/saas~18.4.1.0/end-migrate.py#L30) is already available from version 18 to 19.
opw-5459998
Forward-Port-Of: odoo/enterprise#103777This update fixes a potential error in the GST reporting module related to tax mapping during bill creation. Previously, an incorrect tax setting led to a database violation. Now, the system correctly uses the intended tax rate, ensuring accurate reporting and preventing data inconsistencies.
Original PR description
Before this PR: During chart installation, the template sets `sgst_purchase_5` as the default purchase tax, which becomes the default supplier tax (supplier_taxes_id) for product_a. When creating the…
Before this PR: During chart installation, the template sets `sgst_purchase_5` as the default purchase tax, which becomes the default supplier tax (supplier_taxes_id) for product_a. When creating the bill with partner_b, the [tax_map](https://github.com/odoo/odoo/blob/cade6bcf0d783a8b492f5e26afbd87f2a812303e/addons/account/models/partner.py#L47) field converts product_a.supplier_taxes_id to tax_purchase_b. Since tax_purchase_b is not referenced in account_fiscal_position_tax, unlink() succeeds. After this PR: Due to changes in this [PR](https://github.com/odoo/odoo/pull/242030), the template no longer sets default purchase tax. Test common.py runs before default taxes are set by `_inverse_l10n_in_is_gst_registered`, so tax_purchase_b becomes NULL. Later, when default taxes are set, product_a gets supplier_taxes_id = sgst_purchase_5. When creating the bill, it directly uses sgst_purchase_5, which is referenced in account_fiscal_position_tax. Attempting unlink() on sgst_purchase_5 causes a foreign key violation. task-5456351
This update corrects a bug in the automatic currency rate syncing process. Due to Bulgaria's adoption of the Euro, the BNB now provides exchange rates in EUR, not BGN. This fix ensures that companies using EUR as their main currency can correctly access and sync exchange rates from the BNB provider.
Original PR description
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the…
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the BNB now provides rates against EUR. This caused the error "Your main currency (EUR) is not supported by this exchange rate provider" when Bulgarian companies with EUR as their main currency tried to sync exchange rates. refs: We can compare the data here from 31 December using the WayBackMachine: https://web.archive.org/web/20251231193558/https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm Compared to today: https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm And see the comparison used to be to BGN but is now for EUR Steps To Reproduce: 1. Create a company for Bulgaria with EUR as the main currency. 2. Go to Accounting Settings -> Automatic Currency Rates. 3. Select "[BG] Bulgaria National Bank" as the service provider. 4. Click the sync button. 5. Error appears: "Your main currency (EUR) is not supported by this exchange rate provider. Please choose another one." The fix updates the base currency from BGN to EUR, matching the current BNB XML format which now provides rates against EUR. Note: Companies with BGN as main currency will now get the same error, which is expected since the BNB no longer provides BGN-based rates. This behavior was discussed and confirmed with the PO. Ticket [link](https://www.odoo.com/odoo/project.task/5483771) opw-5483771 Forward-Port-Of: odoo/enterprise#105074
This update corrects a nightly failure related to the default time zone used for appointments. The fix involves overriding the time zone setting within testing, rather than directly asserting its value. This ensures consistent appointment scheduling across different environments and prevents disruptions.
Original PR description
**Issue:** Default tz of `'appointment.appointment_default_resource_calendar'` is not always `"Europe/Brussels"`. **Fix:** Override in test instead of asserting its value. opw-5163892 Forward-Port-Of: odoo/enterprise#105501
21 changes
Enhancements to existing features
This update automatically populates employee sex and birthday information based on the NISS (Belgian National Identification Number). The 9th digit of the NISS determines sex, and the first 6 digits (YYMMDD) are used to calculate the birthday, handling century conversions automatically. This streamlines data entry and improves accuracy for Belgian HR records.
Original PR description
- Added an onchange to fill `sex` and `birthday` from `niss`. - 9th digit of NISS determines sex (even → female, odd → male). - First 6 digits of NISS (YYMMDD) determine birthday with automatic century handling. Task-5432128
This update significantly enhances the Payroll Dashboard by introducing automated warning scheduling, improved UI for displaying deadlines, and email alerts for overdue warnings. The changes streamline payroll processes and ensure timely compliance with critical deadlines.
Original PR description
`*` = `l10n_xx_hr_payroll`, `hr_holidays_fleet`, `hr_contract_salary_payroll`, `hr_payroll_account_iso20022` - renamed `hr.payroll.dashboard.warning` to `hr.payroll.warning` - changed every…
`*` = `l10n_xx_hr_payroll`, `hr_holidays_fleet`, `hr_contract_salary_payroll`, `hr_payroll_account_iso20022`
- renamed `hr.payroll.dashboard.warning` to `hr.payroll.warning`
- changed every occurrences of `hr.payroll.dashboard.warning` to `hr.payroll.warning` in data records and references.
- removed specified warnings
- removed specified warnings from `hr_payroll` and `hr_payroll_fleet`
- removed unused dashboard components
- removed all the other dashboard components apart from the warning one, and removed their methods from `hr_payslip` and related tour and tests from `test_dasboard`
- reworked dashboard
- added a mandatory onboarding process to obtain payrun related data
- reworked Dashboard UI to show warnings with their deadlines
- added some fields on `hr.payroll.warning` to compute warning deadline
- added email alerts when warning overdue
- now, user can choose from Python Code or Domain while creating a warning
- also added new warnings
Task [link](https://www.odoo.com/odoo/project.task/5252854)
task-5252854This update enhances the Frontdesk module by ensuring accurate notification handling and robust host selection. It clarifies notification settings, enforces required contact information (email or phone) for hosts, and prevents data saving if this information is missing, improving data integrity.
Original PR description
The purpose of this change is to ensure proper host selection and accurate notification handling with clear validation. This PR includes the following changes: - Removed the user-related Discuss notification warning and updated the checkbox description to clarify that Discuss notifications are only sent to hosts with a user account. - Added a validation to ensure that hosts always have either an Email or Phone. - Prevented saving when any host lacks Email/Phone. - Applied the same behavior to both the frontdesk and visitor views. - Updated the notification option descriptions for Email and SMS to be clearer. Related Upgrade PR: https://github.com/odoo/upgrade/pull/9299 task-5082882
This update simplifies the process for creating and editing global filters within the spreadsheet edition, now handled directly in the side panel. Previously, inconsistent flows led to user confusion. Now, the filter value list is exclusively used for global filters in dashboards via the search bar, streamlining the user experience.
Original PR description
Current behavior before PR: - Clicking the filter button opened a dialog for configured filters. - Creating a filter used the dialog, but editing required the side panel. - This resulted in an unexpected and inconsistent user flow. Desired behavior after PR is merged: - Creating and editing global filters is handled in the side panel - The filter value list is now used only for global filters in dashboards via the search bar. Task: [5447040](https://www.odoo.com/odoo/project/2328/tasks/5447040)
This update clarifies the HR Payroll section by renaming the 'Personal Information' area to 'Statutory Information' and reorganizing the fields based on usage. This change enhances user experience and makes it easier to find relevant statutory data.
Original PR description
Purpose: - The purpose of this change is to improve clarity and usability by better reflecting the nature of statutory-related fields and organizing them in a more logical order. This PR includes: - Renamed the 'Personal Information' section to 'Statutory Information'. - Reordered fields within the Statutory Information section from most frequently used to least used for better readability and user experience. task-5452904
This update enhances the display of recent call history in the Voip module by ensuring icons are always fully visible and by streamlining the user interface. The 'Go to' buttons have been reorganized for a more intuitive experience. This improves usability and reduces potential confusion for users.
Original PR description
### Adjust tab entry layout Prior to this PR, extra icons in recent entries could be truncated depending on the subtitle length. This commit adapts the entry layout to ensure that extra icons are…
### Adjust tab entry layout Prior to this PR, extra icons in recent entries could be truncated depending on the subtitle length. This commit adapts the entry layout to ensure that extra icons are always fully visible. This PR also moves the "Go to Call" and "Go to Activity" buttons into the "Go to" dropdown for a more predictable user experience. ### Adapt call suggestion separator This PR updates the call suggestion separator to improve readability. --- task-5413528 --- ### Avoid extra icons truncation | Before | After | |--------|--------| | <img width="367" height="63" alt="Capture d’écran 2026-01-16 à 12 04 26" src="https://github.com/user-attachments/assets/ec117119-7d90-4de0-87e2-c2bd5d8e3eab" /> | <img width="362" height="61" alt="Capture d’écran 2026-01-16 à 12 06 30" src="https://github.com/user-attachments/assets/caef103b-e324-4ed0-a180-22271f3efa0d" /> | ### Move Go to button | Before | After | |--------|--------| | <img width="367" height="63" alt="Capture d’écran 2026-01-16 à 12 04 26" src="https://github.com/user-attachments/assets/ec117119-7d90-4de0-87e2-c2bd5d8e3eab" /> | <img width="364" height="380" alt="Capture d’écran 2026-01-16 à 12 07 50" src="https://github.com/user-attachments/assets/3ae631d0-0315-445f-b6f8-1d2ba2306d6d" /> | ### Adapt call suggestion separator | Before | After | |--------|--------| | <img width="377" height="145" alt="Capture d’écran 2026-01-16 à 12 08 53" src="https://github.com/user-attachments/assets/0d92689f-31d7-40c1-9e98-23e894dbe94e" /> | <img width="379" height="133" alt="Capture d’écran 2026-01-16 à 12 09 06" src="https://github.com/user-attachments/assets/95640f67-0c15-4142-ae4d-c98e0ffaa093" /> |
Resolved issues and error corrections
This update fixes a critical issue where the Moroccan tax report XML export incorrectly handled cash basis taxes. The change ensures bills are accurately reflected in the export, aligning with Moroccan tax regulations. This improves data consistency and report reliability.
Original PR description
[FIX] l10n_ma_reports: tax report: properly consider cash basis taxes in the XML export Moroccan taxes are cash basis by default. The former version of the XML generation completely disregarded that,…
[FIX] l10n_ma_reports: tax report: properly consider cash basis taxes in the XML export Moroccan taxes are cash basis by default. The former version of the XML generation completely disregarded that, and always reported all bills in the period. Solving this requires using an SQL query so that cash basis can be properly computed, like in the report. This also makes the export much more efficient, and resilient to bigger amount of data. Steps to reproduce: - Install `l10n_ma_reports` and switch to the MA company - Create and confirm a bill: Bill Date: 10/01/2025 Vendor: Azure Interior Invoice Lines: Price 100, Taxes 20% (S 140) - Go to `Bank Reconciliation` - Add a transaction (Vendor: Azure Interior, Amount: -120 DH, any Memo) - Select the transaction and the invoice, then click Validate - Open the Tax Return for November. Section D should show data linked to the created invoice - Export the XML using the Gear → XML The created bill is missing in the XML and others may be present, showing inconsistent data opw-5002779 [IMP] l10n_ma_reports: call the report to compute the prorata value Searching explicitly for external values is a bad practice ; calling the report ensures consistency between the data displayed, and the one exported into the file. Forward-Port-Of: odoo/enterprise#105106 Forward-Port-Of: odoo/enterprise#104619
This update corrects a bug in how overtime entries are generated within the attendance system. Previously, overtime rules were incorrectly applied, leading to overlapping entries and errors. This fix ensures accurate overtime calculations and approval processes.
Original PR description
STEP TO REPRODUCE:
------------------
0- Go to attendance > Configuration > Overtime Ruleset 1- Create the following overtime ruleset (all rules are paid and with the entry type overtime):
rule 1: timing rule on worked day with this timing : 0AM -> 8AM
rule 2: timing rule on worked day with this timing : 12AM -> 1PM
rule 1: timing rule on worked day with this timing : 5PM -> 12PM
2- Go to attendance > configuration > settings
3- Enable Time Management
4- ANd change the extra hours validation by automatically approved 5- create an employee and give to him this overtime ruleset 6- Create for an attendance for him from 6AM to 8PM 7- to go the form view of this attendance
8- Approve it; you wwill have a traceback
REASON:
-------
The way to handle the reorganization of the overtime line on an attendance was badly done; everything was shift with the same shift so some overtime was overlapping the others
Forward-Port-Of: odoo/enterprise#105173This update resolves an issue where users lacking specific access rights within Odoo could not submit VAT declarations through the Intervat module. By adding sudo permissions, this change ensures all users can successfully complete the submission process, regardless of their access level. This enhances user experience and compliance.
Original PR description
Add few sudo() for vat declaration, to be sure users without access rights to res.company or certificate.certificate can still make a submission. task-5470492 Forward-Port-Of: odoo/enterprise#105395 Forward-Port-Of: odoo/enterprise#103647
This update corrects an issue where FedEx labels were incorrectly displaying addresses containing special characters (like accents or non-English characters). The code has been updated to ensure all address components are converted to ASCII, resulting in accurate label formatting for all shipping addresses. This improves the reliability of shipments using FedEx.
Original PR description
Issue ----- Fedex does not handle special characters in addresses, so passing an address such as "Rue de Libération 15" will show as "Rue de Lib...ration 15" on labels. ----- Ticket: opw-5419724 Forward-Port-Of: odoo/enterprise#104979 Forward-Port-Of: odoo/enterprise#104265
This update resolves an issue where the tax code (9) was missing from Datev exports for expense payments using 19%I tax. The fix addresses a technical problem with how payment amounts are processed, ensuring accurate tax code reporting in the Datev data. This ensures consistent and compliant reporting to the accounting system.
Original PR description
Currently, when using 19%I tax in vendor bills, the tax code (9) is shown correctly in the BU-Schlüssel section of the datev export. This however is not the case for expense journal entries. Steps to reproduce: - With DE Company setup - Create an Expense as follows: - Included taxes: 19% I - Paid by: Company - Create report > Submit to Manager > Approve > Post Journal entries - Open General Ledger and export Datev Data Issue: Tax code will be missing from the exported entry. This occurs because, when processing payment move lines, amounts and accounts are aggregated, losing track of the source tax. opw-5388791 Forward-Port-Of: odoo/enterprise#105435 Forward-Port-Of: odoo/enterprise#102548
This update resolves an issue where invoices, sale orders, and POS orders defaulted to an invalid payment method ('Por Definir') in the MX region. This caused fiscal inconsistencies, particularly with the 'PUE' payment policy. The fix removes this default, ensuring accurate financial reporting and compliance.
Original PR description
### Issue: The payment method `99 – Por Definir` was used as the default value for invoices, sale orders, and POS orders This leads to fiscal inconsistencies, especially when invoices use the `PUE`…
### Issue: The payment method `99 – Por Definir` was used as the default value for invoices, sale orders, and POS orders This leads to fiscal inconsistencies, especially when invoices use the `PUE` payment policy, where this payment method is invalid ### Cause: In the `_compute_l10n_mx_edi_payment_method_id` methods, the default value was always set to `Por Definir` ### Fix: After discussion with the PO (MIAL), the chosen solution is to archive the payment method `99 – Por Definir`and remove it as a default value All valid cases should already be handled explicitly, making it clear to the user that something is missing when the data is blank ### Steps to reproduce: - Install `l10n_mx_edi` and switch to the MX company - Create an invoice with today’s invoice date - The payment policy is set to PUE - Before the fix, the payment method is set to `Por Definir` For Sale Order and POS Order tests, it's the default value as soon as you create an order opw-5406038 Forward-Port-Of: odoo/enterprise#105344 Forward-Port-Of: odoo/enterprise#104164
This pull request addresses critical errors identified during automated testing of the planning and timesheet grid modules. The changes fix timezone inconsistencies that were causing test failures, ensuring accurate reporting and scheduling functionality. Resolving these issues improves the reliability of the Odoo Enterprise platform.
Original PR description
Solves https://runbot.odoo.com/odoo/runbot.build.error/238011 https://runbot.odoo.com/odoo/runbot.build.error/238022 https://runbot.odoo.com/odoo/runbot.build.error/238023 https://runbot.odoo.com/odoo/runbot.build.error/238024
This update optimizes how Odoo handles incoming VoIP calls, preventing duplicate call creation caused by multiple users connecting simultaneously. By using a server-side mechanism and PostgreSQL's UPSERT feature, the system now efficiently manages call records, improving performance and reliability for all users.
Original PR description
## Context Each Odoo client (e.g., a browser tab), establishes a WebSocket connection with the VoIP provider. This causes problems with incoming calls: each instance receives the notification, which leads to the associated callbacks being called as many times as there are running Odoo clients. ## Current state To avoid creating a voip.call record for every connected client, we introduced a "get_or_create" method that first attempts to retrieve the record and then creates it if it doesn't exist. If the operation fails due to concurrent updates, the client simply retries it after some jitter. This is not ideal because each attempt results in a round trip. ## After this commit This commit improves the current handling of concurrent updates by managing them on the server side. It leverages the [UPSERT](https://wiki.postgresql.org/wiki/UPSERT) mechanism of PostgreSQL to implement the "get or create" logic and relies on Odoo's automatic retry feature to manage concurrent updates.
This update enhances the accuracy of achievement reports by using a new method for calculating and storing key data. Specifically, the system now utilizes materialized views and indexing to speed up report generation and ensure data consistency, addressing potential calculation inaccuracies.
Original PR description
Investigation in process. task-5477432
This update corrects a technical inconsistency where employee payroll settings were incorrectly marked as editable. The change ensures that fields marked as read-only in the version record are consistently read-only for the employee record, maintaining data integrity and preventing unintended modifications to payroll information. This resolves a prior issue flagged by automated testing.
Original PR description
There was an inconsistency on readonly for fields between version and employee. This removes "readonly=False" on employee for fields that are readonly on the version. Runbot error: 230983 Forward-Port-Of: odoo/enterprise#105414 Forward-Port-Of: odoo/enterprise#100575
This update corrects a problem where inputs weren't appearing on payslips. The fix adds the necessary domain to each relevant model, ensuring that inputs are correctly associated with payslips. This improves the functionality of the payroll system.
Original PR description
When trying to add Inputs for a payslips none appear as the domain was incorrect and only showed salary inputs for use in the employee. This is fixed in this commit by adding to the domain en each specific model. task-5486091 Forward-Port-Of: odoo/enterprise#105160 Forward-Port-Of: odoo/enterprise#103986
A bug preventing feeds from opening in the Social Twitter module has been resolved. This update addresses a technical incompatibility between the new QWeb engine feature and the existing view rendering process, ensuring feeds now open correctly. This resolves a disruption for users accessing social media feeds.
Original PR description
**How to reproduce:** - Install the social_twitter module - Enable Demo Mode - Open a Feed **Before this commit:** A traceback occurs and the feed fails to open. **Technical reason:** Introduced by this commit: https://github.com/odoo/enterprise/commit/99d583d5d6362504b4e838c7825fe9ca8d2b342c This commit introduced the parametric t-call feature for server-side QWeb engine. However, we use `ViewCompiler` to render views (here `KanbanCompiler`), which does not support parametric t-call, leading to the traceback. **After this commit:** The feed opens correctly with no traceback. Task-5707050
This update resolves an issue where Stripe expense data was being duplicated, causing confusion and errors in the Odoo system. The changes now skip the Stripe KYC steps during demo setup, speeding up the process and ensuring accurate data. This improves the demo experience and prevents data inconsistencies.
Original PR description
Prevent expenses automatically created by Stripe Issuing to be duplicated. Currently, it adds a lot of noise on customer dbs. The payment method is duplicated and it can lead to errors (eg: employee submit duplicatas instead of the original expenses. The automatic reconciliation doesn't happen afterwards) task-5246475 Forward-Port-Of: odoo/enterprise#102034
This update resolves an issue where smart buttons on the voip call forms were missing access groups and causing singleton errors. The fix ensures that smart buttons work as intended, displaying the correct information and improving the user experience. This impacts users interacting with voip calls across various modules like CRM, Helpdesk, and Sales.
Original PR description
1. Tickek/Application smart buttons on voip.call form miss access groups. 2. In voip.call form, when clicking the application smart button, a singleton error will raise. 3. Incorrect numbers on smart button. Task-[5461729](https://www.odoo.com/odoo/5778/tasks/5461729) Forward-Port-Of: odoo/enterprise#103233
This update fixes an issue where users couldn't adjust the quantity of optional products added through the portal's upsell feature. The change ensures that the quantity of these products is correctly updated, allowing users to manage their subscriptions and renewals accurately. This improves the user experience and prevents order discrepancies.
Original PR description
Version: - 19.0 Steps to Reproduce: - Enable the Add Products option in the recurring plan. - Create a subscription with the same plan and add optional products. - Confirm the subscription and create invoice for current period. - From the portal, click on Add Quantity to create an upsell order. Before: - Users were not able to update the quantity of products added as optional products from portal. - This happened because the `is_optional` field value was not copied to the new order line created during the upsell. After: - The `is_optional` field value is now copied to the new order line created for upsell and renewal orders. - This allows users to update the quantity of optional products correctly. Impact: - Users can update the quantity of optional products from the portal without issues. task-5427585 Forward-Port-Of: odoo/enterprise#102670
15 changes
Resolved issues and error corrections
This update resolves an error that prevented the creation of new contract templates in the US payroll module. The issue stemmed from a constraint requiring a filing status, which was incorrectly applied to templates. The change ensures that the filing status is correctly set through employee data, aligning with the system's intended functionality.
Original PR description
1. Set "My US Company" state to California, 2. Go to Employees > Employees > Contract Templates, 3. Click New, 4. Fill in a name and save, 5. Invalid Operation: "The employee state filing status is…
1. Set "My US Company" state to California, 2. Go to Employees > Employees > Contract Templates, 3. Click New, 4. Fill in a name and save, 5. Invalid Operation: "The employee state filing status is empty..." A constraint ensures an l10n_us_state_filing_status is set on `hr.version`. The field is used by the salary rules. This field used to be on `hr.employee` and was moved to `hr.version` [1]. There's two types of `hr.version` records: templates without employee_id and actual contract versions linked to an employee. We don't want to evaluate the constraint for the templates, the only way to set a filing status is through the employee so it will always raise. This is functionally correct as well, contract templates should not have a hardcoded filing status, this should be determined per employee. The constraint will now only raise when loading a contract template on the employee or editing the field through the employee. [1] odoo/enterprise#83136 opw-5458566 Forward-Port-Of: odoo/enterprise#104990
This update corrects a technical issue that was causing an error message to appear on the TFN dashboard, specifically related to employee TFN status reporting. The fix ensures accurate warning calculations for employees applying for TFNs, improving payroll reporting reliability. This update was part of a larger upgrade process.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_au_hr_payroll. 2. Enable multi-company and switch to an AU company. 3. Change an existing employee’s company to the AU company ([employee…
Steps to reproduce:
-------------------
1. Install l10n_au_hr_payroll.
2. Enable multi-company and switch to an AU company.
3. Change an existing employee’s company to the AU company
([employee created more than 28 days ago](https://github.com/odoo/enterprise/blob/7adab8bfdccf5f0e97eb2894e065b63ea8200d20/l10n_au_hr_payroll/data/hr_payroll_dashboard_warning_data.xml#L31)).
4. Under the payroll tab, set the TFN Status to:
"Employee applied for TFN but didn't receive it yet, less than 28 days ago".
5. Open Payroll.
Issue:
--------
A traceback occurred:
```
Error: NameError("name 'invalid_employees' is not defined")
```
Cause:
------
The evaluation code computes `warning_count` using
an undefined `invalid_employees` variable.
Solution:
---------
Define `invalid_employees` before using it to compute
`warning_count` and `warning_records`.
**NOTE:**
The [upgrade script](https://github.com/odoo/upgrade/blob/ed5bc3fd99ef6fba4bc7162934df36396ae9fc3f/migrations/l10n_au_hr_payroll/saas~18.4.1.0/end-migrate.py#L30) is already available from version 18 to 19.
opw-5459998
Forward-Port-Of: odoo/enterprise#103777This update ensures that when a new partner is created during a shared sign request, the partner's name is automatically set to the signer's name, rather than relying on their email address. This improves data accuracy and consistency for shared agreements, simplifying record-keeping and reporting.
Original PR description
Version: - saas-18.2 Steps to reproduce: - Create a shared sign request. - Open the shared signing link and complete the signature process. - During signing, a new partner gets created for the signer if not already exists. Before: - When the user signs the shared sign request and a new partner is created, the partner name is not set and email is used as name. After: - Now, when a user signs a shared sign request and a new partner is created, the system automatically sets the partner name using the signer name. task-5776339 Forward-Port-Of: odoo/enterprise#105271 Forward-Port-Of: odoo/enterprise#104869
This update enhances the monitoring of our AI usage by changing key logs from 'debug' to 'info', making them easier for administrators to track. Additionally, the system now accurately reports token usage from the LLM providers, resolving previous underreporting issues. This provides better visibility and control over AI costs.
Original PR description
In this commit we change some important llm api usage logs from debug to info so they can be more easily monitored by us and database admins. We also change the usage reporting from a naive estimation (which greatly under-reported the token usage) to the actual token usage given to us by the LLM prodivers in the response.
This update addresses a limitation in the account online synchronization process where access tokens expire quickly. We've implemented a new consent token system – a unique, secure identifier linked to the user – to ensure reliable consent management and continued synchronization functionality. This change improves the user experience and stability of the online connection.
Original PR description
In this commit:bf5b7d0 we introduce a message on the account_online_link to be able to manage the consent. (one needed fix in this commit:https://github.com/odoo/enterprise/commit/1c84804fd3f0c0d1d23916b9f6a388616f66ac7e) This commit will change the way we manage the consent since the access token is in fact available only for 30 min, so the link in the chatter would not work. We decided to have a consent token which is a uuid4 encoded in base64 (url safe) and link it to the odoofin user. task-5187621 Forward-Port-Of: odoo/enterprise#105392 Forward-Port-Of: odoo/enterprise#105202
This update ensures the Helpdesk dashboard's styling is consistent with other Odoo dashboards. Specifically, the conditional formatting and border styles for the Top Customers pivot have been adjusted to match the overall design, improving the dashboard's visual appeal and user experience.
Original PR description
## Description - The Top Customers pivot shows 10 rows, but the conditional format covered only 9. Extend the CF range so the last row is formatted. - Adjust border ranges so the helpdesk dashboard matches the styling used in other dashboards. Task: [5448434](https://www.odoo.com/odoo/project/2328/tasks/5448434) Forward-Port-Of: odoo/enterprise#103284 Forward-Port-Of: odoo/enterprise#103019
This update resolves an issue where extremely high IDs in Odoo's commission reports could cause errors. By using a bitwise operation instead of multiplication, the system now correctly handles large IDs, ensuring accurate report generation and preventing potential data corruption. This improves the stability and reliability of the commission reporting functionality.
Original PR description
Before this commit, we had issues on odoo.com when the ids of the account move, account move line, sale order or sle order line were too high. We would end up with ids bigger than BIGINT limit. This commit ensure it does not happen anymore by using bitwise operation on ids istead of multiplying the values. task-5423978
This update corrects a compatibility issue with the Bulgarian National Bank (BNB) exchange rate provider. Since Bulgaria adopted the Euro, the BNB now provides rates in EUR, not BGN. This fix ensures that companies using EUR as their main currency can correctly sync exchange rates, resolving a previous error.
Original PR description
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the…
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the BNB now provides rates against EUR. This caused the error "Your main currency (EUR) is not supported by this exchange rate provider" when Bulgarian companies with EUR as their main currency tried to sync exchange rates. refs: We can compare the data here from 31 December using the WayBackMachine: https://web.archive.org/web/20251231193558/https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm Compared to today: https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm And see the comparison used to be to BGN but is now for EUR Steps To Reproduce: 1. Create a company for Bulgaria with EUR as the main currency. 2. Go to Accounting Settings -> Automatic Currency Rates. 3. Select "[BG] Bulgaria National Bank" as the service provider. 4. Click the sync button. 5. Error appears: "Your main currency (EUR) is not supported by this exchange rate provider. Please choose another one." The fix updates the base currency from BGN to EUR, matching the current BNB XML format which now provides rates against EUR. Note: Companies with BGN as main currency will now get the same error, which is expected since the BNB no longer provides BGN-based rates. This behavior was discussed and confirmed with the PO. Ticket [link](https://www.odoo.com/odoo/project.task/5483771) opw-5483771 Forward-Port-Of: odoo/enterprise#105074
This update resolves an issue preventing bookings from being scheduled for the last hour of the day. The fix corrects a technical error that was incorrectly treating the end of the day as unavailable, now allowing users to book appointments until 23:00. This ensures full utilization of resource slots.
Original PR description
**Steps to reproduce:** - Go to Appointment app - Edit an appointment type - Ensure its availability is on resources - Set duration to 1 hour - Add a schedule slot ending in 00:00 - Save and go to…
**Steps to reproduce:** - Go to Appointment app - Edit an appointment type - Ensure its availability is on resources - Set duration to 1 hour - Add a schedule slot ending in 00:00 - Save and go to the website page of the appointment - Last slot is not showing (23:00-00:00) **Issue:** When computing the appointment slots of a resource using time range, the end of day is considered as an unavaibility resource slot with this interval in `_get_unavailable_intervals`: `i_start = 23:59:59.999999` `i_stop = 00:00` this conflicts with the given range (23:00-00:00) in `self._slot_availability_is_resource_available` It comes from `_attendance_intervals_batch`, as `float_to_time(24.0)` is converted to `time.max` (23:59:59.999999) by: `day_to = datetime.combine(day, float_to_time(attendance.hour_to))` This introduces the microsecond unavaibility at the end of the day, which blocks the booking. (it's working properly for availability on users appointments) **Fix:** Changed the condition so that 23:59:59.999999 is considered as equal to 00:00. opw-5163892 Forward-Port-Of: odoo/enterprise#104927 Forward-Port-Of: odoo/enterprise#100853
This update corrects a discrepancy in a test related to how subscription pricelists are ordered. The change ensures that pricelists are correctly prioritized based on their sequence and ID, regardless of whether a partner has a country assigned. This resolves a technical issue that didn't impact business operations.
Original PR description
Versions -------- - 18.0+ Issue ----- Commit a840e4250666 changed a `sale_subscription` test as pricelist ordering was changed. Before, it was `sequence asc, id desc`, now it is `sequence asc, id asc`. However, in the updated tests, it expects the first pricelist created with sequence 4 to be before the second pricelist with sequence 2. This was only happening due to default pricelists getting set as the `specific_property_product_pricelist` if the partner has no country assigned to them. Solution -------- As the behavior is now identical for partners with or without a country assigned to them, we can resolved the test setup by giving both pricelists an identical sequence, making the ordering fall back on `id` like a840e4250666 intended. opw-5385213 Related: https://github.com/odoo/odoo/pull/241736 Forward-Port-Of: odoo/enterprise#105475 Forward-Port-Of: odoo/enterprise#103116
This update resolves a test failure in the web_studio module caused by a missing dependency. The test was incorrectly checking for models that weren't part of the installed modules, specifically due to the `account_edi` module. The fix ensures the test accurately reflects the installed modules and handles missing dependencies gracefully.
Original PR description
`RELATED_MODELS_TO_EXCLUDE` contains `account.edi.document`, which is installed by `account_edi`, which is neither in the `needed_modules` set nor a dependency of any of them. Therefore the test can fail because `account_edi` is not installed even though every module in the set is. Improve the test by checking that the models or fields we're checking for actually belong to the modules we've listed. Also add the missing module in the list. Forward-Port-Of: odoo/enterprise#105408 Forward-Port-Of: odoo/enterprise#104879
This update resolves an issue where payment reports were inconsistently using different export formats (NACHA or localization-specific). The fix ensures that payment reports now automatically use the correct format based on the company's localization, improving report accuracy and usability for users. This change also includes added testing.
Original PR description
\* = l10n_{ae, au, ch, in, sa, us}_hr_payroll + hr_payroll_account_iso20022
Issue:
The current behavior looks deterministic: when clicking on "Create Payment Report" it -sometimes- shows the current company's export format by default, other times it shows the "NACHA" type. Or it could be the last installed module's export format value for the other companies.
Solution:
I fixed it in this PR: https://github.com/odoo/enterprise/pull/93683 and now backporting the changes to version 18.0
task-5189295
Forward-Port-Of: odoo/enterprise#104086
Forward-Port-Of: odoo/enterprise#100126This update fixes a potential issue where applicants could incorrectly reopen expired or fully-signed job offers. The change prevents access to these offers, ensuring data integrity and preventing applicants from attempting to re-sign outdated offers. This improves the overall offer management process.
Original PR description
This commit improves the offer validation logic to avoid invalid or unintended signature attempts. Fixes included: - Block access to offers that are already fully signed, preventing applicants from reopening the link and unintentionally reverting the offer to a partially signed state. These changes ensure that expired or fully processed offers no longer expose active signature links and that offer validity is consistently enforced at the database level. task-5405456 Forward-Port-Of: odoo/enterprise#103734 Forward-Port-Of: odoo/enterprise#101834
This update resolves a bug that caused the follow-up report to crash when users unfolded partner lines while prefix groups were enabled. The fix corrects an error in how the report processed data, ensuring stability and reliable report generation for all users.
Original PR description
When prefix groups were enabled, and a prefix group line had been unfolded, the report crashed when trying to unfold the partner. This happened because res_ids_map is computed for each of the unfolded lines, including the prefix groups one, which then had no 'res.partner' key, causing a key error. Forward-Port-Of: odoo/enterprise#105525
This update fixes a bug in the Austrian Tax Report where VAT from vendor bills was incorrectly subtracted instead of added. The change adjusts a key formula to accurately reflect the total, aligning with previous versions and ensuring correct tax reporting. This ensures accurate tax calculations for Austrian businesses.
Original PR description
### Issue: In 19.0, VAT from vendor bills was subtracted from the total in the Austrian Tax Report, instead of being added ### Cause: The expression `tax_report_line_l10n_at_tva_line_7_total` uses an incorrect formula: `<field name="formula">AT_0004.vat - AT_0005.vat + AT_090.vat</field>` It should instead be: `<field name="formula">AT_0004.vat + AT_0005.vat + AT_090.vat</field>` This matches the behavior of previous versions In 18.0, there was no aggregated AT_0005 line All values were summed together, which effectively resulted in the same total ### Steps to reproduce: - Install `l10n_at_reports` - Switch to AT Company - Open the Tax Return and note the last line value for the current month - Create and confirm a vendor bill with 20% VAT - Compare the new value in Tax return Before the fix, the total line was decreased instead of increased opw-5349445 Odoo PR: https://github.com/odoo/odoo/pull/244471
8 changes
Resolved issues and error corrections
This update fixes an issue where the tour pointer was appearing in unwanted locations, like above dialogs, creating a cluttered user experience. Now, the pointer is hidden when it's not directly linked to the active element, resulting in a cleaner and more focused tour experience.
Original PR description
POC for task-5490670 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a critical issue preventing upgrades for the Dutch accounting module (l10n_nl) due to a conflict between fiscal position creation and account setup. Setting `force_create=True` allows the upgrade to proceed without errors related to missing Dutch accounts. Further investigation suggests this change is a temporary solution while the root cause of the account creation problem is addressed.
Original PR description
`force_create` must be `True` because there are fiscal positions being created that assume the existence of some Dutch accounts. If these accounts don't exist, the ORM will attempt to create fiscal…
`force_create` must be `True` because there are fiscal positions being created that assume the existence of some Dutch accounts. If these accounts don't exist, the ORM will attempt to create fiscal positions with `NULL` values in columns that require `NOT NULL`.
I am still looking into why the fiscal positions are created, while accounts aren't, but I found that setting `force_create=True` solves the problem. Given the argumentation behind having it set to `False`:
> The goal is that we do not need to be more accurate on what we need to update when updating the CoA
(https://github.com/odoo/odoo/commit/a3c57b4f0198236b04486d336d56b25de74677b8)
I believe we can safely set it `True` in order to unblock numerous failing upgrades, for now.
Moreover, I suspect that further investigation into this issue will show that we shouldn't be setting `force_create=False`, ever, therefore rendering the newly introduced argument redundant.
Example traceback from [upg-2736856](https://upgrade.odoo.com/web#id=2736856&cids=1&model=upgrade.request&view_type=form&menu_id=107):
```
Traceback (most recent call last):
File "/home/odoo/src/odoo/18.0/odoo/service/server.py", line 1321, in preload_registries
registry = Registry.new(dbname, update_module=update_module)
File "<decorator-gen-13>", line 2, in new
File "/home/odoo/src/odoo/18.0/odoo/tools/func.py", line 97, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/18.0/odoo/modules/registry.py", line 127, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/src/odoo/18.0/odoo/modules/loading.py", line 515, in load_modules
migrations.migrate_module(package, 'end')
File "/home/odoo/src/odoo/18.0/odoo/modules/migration.py", line 254, in migrate_module
mod.migrate(self.cr, installed_version)
File "/home/odoo/src/odoo/18.0/addons/l10n_nl/migrations/3.4/end-migrate.py", line 7, in migrate
env['account.chart.template'].try_loading('nl', company, force_create=False)
File "/home/odoo/src/odoo/18.0/addons/account/models/chart_template.py", line 160, in try_loading
return self._load(template_code, company, install_demo, force_create)
File "/home/odoo/src/odoo/18.0/addons/account/models/chart_template.py", line 227, in _load
self._load_data(data)
File "/tmp/tmpw4wedv5j/migrations/account/0.0.0/pre-ensure-deferred-accounts.py", line 36, in _load_data
return super()._load_data(data, *args, **kwargs)
File "/home/odoo/src/odoo/18.0/addons/account/models/chart_template.py", line 653, in _load_data
created_records[model] = self.with_context(lang='en_US').env[model]._load_records(all_records_vals, ignore_duplicates=ignore_duplicates)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5489, in _load_records
data['record']._load_records_write(data['values'])
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5407, in _load_records_write
self.write(values)
File "/home/odoo/src/odoo/18.0/addons/base_vat/models/account_fiscal_position.py", line 19, in write
return super().write(vals)
File "/home/odoo/src/odoo/18.0/addons/account/models/partner.py", line 196, in write
return super(AccountFiscalPosition, self).write(vals)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4794, in write
field.write(self, value)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 4508, in write
self.write_batch([(records, value)])
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 4529, in write_batch
self.write_real(records_commands_list, create)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 4725, in write_real
flush()
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 4680, in flush
comodel.create(to_create)
File "<decorator-gen-120>", line 2, in create
File "/home/odoo/src/odoo/18.0/odoo/api.py", line 496, in _model_create_multi
return create(self, arg)
File "/tmp/tmpw4wedv5j/migrations/util/orm.py", line 248, in wrapper
return f(*args, **kwargs)
File "/tmp/tmpw4wedv5j/migrations/base/0.0.0/pre-models-match_uniq.py", line 25, in create
return super().create(vals_list)
File "<decorator-gen-31>", line 2, in create
File "/home/odoo/src/odoo/18.0/odoo/api.py", line 496, in _model_create_multi
return create(self, arg)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5020, in create
records = self._create(data_list)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5204, in _create
cr.execute(SQL(
File "/home/odoo/src/odoo/18.0/odoo/sql_db.py", line 354, in execute
res = self._obj.execute(query, params)
psycopg2.errors.NotNullViolation: null value in column "account_src_id" of relation "account_fiscal_position_account" violates not-null constraint
DETAIL: Failing row contains (16, 4, 1, null, null, 1, 1, 2025-04-07 06:42:17.6166, 2025-04-07 06:42:17.6166).
```This update resolves a problem where custom tax groups (beyond the standard 6) were causing efaktur printing errors. The fix ensures that efaktur printing works correctly with user-defined tax groups, while also correcting how tax values are calculated for invoices with mixed tax groups.
Original PR description
Description of the issue/feature this PR addresses: This issue occured because in the previous update we add a condition to restrict multiple tax groups excluding the STLG. Apparently there is a case…
Description of the issue/feature this PR addresses: This issue occured because in the previous update we add a condition to restrict multiple tax groups excluding the STLG. Apparently there is a case where some users create their own tax groups (for example for PPH) so when they want to print an efaktur it will raise an error. Current behavior before PR: If a user create their own tax with a new tax group (outside of the 6 groups defined in `l10n_id`) and use it in invoice line along with one of the 6 tax groups excluding the STLG then it will blocked the print efaktur because it will raise an error Desired behavior after PR is merged: - The restriction in tax groups only applied for the 6 tax groups in l10n_id so if an invoice line has multiple tax groups as long as there no more than one of the 6 tax groups excluding the STLG then it should be able to print the efaktur. - Also when building the efaktur coretax value, the new tax group should not be included in the regular_tax variable which will cause the value to be 11/12 of the original value. - Add new condition to block the print efaktur if there is a tax inside the invoice but none of it belong to the 6 ppn tax groups (there is already a condition to block if no tax is given, but now since there are cases where they use tax group outside of the defined tax groups then it will print the efaktur) - If an invoice line does not have any ppn_tax_groups but there are other line in the same invoice that has it then it will still be able to print the efaktur, but the line without the ppn tax will have the OtherTaxBase and VATRate set to zero which will calculate the VAT as 0 too. [5434656](https://www.odoo.com/odoo/project.task/5434656) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241979
This update fixes an error in the Time Off Balance report that was incorrectly calculating remaining leave days. The report previously aggregated allocations across different periods, leading to inaccurate balances. The fix ensures allocations are correctly deducted only when taken within the same period, improving report accuracy.
Original PR description
The balance report aggregates allocations regardless of the period in which they occur resulting in wrong information when an employee has two allocations in different periods and a filter is used in the report Steps to reproduce: 1. Install Time Off app 2. Open Time Off app and go to Management > Allocations 3. Create a new allocation of 100 days for employee "Mitchell Admin" of time off type "Paid Time Off" with a validity period from 01/01/2027 to 31/12/2027 and approve it 4. Go to Reporting > Balance 5. The number of days left for "Mitchell Admin" for "Paid Time Off" is 120 days even though the default filter is on the period of 2026 Solution: Subtract leaves taken from allocations only if they take place in the same period opw-5156142
This update prevents the deletion of attachments from email templates when removed from the mail composer. Previously, removing an attachment resulted in it being permanently lost, impacting future email communications. The fix ensures attachments remain associated with their templates, maintaining data integrity.
Original PR description
**Step to reproduce:** 1. Install `sale_management` 2. Open any email template (e.g., Sale: Order Confirmation). 3. Add an attachment to it 4. Create a Sale Order, confirm it, and click "Send by…
**Step to reproduce:** 1. Install `sale_management` 2. Open any email template (e.g., Sale: Order Confirmation). 3. Add an attachment to it 4. Create a Sale Order, confirm it, and click "Send by Email". 5. In the mail composer, remove the template attachment **Issue:** - The removed attachment is deleted from the database (`ir.attachment`). Consequently, the attachment is permanently removed from the source Email Template and will not appear in future emails. **Cause:** - The `onFileRemove` function in `MailComposerAttachmentList` calls the `unlink` method of the `attachmentUploadService` for every file removed, without considering the existing template attachment. **Solution:** 1. Update `mailComposerAttachmentList` to include `res_model` in `relatedFields` so it is fetched from the server. 2. In `onFileRemove`, check the `res_model` of the attachment. 3. If the `res_model` is not "mail.compose.message", skip the database deletion (unlink) and only remove it from the composer view. opw-5163679
This update fixes an issue where loyalty discounts weren't correctly shared between restaurant sessions. The change removes unnecessary data to prevent errors during order validation and payment, ensuring discounts are applied consistently across all sessions. This improves the customer experience and accuracy of loyalty rewards.
Original PR description
Steps: - Install `pos_restaurant_loyalty` - Create a discount for example: if 2 coca -> 10% - Open a restaurant session - Open another restaurant session with the same user in incognito - Add 2 coca…
Steps: - Install `pos_restaurant_loyalty` - Create a discount for example: if 2 coca -> 10% - Open a restaurant session - Open another restaurant session with the same user in incognito - Add 2 coca + sushi in session 1 and press "Order" - In session 2 products are automatically added, in live - Try to validate the order from session 2 - Traceback Traceback is due to the fact that, in order to synchronize, session 1 must send data to the server, which in turn sends further data to all sessions. The problem is that as coupons are only created once the order has been validated, they are not yet “really created” on the customer side. To avoid sending “invalid” records, we remove them from the data via an override of the `serialize` method in `Base`. But since python doesn't receive coupons, it can't send coupons to other sessions, so if we try to pay with the session that didn't initially get the discount, it will cause a traceback. The solution is to remove `is_reward_line` as well. Because it already makes no sense to have a `PosOrderLine` which is a reward line without a coupon, and then because it will regenerate the discounts in the new session. opw-4892767
This update fixes an error in the SYSCOHADA Profit and Loss report that resulted in incorrect gross margin calculations. The report was incorrectly adding instead of subtracting RA from TA, leading to inaccurate financial reporting. This ensures the report aligns with the official SYSCOHADA guidelines.
Original PR description
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It…
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It is TA (701) - RA (601) +/- RB (6031). TA and RA should always be positive and negative, respectively.
In the report "Profit and Loss (SYSCOHADA)", the line RA is negated. XA then subtracts this value from TA, adding the two values instead of subtracting them.
Steps to reproduce:
1. Create a new company on runbot.
2. In Accounting > Configuration > Settings, set their Fiscal Localization to Ginea - SYSCOHADA for Companies.
3. Make a MISC journal entry.
1. Set a credit of 110,000,000 on account 701100 and balance it with 411100.
5. Set a debit of 75,000,000 on account 601100 and balance it with 401100.
6. Set a credit of 5,000,000 on account 603100 and balance it with 411100.
7. Post the entry.
8. Navigate to Accounting > Reports > Profit and Loss.
9. Set the l10n version, Profit and Loss (SYSCOHADA).
10. Set the current date.
11. See XA = 110 million + 75 million + 5 million = 190 million; this does not match the example given on pg 357 of Guide-d-application-du-SYSCOHADA.pdf, where XA = 40 million.
[opw-5482300](https://www.odoo.com/odoo/project.task/project.task/5482300)
Forward-Port-Of: odoo/enterprise#104479This update corrects a bug in the automatic currency rate system. The BNB now provides exchange rates in EUR, and this change ensures that companies using EUR as their main currency can correctly sync exchange rates. Companies using BGN will also experience the same error, as expected.
Original PR description
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the…
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the BNB now provides rates against EUR. This caused the error "Your main currency (EUR) is not supported by this exchange rate provider" when Bulgarian companies with EUR as their main currency tried to sync exchange rates. refs: We can compare the data here from 31 December using the WayBackMachine: https://web.archive.org/web/20251231193558/https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm Compared to today: https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm And see the comparison used to be to BGN but is now for EUR Steps To Reproduce: 1. Create a company for Bulgaria with EUR as the main currency. 2. Go to Accounting Settings -> Automatic Currency Rates. 3. Select "[BG] Bulgaria National Bank" as the service provider. 4. Click the sync button. 5. Error appears: "Your main currency (EUR) is not supported by this exchange rate provider. Please choose another one." The fix updates the base currency from BGN to EUR, matching the current BNB XML format which now provides rates against EUR. Note: Companies with BGN as main currency will now get the same error, which is expected since the BNB no longer provides BGN-based rates. This behavior was discussed and confirmed with the PO. Ticket [link](https://www.odoo.com/odoo/project.task/5483771) opw-5483771 Forward-Port-Of: odoo/enterprise#105074
8 changes
Resolved issues and error corrections
This update fixes an issue where the IoT Box was incorrectly downloading standard drivers, potentially causing conflicts and reintroducing previous problems. Now, the IoT Box only downloads custom drivers enabled by a checkbox, preventing data duplication and ensuring stability.
Original PR description
The stable IoT Box uses drivers from git repository: it doesn't download them from the database as it used to do. However, sh/on premise clients might want to develop custom drivers that the IoT Box would download. For that, they have to enable a checkbox on the IoT homepage, making the IoT Box download handlers as before. The issue is it will also download standard drivers that are already present on the IoT Box: on newer databases it would simply overwrite them, but on older ones, it would duplicate as names might have changed. Also, it would introduce issues back that were already fixed. To avoid this, we avoid adding drivers from standard modules to the downloaded archive, to prevent issues with the main ones.
This update fixes an issue where the 'Average hours per day' calculation in employee scheduling was inaccurate. The fix ensures that all attendance records are considered when determining daily hours, providing a more reliable and consistent view of employee time. This change improves the accuracy of scheduling and reporting.
Original PR description
Steps to reproduce: ------------------- 1. Install hr_employee 2. Open Working Schedules and select any record 3. Enable the Start Date or End Date optional column 4. Set a start or end date on one…
Steps to reproduce: ------------------- 1. Install hr_employee 2. Open Working Schedules and select any record 3. Enable the Start Date or End Date optional column 4. Set a start or end date on one of the working hours Issue: ------ The "Average hours per day" value changes unexpectedly after setting a start or end date on an attendance line. Cause: ------ The `_compute_hours_per_day` method relies on `_get_global_attendances`, which excludes attendances having `date_from` or `date_to`. https://github.com/odoo/odoo/blob/67e4cd087de179a7b06c23321cfc4e6d5aa2a9dd/addons/resource/models/resource_calendar.py#L165-L169 Solution: --------- Compute the `hours_per_day` independently of attendance `date_from` or `date_to` by including all attendances in the computation, ensuring a consistent and correct value. **NOTE:** The `date_from` and `date_to` fields are removed from version 19.0. related commit: 77f860f opw-5417724 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update streamlines the tax prediction process within invoices by preventing unnecessary recalculations when taxes are already defined. Previously, the system would repeatedly attempt to predict taxes, leading to slower performance. This change ensures more efficient tax calculations and a smoother user experience.
Original PR description
Before this commit, the tax prediction system would unnecessarily recalculate taxes on invoice lines that already had taxes assigned. This occurred because the `_onchange_name_predictive` method calls `_predict_taxes`, which runs even when taxes are already present on the line. This creates redundant processing and potential conflicts with the separate prediction flow in `_get_edi_creation` → `_retrieve_taxes` → `_get_specific_tax` → `AccountMoveLine._predict_specific_tax`. This commit adds a check to skip prediction when taxes are already set on the invoice line, avoiding duplicate processing and ensuring consistency between the two prediction pathways. OPW-5441710
This update resolves an issue where the copy-to-clipboard feature in Odoo 17 was misconfigured, leading to incorrect text copying. By updating the widget's configuration, the feature now correctly uses the intended copy text and aligns with how it's used in project sharing, improving usability.
Original PR description
**Description of the issue/feature this PR addresses:** The `CopyClipboardField` widget previously relied on the `string` attribute inside `attributes` to determine the text of copy button. In Odoo…
**Description of the issue/feature this PR addresses:** The `CopyClipboardField` widget previously relied on the `string` attribute inside `attributes` to determine the text of copy button. In Odoo 17+, the `string` attribute is no longer inside `attributes` but defined outside, causing the widget to break. Additionally, using `string` for copy text caused confusion between the field label and the text to copy (`copyText`). The correct approach is to use widget options for defining `copyText`, as intended in the project share link. In the Payment Wizard button, the widget was inherited and `extractProps` was overridden to handle the `string` attribute manually, which is no longer necessary with the new approach. **Current behavior before PR:** - `CopyClipboardField.extractProps` reads the removed `string` attribute from `attributes`. - The copy text could be confused with the field label (`string`). - Project share link usage fails to read copy text correctly because the widget does not read options. - `PaymentWizardCopyClipboardButtonField` overrides `extractProps` unnecessarily to fix copy text handling. **Desired behavior after PR is merged:** - `CopyClipboardField` reads `copyText` from widget options, no longer relying on the removed `string` attribute. - Copy text is clearly separated from field labels. - Project share link now works correctly using the new `copyText` option. - `PaymentWizardCopyClipboardButtonField` no longer needs to override `extractProps` and copy text is set directly in field options --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where AvaTax was failing due to orders lacking at least one line item. Specifically, it filters out orders without lines to prevent errors that blocked key business flows, such as invoice generation. This ensures AvaTax data is always accurate and reliable.
Original PR description
Backport of https://github.com/odoo/enterprise/pull/101643. Original commit message for completeness: Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the…
Backport of https://github.com/odoo/enterprise/pull/101643. Original commit message for completeness: Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the taxes related to MXXX - SOXXX/XXX. Please check the status of `Sales Order XXX` in the AvaTax portal. Transactions must have at least one line. ``` There are various cases this can happen: 1/ if industry_fsm_stock is installed, empty orders are confirmed [1], 2/ if you put the end_date of a subscription before the next_invoice_date, then none of the lines are considered invoiceable [2] and you get the error when viewing the subscription in the portal This commit filters out orders without lines. It's also possible to filter this on the level of the models by doing it in _get_and_set_external_taxes_on_eligible_records(). However, this means doing it separately for each model, and requires every implementer do it manually. [1] https://github.com/odoo/enterprise/blob/703e7fd413e93a8287da98286aa93b9699ae3e96/industry_fsm_stock/models/project_task.py#L159 [2] https://github.com/odoo/enterprise/blob/c7bf4367a9bf6757a36a9f34a872a6e35a19a3a5/sale_subscription/models/sale_order_line.py#L475 opw-5214609 opw-5247727 opw-5311132 opw-5385960
This update resolves an issue where customer claims weren't being processed correctly when multiple invoices sharing the same VAT number were involved. Specifically, the system was limiting searches to a single partner per VAT number, causing it to miss account moves linked to child invoices. This ensures accurate claim processing and updates.
Original PR description
When we process new customer claims, we need to search for the corresponding account moves in order to update their `l10n_cl_dte_acceptation_status`. Currently, we only expect 1 partner per VAT number when searching for a partner to match with the account move. However, this is not always true. For instance, a child invoice contact will share the same VAT number than the parent partner. This can lead to the selection of the wrong partner in the search domain and consequently, the account move not being found. Related ticket: opw-5257481
A test related to Swiss payroll processing failed due to incorrect validation rules. This fix ensures that custom validation logic for Swiss companies is applied only when appropriate, resolving the test failure and maintaining the accuracy of Swiss payroll calculations.
Original PR description
Steps to reproduce ================== - Install l10n_ch_hr_payroll_elm_transmission - Run the test test_payslip_paid_past => AssertionError: ValidationError not raised Cause of the issue ================== The swiss localization use a custom validation. It should only be applied when the company is a swiss company. runbot-116903
This update resolves a problem preventing demo data creation in the l10n_be_hr_payroll_fleet module. The module incorrectly relied on a different dependency, leading to a missing field when auto-install was disabled. The fix ensures the correct dependency is used, allowing demo data to be created without errors.
Original PR description
Steps to reproduce: 1. Install l10n_be_hr_payroll_fleet with --skip-auto-install and demo data. 2. Traceback when creating demo data because driver_employee_id is missing on the model fleet.vehicle Cause: The module depends on fleet instead of hr_fleet so hr_fleet is only auto installed. Thus, when skipping auto install, the field driver_employee_id doesn't exist. Fix: Change the dependency from fleet to hr_fleet to force the module to be installed. Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/237909 Task: 5875410