Daily updates from Odoo
Tuesday, March 3, 2026
181 changes
12 changes
Resolved issues and error corrections
This update resolves an issue where the system didn't properly handle mismatched DIAN operation modes. When the user selects an incorrect mode for Colombian electronic invoicing, a warning is now displayed to prevent incorrect invoice generation. This ensures compliance with DIAN regulations.
Original PR description
Steps to reproduce: - Install `l10n_co_dian` module(demo data) > Switch to `CO Company` - Settings > Colombian Electronic Invoicing > Change the Operation Mode: `DIAN 2.1: Support Documents`(eg:…
Steps to reproduce:
- Install `l10n_co_dian` module(demo data) > Switch to `CO Company`
- Settings > Colombian Electronic Invoicing > Change the Operation Mode: `DIAN 2.1: Support Documents`(eg: [Image](https://www.awesomescreenshot.com/image/58874464?key=0cb74e446dcdb0f087df6ed619f785c2))
- Vendors > Create a Bill > Confirm > `Acknowledge Reception`
Traceback:
```py
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_move.py", line 293, in l10n_co_dian_send_event_update_status_received
self._l10n_co_dian_send_event_update_status('received')
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_move.py", line 313, in _l10n_co_dian_send_event_update_status
document = self.env['l10n_co_dian.document']._send_commercial_event(self, commercial_state_next)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/l10n_co_dian_document.py", line 593, in _send_commercial_event
xml, errors = self.env['account.edi.xml.ubl_dian']._export_co_send_event_update_status_invoice(locked_move, commercial_state_next)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1208, in _export_co_send_event_update_status_invoice
return self.with_context(l10n_co_next_commercial_state=next_commercial_state)._dian_sign_xml(xml, invoice)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1524, in _dian_sign_xml
'software_security_code': self._dian_get_security_code(operation_mode, document_number),
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1443, in _dian_get_security_code
operation_mode.dian_software_id
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```
We are getting this error because `_dian_get_operation_mode` [returns] an empty `l10n_co_dian.operation_mode()` record. This happens when the `Operation modes` do not match. As a result, [operation_mode] also contains an empty record.
[operation_mode]: https://github.com/odoo/enterprise/blob/84022deef3414096fcaf61f8d45c08393431e0ab/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L1432
[returns]: https://github.com/odoo/enterprise/blob/84022deef3414096fcaf61f8d45c08393431e0ab/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L1394-L1400
sentry-7273771732
Forward-Port-Of: odoo/enterprise#107885This update fixes inaccurate calculations of worked days and work entries for new employees, particularly those with contracts starting in the current month. It ensures work entries are generated correctly and prevents unintended entries when employees have no contract, improving payroll accuracy.
Original PR description
Problems: ------- 1. For a new employee, with a contract starting in the current month but before today: in the payslip for the current month number of days of attendance and days of out of contract…
Problems: ------- 1. For a new employee, with a contract starting in the current month but before today: in the payslip for the current month number of days of attendance and days of out of contract are not correct Same for an employee, with a contract ending in the current month (before today) 2. In both cases above worked entries are not generated correctly (from today to the end of month) 3. Additional bug: If we create an employee with no contract and create a payslip draft for him for the current month, work entries with type "Attendance" will be created Objective: --------- Problems 1 and 2 : date_version was equal to today (date of the employee's creation), so number of attendance days was calculated as ( end_of_payslip_month - today ) or ( today - start_of_payslip_month ) Problem 3 : Work entries are generated even when there is no active contract Solution: --------- Problems 1 and 2: This commit adds an additional part (already exists in v19) in the method write() of hr.version which sets date_version = contract_date_start Problem 3: by generating work entries check if contract_date_start is filled Tests ware added in odoo/hr: test_hr_version.py and in enterprise/hr_payroll: test_new_employee_worked_days, test_payslip_empty_contract.py task-5430759 Forward-Port-Of: odoo/odoo#251264 Forward-Port-Of: odoo/odoo#241978
This update corrects a previous issue where archived accounts could be incorrectly assigned as default journal accounts. The change ensures that only active accounts are considered when setting up new journals, maintaining data consistency and preventing potential reporting errors. This resolves a prior inconsistency in how the system handled archived accounts.
Original PR description
### Steps to Reproduce: 1. Go to Accounting > Create a journal. 2. Archive the company’s default income/expense or cash diff. accounts. 3. Change the journal type. 3. Observe that an archived account…
### Steps to Reproduce: 1. Go to Accounting > Create a journal. 2. Archive the company’s default income/expense or cash diff. accounts. 3. Change the journal type. 3. Observe that an archived account is assigned by the onchange method. ### Issue: - Prior to saas-18.3, no onchange logic existed for assigning default accounts. With the introduction of the [onchange] (https://github.com/odoo/odoo/commit/334a8161cd2feb092cafedc35d94645900b40518) , archived income/expense or default cash diff. accounts can be assigned to journals. - This creates an inconsistency, as the domain [defined] (https://github.com/odoo/odoo/blob/saas-18.3/addons/account/models/account_journal.py#L70-#L82) for `default_account_id` only returns active accounts. ### Solution: - Since the domain for `default_account_id` returns only active accounts, this commit aims to update the onchange [logic](https://github.com/odoo/odoo/blob/saas-18.3/addons/account/models/account_journal.py#L540-#L551) in order to follow the same restriction, ensuring that only active accounts are assigned thereby preventing inconsistent behavior. OPW-5501539 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#246725
This update resolves a test issue related to the websiteUrlPicker component. The test previously relied on a real delay, leading to unpredictable failures. Now, the test uses a controlled time advance to accurately simulate the debounce process, ensuring consistent and reliable test results.
Original PR description
Issue: The websiteUrlPicker input has a 250ms debounce. The test was relying on a real 250ms delay to wait it out, creating a race condition that caused non-deterministic failures. Fix: The test now uses `advanceTime()` to advance the time to past the debounce. runbot-[241087](https://runbot.odoo.com/odoo/runbot.build.error/241087) Forward-Port-Of: odoo/odoo#251199
This update fixes a visual inconsistency in the Discuss app's dark mode. The background colors of breadcrumbs and navbar buttons were previously mismatched compared to the control panel. This change ensures a more polished and professional user experience across all Odoo modules in dark mode.
Original PR description
The background color of navbar buttons and breadcrumbs in discuss app differed from that of control panel. This PR aligns and syncs these colors for a consistent UI. | Before | After | |--------|-------| |<img width="467" height="99" alt="image" src="https://github.com/user-attachments/assets/2def30f8-18aa-4399-a5d1-1cdc70b4cd81" /> |<img width="458" height="111" alt="image" src="https://github.com/user-attachments/assets/5578cd25-7686-4543-a8dc-3e0fe5aeb4fc" />| This PR contains backport of #217608 task-[4936733](https://www.odoo.com/odoo/project/1519/tasks/4936733) task-[5487197](https://www.odoo.com/odoo/project/1519/tasks/5487197) Forward-Port-Of: odoo/odoo#251360 Forward-Port-Of: odoo/odoo#250601
This update resolves an issue where posted 'Miscellaneous' journal entries in the Chilean localization were incorrectly flagged with a validation error regarding document numbers. The fix exempts these journal entries from the numeric folio validation rule, allowing users to correctly modify and save them. This ensures proper functionality for Chilean accounting operations.
Original PR description
Currently, editing a posted `miscellaneous` journal entry in Chile localization incorrectly raises a validation error. **Steps to reproduce:** - Install the `l10n_cl` module and switch to the `CL…
Currently, editing a posted `miscellaneous` journal entry in Chile localization incorrectly raises a validation error. **Steps to reproduce:** - Install the `l10n_cl` module and switch to the `CL company`. - Go to Accounting > Accounting > Journal Entries. - Create a balanced entry using the `Miscellaneous journal `and `post` it. - Reset it to draft, modify the `name`, and try to `save` it. **Observation:** `Validation error`: `The DTE document number (folio) must contain only digits.` **Root cause:** At [1], the constraint validation is applied to all journal entries in Chilean companies, including `miscellaneous` journals. However, `miscellaneous journals (move_type = 'entry')` are not linked to Chilean electronic documents, so the numeric folio validation should not apply to them. **Fix:** This commit ensures that the validation is not raised for `miscellaneous` journal types by excluding miscellaneous journals from the numeric folio validation constraint. [1]: https://github.com/odoo/odoo/blob/f39785bcddd1eb5b7fb503d053c9bb66e2a0f15c/addons/l10n_cl/models/account_move.py#L20-L30 opw-5926773 Forward-Port-Of: odoo/odoo#248965
A technical issue preventing payrun creation for Hong Kong employees has been fixed. The update corrects a naming error that was causing errors during payrun generation, ensuring accurate payroll processing for our HK clients. This resolves a previous disruption to the payrun workflow.
Original PR description
In the big commit adding eMPF to the hk localization, a function was miss named and was causing an error when trying to create a payrun. Steps to reproduce: - Install belgian localization - Install HK localization - Select the belgian company - Create a payslip for a belgian employee (works fine) - Create a payrun and select the same employee from the list - Get an error In this commit we fix the naming of the function and everything goes back to working. Task: 5960503 Forward-Port-Of: odoo/enterprise#109196
This update fixes an issue where new tables on restaurants with multiple floors were assigned numbers based on the highest number across all floors, leading to potential conflicts. Now, new tables are assigned numbers based on the highest number on the current floor, simplifying table management and preventing numbering errors.
Original PR description
Before this commit: =================== When multiple floors exist, creating a new table assigns the next table number based on the maximum table number across all floors. After this commit: ================== When multiple floors exist, creating a new table assigns the next table number based on the maximum table number of the current floor. Task: 5888449 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246975
This update adjusts the size of custom snippet titles within Mass Mailing to ensure they are easily readable. A recent update to the preview snippet selector required a change in font size for these titles. This fix maintains the original appearance of custom snippets at the new scale, improving user experience.
Original PR description
In Mass Mailing, users can save modified snippets as Custom Snippets, allowing for their later reuse. These snippets can be found in the Custom category. However, their title was too large. This is due to d2b56435736e8d507434c1378cb68fae23e8511f rescaling the preview snippet selector, allowing for better readability of each snippet's text from the selector. As the default builder font size for custom snippet titles was set for the previous scale (50px at 0.3 scale), it has to be halved to restore its previous appearance at the new scale (25px at 0.6 scale). task-5959033 Forward-Port-Of: odoo/odoo#250609
This update corrects a technical issue in the Hungarian tax audit export process. Previously, changes to invoice data were unintentionally saved to the database, causing potential errors. The fix ensures data is properly cleared from the cache before and after savepoints, preventing these unwanted database updates.
Original PR description
At the moment, the Hungarian tax audit export wizard's `action_export` creates a savepoint with `flush=False`. The intention of this savepoint is to roll back the changes to `l10n_hu_edi_invoice_chain` once the savepoint exits. But because the changes to `l10n_hu_edi_invoice_chain` stay in cache, and the cache is not flushed before the savepoint is created nor cleared afterwards, those changes end up being committed to DB. Which is precisely what the savepoint was there to prevent. Solution: we use `flush=True` to make sure the cache is flushed before and cleared after the savepoint. task-none Forward-Port-Of: odoo/odoo#251322 Forward-Port-Of: odoo/odoo#250971
This update fixes an issue where the lot number for products tracked by lot in POS sales orders wasn't consistently displayed. The fix ensures that the correct lot number is accurately reflected across all product lines within the POS interface. This improves order accuracy and traceability for products with lot tracking.
Original PR description
When opening an SO in POS that has a product tracked by lot that is split into several location, the lot number will only appear in one of the line and not the others Steps to reproduce:…
When opening an SO in POS that has a product tracked by lot that is split into several location, the lot number will only appear in one of the line and not the others Steps to reproduce: ------------------- 1. Create a Product A tracked by lot, create lot 111 and add 1 unit to location A and another one to location B 1. Create a sales order 2. Add two units of the product to the sale order 3. Confirm the sales order 4. Open the transfer, make the transfer retrieve the product from several location with the same lot. 5. Save the transfer 6. Open the sales order in POS 7. Load the SN/lots -> Two line of qty 1 appear for the product A but only the first one has the lot number Additional Issue: 8. Change the number of the product for the first line to 2 and erase the second line 9. Confirm and Pay 10. Close POS 11. Open move lines for this product (Inventory>product>In/out) -> It moves 2 product from one location (when there is only product) Observation: ------------- When loading the SO in POS, we will retrieve the SO: https://github.com/odoo/odoo/blob/cb1f5d9c6db64b9ace9b7aa46bd6f94e4462176b/addons/pos_sale/static/src/app/order_management_screen/sale_order_management_screen/sale_order_management_screen.js#L104 While retrieving the SO, we will also retrieve the SOL, with additional information: https://github.com/odoo/odoo/blob/d9b2e5ee730a4e79586bfd3f09adfb794d2dc1f3/addons/pos_sale/models/sale_order.py#L79 -> Issue is that when several moves_line have the sale lot_id.name, their quantity will be overwritten. Addition Issue : When closing pos, all the move will be processed, when processing those moves, the origin only check if the quantity is more than 0 and not if there is enought units. https://github.com/odoo/odoo/blob/cb1f5d9c6db64b9ace9b7aa46bd6f94e4462176b/addons/point_of_sale/models/stock_picking.py#L293-L297 opw-5347992 Forward-Port-Of: odoo/odoo#251270 Forward-Port-Of: odoo/odoo#243347
This update fixes a display issue in the website editor where an incorrect 'Custom URL' field was appearing. The change prevents this field from showing when the website URL doesn't support customization, ensuring a cleaner and more accurate SEO experience for users. This improves the usability of the website editor.
Original PR description
This PR hides the "Custom Url" field in the "Search Engine Optimization" when the URL of the current page do not contain any editable slug. Previously, this field could be filled when the URL did not…
This PR hides the "Custom Url" field in the "Search Engine Optimization" when the URL of the current page do not contain any editable slug. Previously, this field could be filled when the URL did not contain any modifiable slug. However, the value was not take into account since the route of the page did not expect slug. Reproduce: With an admin user, activate the website editor on an appointment page. Clicking on "Optimize SEO" in the "Site" dropdown menu, a form containing the "Cutsom Url" field is displayed. This field should represent the current page's URL but with fillable field instead of the editable URL part. In this case, this is not correct as the URL is repeated before and after the fillable field, which does not represent the current URL. Also, the URL is not modified with the value entered in the fillable field. After the fix: The "Custom Url" field must not be displayed when URL does not contain a customisable slug. Task-5114394 Forward-Port-Of: odoo/odoo#251294 Forward-Port-Of: odoo/odoo#231609
37 changes
Resolved issues and error corrections
This update resolves an issue where the system wasn't properly validating DIAN invoice settings. Specifically, if the DIAN operation mode doesn't match the company's configuration, a warning is now displayed to prevent incorrect invoice generation. This ensures compliance with Colombian regulations.
Original PR description
Steps to reproduce: - Install `l10n_co_dian` module(demo data) > Switch to `CO Company` - Settings > Colombian Electronic Invoicing > Change the Operation Mode: `DIAN 2.1: Support Documents`(eg:…
Steps to reproduce:
- Install `l10n_co_dian` module(demo data) > Switch to `CO Company`
- Settings > Colombian Electronic Invoicing > Change the Operation Mode: `DIAN 2.1: Support Documents`(eg: [Image](https://www.awesomescreenshot.com/image/58874464?key=0cb74e446dcdb0f087df6ed619f785c2))
- Vendors > Create a Bill > Confirm > `Acknowledge Reception`
Traceback:
```py
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_move.py", line 293, in l10n_co_dian_send_event_update_status_received
self._l10n_co_dian_send_event_update_status('received')
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_move.py", line 313, in _l10n_co_dian_send_event_update_status
document = self.env['l10n_co_dian.document']._send_commercial_event(self, commercial_state_next)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/l10n_co_dian_document.py", line 593, in _send_commercial_event
xml, errors = self.env['account.edi.xml.ubl_dian']._export_co_send_event_update_status_invoice(locked_move, commercial_state_next)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1208, in _export_co_send_event_update_status_invoice
return self.with_context(l10n_co_next_commercial_state=next_commercial_state)._dian_sign_xml(xml, invoice)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1524, in _dian_sign_xml
'software_security_code': self._dian_get_security_code(operation_mode, document_number),
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1443, in _dian_get_security_code
operation_mode.dian_software_id
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```
We are getting this error because `_dian_get_operation_mode` [returns] an empty `l10n_co_dian.operation_mode()` record. This happens when the `Operation modes` do not match. As a result, [operation_mode] also contains an empty record.
[operation_mode]: https://github.com/odoo/enterprise/blob/84022deef3414096fcaf61f8d45c08393431e0ab/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L1432
[returns]: https://github.com/odoo/enterprise/blob/84022deef3414096fcaf61f8d45c08393431e0ab/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L1394-L1400
sentry-7273771732
Forward-Port-Of: odoo/enterprise#107885This update resolves an issue where the 'Reset Selected Work Entries' button in the HR work entry Gantt view would fail if no employees were selected. The fix ensures the button functions correctly, preventing a data error related to missing employee IDs. This improves the reliability of the work entry management process.
Original PR description
This error occurs when clicking the `Reset Selected Work Entries` button while there are no employees in the work entries. Steps to reproduce: - Install `hr_payroll` module - Payroll > Work Entry >…
This error occurs when clicking the `Reset Selected Work Entries` button while there are no employees in the work entries. Steps to reproduce: - Install `hr_payroll` module - Payroll > Work Entry > Remove `Active` Filter - Select any cell and click on the reset button Traceback: `KeyError: 'employee_id'` This error occurs when the `Reset Selected Work Entries` button is clicked without an employee, causing `employee_id` to be missing at [1]. Solutions: - Raise a validation error when no employee is selected and the `Reset Selected Work Entries` button is clicked. - Fix the error that occurs when clicking the `Set` button to add or replace a work entry. - Fix the error that occurs when the `Active` filter is enabled and the `Reset` button is clicked. ``` Missing Record Record does not exist or has been deleted. (Record: hr.employee(2,), User: 2) ``` [1]: https://github.com/odoo/odoo/blob/4949a6272691c781d5ab5a8b06f88f58d5cea4df/addons/hr_work_entry/wizard/hr_work_entry_regeneration_wizard.py#L116 sentry-7140947833 Forward-Port-Of: odoo/enterprise#103162
This update resolves a test issue caused by relying on a real delay in the website URL picker. The fix now uses a controlled time advance within the test to ensure consistent results and prevent unpredictable test failures. This improves the reliability of our website functionality.
Original PR description
Issue: The websiteUrlPicker input has a 250ms debounce. The test was relying on a real 250ms delay to wait it out, creating a race condition that caused non-deterministic failures. Fix: The test now uses `advanceTime()` to advance the time to past the debounce. runbot-[241087](https://runbot.odoo.com/odoo/runbot.build.error/241087) Forward-Port-Of: odoo/odoo#251199
This update fixes a visual inconsistency in the discuss app and control panel during dark mode. The background colors for breadcrumbs and navbar buttons were previously mismatched, now they are synchronized for a more polished and professional user experience. This ensures a consistent look and feel across the Odoo platform.
Original PR description
The background color of navbar buttons and breadcrumbs in discuss app differed from that of control panel. This PR aligns and syncs these colors for a consistent UI. | Before | After | |--------|-------| |<img width="467" height="99" alt="image" src="https://github.com/user-attachments/assets/2def30f8-18aa-4399-a5d1-1cdc70b4cd81" /> |<img width="458" height="111" alt="image" src="https://github.com/user-attachments/assets/5578cd25-7686-4543-a8dc-3e0fe5aeb4fc" />| This PR contains backport of #217608 task-[4936733](https://www.odoo.com/odoo/project/1519/tasks/4936733) task-[5487197](https://www.odoo.com/odoo/project/1519/tasks/5487197) Forward-Port-Of: odoo/odoo#251360 Forward-Port-Of: odoo/odoo#250601
This update resolves an issue where posting a 'Miscellaneous' journal entry in the Chilean localization resulted in a validation error related to document numbers. The fix exempts these specific journal entries from the numeric folio validation rule, ensuring users can correctly modify and save them. This improves usability for Chilean accounting operations.
Original PR description
Currently, editing a posted `miscellaneous` journal entry in Chile localization incorrectly raises a validation error. **Steps to reproduce:** - Install the `l10n_cl` module and switch to the `CL…
Currently, editing a posted `miscellaneous` journal entry in Chile localization incorrectly raises a validation error. **Steps to reproduce:** - Install the `l10n_cl` module and switch to the `CL company`. - Go to Accounting > Accounting > Journal Entries. - Create a balanced entry using the `Miscellaneous journal `and `post` it. - Reset it to draft, modify the `name`, and try to `save` it. **Observation:** `Validation error`: `The DTE document number (folio) must contain only digits.` **Root cause:** At [1], the constraint validation is applied to all journal entries in Chilean companies, including `miscellaneous` journals. However, `miscellaneous journals (move_type = 'entry')` are not linked to Chilean electronic documents, so the numeric folio validation should not apply to them. **Fix:** This commit ensures that the validation is not raised for `miscellaneous` journal types by excluding miscellaneous journals from the numeric folio validation constraint. [1]: https://github.com/odoo/odoo/blob/f39785bcddd1eb5b7fb503d053c9bb66e2a0f15c/addons/l10n_cl/models/account_move.py#L20-L30 opw-5926773 Forward-Port-Of: odoo/odoo#248965
This update simplifies the salary configuration process by hiding temporary salary simulation offers from the user interface. These offers are automatically removed after a month by a scheduled task, so this change focuses on preventing user confusion and a cleaner experience. It ensures users only see relevant salary options.
Original PR description
The salary simulator creates temporary offers to compute salary configurations. These offers must still exist for backend computations, as the configurator relies on them when updating results. Simulation offers are already cleaned up by a cron job after one month, so this change simply hides them from the list view to avoid user confusion. task: 5498873 Forward-Port-Of: odoo/enterprise#107340
A technical issue preventing payrun creation for Hong Kong employees has been fixed. The problem stemmed from a missing function name within the HK localization, which caused errors during payrun generation. This update ensures payruns for Hong Kong employees now function correctly.
Original PR description
In the big commit adding eMPF to the hk localization, a function was miss named and was causing an error when trying to create a payrun. Steps to reproduce: - Install belgian localization - Install HK localization - Select the belgian company - Create a payslip for a belgian employee (works fine) - Create a payrun and select the same employee from the list - Get an error In this commit we fix the naming of the function and everything goes back to working. Task: 5960503 Forward-Port-Of: odoo/enterprise#109196
A recent update to the website's image gallery introduced a bug where clicking images would cause an error. This fix addresses a technical issue related to how image pop-ups are handled, ensuring the gallery slider functions correctly and reliably. This resolves a reported customer issue and improves the overall user experience.
Original PR description
From version 19.1, a new image pop-up functionality was introduced. Now, when an image is added to the website, and the pop-up image option is enabled, Clicking the image raises a traceback. To…
From version 19.1, a new image pop-up functionality was introduced. Now, when an image is added to the website, and the pop-up image option is enabled, Clicking the image raises a traceback. To reproduce the issue: - Connect to a saas~19.1 runbot, - open the website module, and enter edit mode. - Add an image, click it, and enable the pop-up image option. - Save the changes. - Clicking the image will display the pop-up, but a traceback will appear behind it. <img width="1920" height="931" alt="Home-Odoo-02-25-2026_05_43_PM" src="https://github.com/user-attachments/assets/73662dc7-cf0e-4246-b6cd-685c758fb4d7" /> This change reintroduces the check because `this.liEls` can be undefined when only one image is added, which was causing errors when the length check was performed without it. <img width="240" height="53" alt="2026-02-25_17-45" src="https://github.com/user-attachments/assets/daea05a4-3fc9-4208-aaa6-345bd62c27c6" /> [opw-5973719](https://www.odoo.com/odoo/project/974/tasks/5973719?debug=1) Customer reported issue [here](https://www.odoo.com/odoo/project/70/tasks/5962120?debug=1) 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 technical issue in the Hungarian tax audit export process. Previously, changes to invoice data were unintentionally saved to the database, despite attempts to roll them back. By ensuring the cache is flushed before and after savepoints, this fix prevents incorrect data updates and maintains data integrity.
Original PR description
At the moment, the Hungarian tax audit export wizard's `action_export` creates a savepoint with `flush=False`. The intention of this savepoint is to roll back the changes to `l10n_hu_edi_invoice_chain` once the savepoint exits. But because the changes to `l10n_hu_edi_invoice_chain` stay in cache, and the cache is not flushed before the savepoint is created nor cleared afterwards, those changes end up being committed to DB. Which is precisely what the savepoint was there to prevent. Solution: we use `flush=True` to make sure the cache is flushed before and cleared after the savepoint. task-none Forward-Port-Of: odoo/odoo#251322 Forward-Port-Of: odoo/odoo#250971
This update fixes an issue where the lot number for products tracked by lot wasn't consistently displayed in POS sales orders. The fix ensures that the correct lot number is accurately reflected for all product lines within the order, improving inventory accuracy during point-of-sale transactions. It also addresses a related issue with quantity processing during POS closing.
Original PR description
When opening an SO in POS that has a product tracked by lot that is split into several location, the lot number will only appear in one of the line and not the others Steps to reproduce:…
When opening an SO in POS that has a product tracked by lot that is split into several location, the lot number will only appear in one of the line and not the others Steps to reproduce: ------------------- 1. Create a Product A tracked by lot, create lot 111 and add 1 unit to location A and another one to location B 1. Create a sales order 2. Add two units of the product to the sale order 3. Confirm the sales order 4. Open the transfer, make the transfer retrieve the product from several location with the same lot. 5. Save the transfer 6. Open the sales order in POS 7. Load the SN/lots -> Two line of qty 1 appear for the product A but only the first one has the lot number Additional Issue: 8. Change the number of the product for the first line to 2 and erase the second line 9. Confirm and Pay 10. Close POS 11. Open move lines for this product (Inventory>product>In/out) -> It moves 2 product from one location (when there is only product) Observation: ------------- When loading the SO in POS, we will retrieve the SO: https://github.com/odoo/odoo/blob/cb1f5d9c6db64b9ace9b7aa46bd6f94e4462176b/addons/pos_sale/static/src/app/order_management_screen/sale_order_management_screen/sale_order_management_screen.js#L104 While retrieving the SO, we will also retrieve the SOL, with additional information: https://github.com/odoo/odoo/blob/d9b2e5ee730a4e79586bfd3f09adfb794d2dc1f3/addons/pos_sale/models/sale_order.py#L79 -> Issue is that when several moves_line have the sale lot_id.name, their quantity will be overwritten. Addition Issue : When closing pos, all the move will be processed, when processing those moves, the origin only check if the quantity is more than 0 and not if there is enought units. https://github.com/odoo/odoo/blob/cb1f5d9c6db64b9ace9b7aa46bd6f94e4462176b/addons/point_of_sale/models/stock_picking.py#L293-L297 opw-5347992 Forward-Port-Of: odoo/odoo#251270 Forward-Port-Of: odoo/odoo#243347
This update prevents the 'Custom Url' field in the website SEO settings from appearing when a page doesn't have a URL segment that can be edited. Previously, this field incorrectly displayed, leading to confusion. This change ensures a cleaner user experience and avoids unnecessary steps for users managing website URLs.
Original PR description
This PR hides the "Custom Url" field in the "Search Engine Optimization" when the URL of the current page do not contain any editable slug. Previously, this field could be filled when the URL did not…
This PR hides the "Custom Url" field in the "Search Engine Optimization" when the URL of the current page do not contain any editable slug. Previously, this field could be filled when the URL did not contain any modifiable slug. However, the value was not take into account since the route of the page did not expect slug. Reproduce: With an admin user, activate the website editor on an appointment page. Clicking on "Optimize SEO" in the "Site" dropdown menu, a form containing the "Cutsom Url" field is displayed. This field should represent the current page's URL but with fillable field instead of the editable URL part. In this case, this is not correct as the URL is repeated before and after the fillable field, which does not represent the current URL. Also, the URL is not modified with the value entered in the fillable field. After the fix: The "Custom Url" field must not be displayed when URL does not contain a customisable slug. Task-5114394 Forward-Port-Of: odoo/odoo#251294 Forward-Port-Of: odoo/odoo#231609
This update fixes an issue where the VAT exigibility mention was incorrectly shown on French invoices. The change ensures the mention appears only when required by French tax regulations – specifically, when a service VAT uses invoice-based tax exigibility, aligning with standard accounting practices.
Original PR description
The VAT exigibility mention on French invoices was incorrectly displayed. - For goods, VAT on debits is the default regime, therefore the mention is not mandatory and must not be shown. - For services, VAT is normally due on payment. The mention “TVA payée sur les débits” must be displayed only when a service VAT uses tax exigibility based on invoice. This commit updates the logic to display the mention only in this specific case and omits it otherwise. Task:5418502 Forward-Port-Of: odoo/odoo#248588
This update fixes a technical issue with the API documentation tooltips in Odoo. The changes ensure tooltips are properly aligned, hide correctly, and prevent empty content from appearing, resulting in a cleaner and more user-friendly documentation experience.
Original PR description
In api_doc, the method parameters tooltips were broken. This commit fixes them by: - aligning the text to the left - improving the hideTooltip behavior - preventing `undefined` tooltip content from being displayed task-5246075 Forward-Port-Of: odoo/odoo#248289
This update corrects a problem with how VAT tax schemes are calculated for Romanian customers. Previously, an empty company registry caused errors. The fix re-introduces the necessary logic to correctly determine VAT/non-EU VAT for Romanian invoices, ensuring accurate tax reporting.
Original PR description
Problem --------- If the customer has not VAT set up on it record, we use the DEFAULT_VAT value. However, the scheme to be used is computed using the partner company_registry (which might be empty), which fails. Secondly, the piece of logic that compute the VAT/NON_EU_VAT for the Tax Scheme node was removed during the refactor. However, this is needed in Romania. Solution --------- Compute the scheme using the DEFAULT_VAT and add back the VAT/NON_EU_VAT logic for the Romanian CIUSRO only. no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251058 Forward-Port-Of: odoo/odoo#250110
This update fixes an issue where loyalty rewards disappeared from orders when loaded back through the TicketScreen. Previously, the system didn't properly refresh loyalty state after switching tables. Now, rewards are consistently applied when an order is loaded from the Orders tab, ensuring accurate reward tracking for customers.
Original PR description
Reward disappeared from an order when it was loaded from the Orders tab (TicketScreen) in restaurant mode after working on other tables. Steps to reproduce: ------------------- * Configure a Buy X Get Y (or similar) loyalty program and open a POS restaurant session. * On table A, create an order that triggers the program and confirm the reward line is applied. * Leave table A, create or edit another order on a different table (so another order becomes current). * Go to the Orders tab (TicketScreen), select the order from table A and click "Load Order". > Observation: The order from table A is loaded without its reward line, even though it was present when the order was first created. Why the fix: ------------ TicketScreen’s "Load Order" flow was only switching the current order without refreshing loyalty state, so after changing tables and coming back, later loyalty recomputations could drop the existing reward lines. opw-5909899 Forward-Port-Of: odoo/odoo#248000
This update resolves an issue where the system wasn't properly tracking its state during background processing for Nemhandel (the Danish payment system) within the l10n_dk module. This fix ensures accurate payment processing and reporting for Danish businesses using this integration. It's a critical update for compliance and reliable financial transactions.
Original PR description
State is not being correctly managed in case of background processing. task-5963885 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251219
This update fixes a visual issue where group names in grouped list views were being cropped due to incorrect column spanning. The change ensures group names have sufficient space, improving readability and the overall user experience. This resolves a minor aesthetic problem without impacting functionality.
Original PR description
Have a grouped list view with no aggregate fields. Before this commit, the colspan of the first `th` in group header rows wasn't optimally computed. These `th` can span to the very last cell…
Have a grouped list view with no aggregate fields. Before this commit, the colspan of the first `th` in group header rows wasn't optimally computed. These `th` can span to the very last cell (excluded), which may contain a cog menu. However, they only spanned to the second to last cell. As a consequence, in a list with only 2 columns, e.g. a handle and a name, the groups' name only got a few px available, and were hence cropped. The issue came from successive reworks of the group header row, leading to the pager being finally moved from its own column (after the last aggregate column), to the group name cell (with ms-auto). The logic is easier now, as a group header row looks like this: - a single `<th colspan="n">` (n >= 1) to display the group name: spans to the first aggregate column excluded or to the last cell excluded if no aggregate (colspan + 1 if rows have selectors) - one `<th colspan="1">` for each aggregate column - optionally one `<th colspan="m">` (m >= 1) for all columns after the last aggregate column - a single `<th colspan="1">` for the potential cog menu (optional dropdown column) opw~5730396 Before <img width="1918" height="471" alt="image" src="https://github.com/user-attachments/assets/8f55322b-1603-42cc-a48b-a2010ff12e25" /> After <img width="1909" height="423" alt="image" src="https://github.com/user-attachments/assets/0bca4865-88a1-424d-a1af-1523dbfa911c" /> Forward-Port-Of: odoo/odoo#251411
This update resolves an issue where the search bar on iOS devices with Korean keyboards would incorrectly clear the input while typing. The fix introduces a brief delay to account for iOS's IME behavior, ensuring the autocomplete remains open during Korean character composition. This improves the user experience for international customers.
Original PR description
Safari does not reliably set `KeyboardEvent.isComposing` during IME composition (e.g. Korean). As a result, the search value was processed too early and got cleared while composition was still in…
Safari does not reliably set `KeyboardEvent.isComposing` during IME composition (e.g. Korean). As a result, the search value was processed too early and got cleared while composition was still in progress. Interestingly, the issue could not be reproduced with the Japanese keyboard, which appeared to behave correctly. See [1]. This commit introduces a short delay before closing the autocomplete. On iOS, the IME temporarily triggers a Backspace event to remove the previously composed character before inserting the updated one. This Backspace incorrectly causes the autocomplete to close. With this change, we wait briefly (10ms) before closing it. If a new input event is received during that delay (corresponding to the newly composed character generated by the IME), the close action is cancelled. This ensures that the autocomplete remains open while the IME composition process completes. Steps to reproduce: - Configure a Korean keyboard on an iPhone - Open a Sale Order - Focus the search bar - Type a character, then type a second one to combine them - The search input value gets reset [1] #222151 opw-5448385 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#251141
This update fixes a problem where archived employee appraisal dates persisted, causing conflicts when managing appraisal plans. The change ensures that archived employees no longer appear in appraisal date calculations, preventing errors and ensuring accurate appraisal plan management within the system. This improves the stability and usability of the HR appraisal feature.
Original PR description
**Steps to reproduce:** Based on this feedback https://www.odoo.com/odoo/project.task/5270281 companies with archived employees face an issue when they try to toggle Appraisals Plans from Appraisls -> Configuration -> Settings -> Appraisals Plans **Issue:** The propblem is that when employees with next appraisal date are archived, their next appraisal date is not cleared which leads to past date conflicts upon trying to set the next appraisals dates for all the employees (which is done through toggling the Appraisals Plans checkbox) **Solution:** - Unset the next appraisal date upon archiving an employee - exclude archived employees from _compute_next_appraisal_date method Task: 5354002 Forward-Port-Of: odoo/enterprise#109115 Forward-Port-Of: odoo/enterprise#100437
This update corrects a bug where the removal date for products with expiration dates was incorrectly recalculated after modifications. The fix allows users to directly edit the removal date, ensuring accurate tracking of product expiration. This prevents data inconsistencies and improves the reliability of inventory management.
Original PR description
version : saas-18.4+e Steps to reproduce ------------------ Create a product tracked by lots and enable the expiration date use (use_expiration_date = True). Create a receipt with this product and mark it as to do. Open the stock.move.line list view using the "Details" button on the receipt form and try to modify expiration date, it should modify the removal date due to the compute method. Then, try to modify the removal date and save the modifications. If you reopen the list view, the removal date has been computed again and its value changed. The fix ------------------ We explicitly set the readonly field to False for the removal_date field from the stock.move.line model in product_expiry. opw-5368007 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251256 Forward-Port-Of: odoo/odoo#241659
This update corrects a display issue where vendor product names and codes were appearing twice in the delivery receipts for purchase orders. The problem stemmed from a system process adding vendor details to the description field, even when a product description was already defined. This change ensures accurate and consistent vendor information is shown in purchase receipts.
Original PR description
Version : saas-18.4+e Steps to reproduce ------------------ Create a product and add a line in the purchase tab with a “Vendor Product Name” and/or a “Vendor Product Code”. Create a purchase order…
Version : saas-18.4+e Steps to reproduce ------------------ Create a product and add a line in the purchase tab with a “Vendor Product Name” and/or a “Vendor Product Code”. Create a purchase order for this product with the right vendor and confirm it. Go to the delivery receipt, the vendor code and/or name are added twice in the description. Why is it happening ------------------ The _compute_description_picking method from stock.move, which is overridden in purchase_stock module, adds the vendor code and name to the description. However, if no description_picking has been set on the product, the description is already defined as the vendor code and name. Solution ------------------ I propose to remove the code and the name from the vendor_reference variable if the original description already contains them. opw-5392855 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251337 Forward-Port-Of: odoo/odoo#242075
This update resolves an issue preventing users from successfully submitting website forms with manually uploaded files. The fix adds a necessary attribute to the form processing logic, ensuring the file upload is properly recognized and submitted. This improves the functionality of contact forms that create opportunities.
Original PR description
Steps to reproduce: =================== 1. In CRM, use Studio to add a new File field to the lead form. 2. Go to website & Create a contact form that creates an opportunity 3. Add the studio field to the contact form created 4. Fill the form, upload the file and submit. -> An error has occured, the form has not been sent. Cause: ====== After this commit [1], `get_authorized_fields` calls `fields_get` with an explicit attributes list; 'manual' was not included in that list, so it was never returned, which causes the form submission to fail here: https://github.com/odoo/odoo/blob/242afb9ca3a76e3628260ac81a9f5ddcd5d445dd/addons/website/controllers/form.py#L194 Solution: ========= Add 'manual' to the attributes list in fields_get in website_form.py [1]: https://github.com/odoo/odoo/commit/bfae7140d3951bec93fb7f2e49018649045edd40 opw-5933992 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug in the stock barcode testing process. Previously, the tests didn't account for changes made through 'push rules' applied to move lines. Now, the tests accurately reflect how stock barcode functionality works when using move lines, ensuring proper tracking and reporting.
Original PR description
This commit is part of the community PR https://github.com/odoo/odoo/pull/239032. This commit fixes a test after making push rules work on move_lines instead of moves. Task-5212472
This update fixes a persistent warning appearing on payslips after deleting a related one. The fix involves canceling the payslip before deletion and then recomputing duplicate checks. This ensures accurate payroll processing and avoids unnecessary alerts for users.
Original PR description
### Steps to reproduce: - Create two payslips for the same employee for the same period. - Delete one of them; the duplicate warning still appears on the other payslip. ### Fix: - Before deleting a payslip, first cancel it so the current payslip can be skipped while checking for duplicate payslips. - Then trigger recompute _compute_issues for duplicates payslips task: 5427473
This update prevents a crash that occurred when users clicked images with the 'Pop-up on Click' feature in the website builder. The fix ensures that the image gallery functionality works reliably, regardless of whether the image is part of a carousel. Additionally, the popup setting has been restricted to product images.
Original PR description
Steps to produce: --- - Install `website_sale` module. - Go to website > open editor. - Add an image snippet to the homepage. - Click on the image and enable `Pop-up on Click`, then save. - Click on…
Steps to produce:
---
- Install `website_sale` module.
- Go to website > open editor.
- Add an image snippet to the homepage.
- Click on the image and enable `Pop-up on Click`, then save.
- Click on the image.
Traceback:
---
`TypeError: Cannot read properties of undefined (reading 'length')`
Root cause:
---
- In the `setup` method, when the image is not part of a carousel,
the element `.carousel-indicators` does not exist. As a result,
`indicatorEl` is null, and the guarded block(at [1]) is skipped.
Because of this, `this.liEls` is never initialized.
- Later, when the `onSlidCarousel` method is executed,
its internal condition evaluates and find `liEls` as null and
then `hide` method is called(see [2]).
- Inside the `hide` method, the code attempts to iterate
over `this.liEls`(see [3]).
Solution:
---
- Initialized `liEls` in `setup()` to ensure it is always defined.
- Added a length check in `onSlidCarousel()` to execute the logic
only when `liEls.length > 0`.
- This prevents this.page from being computed using invalid
values and avoids it being set to `NaN`.
- Additionally, as requested by the boje(po), hide the popup
on click setting on product images.
**Alternative approaches:**
1. We can also call the `onSlideCarousel` method from `setup`
when multiple images are present.
2. Also, we can add a simple check inside the `onSlideCarousel`
method to ensure that `liEls` is defined before proceeding.
[1]: https://github.com/odoo/odoo/blob/945f44e55f9a67b0744a183200de728b00202b1c/addons/website/static/src/snippets/s_image_gallery/gallery_slider.js#L31-L57
[2]: https://github.com/odoo/odoo/blob/945f44e55f9a67b0744a183200de728b00202b1c/addons/website/static/src/snippets/s_image_gallery/gallery_slider.js#L144-L152
[3]: https://github.com/odoo/odoo/blob/945f44e55f9a67b0744a183200de728b00202b1c/addons/website/static/src/snippets/s_image_gallery/gallery_slider.js#L119-L120
opw-5921123
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves an issue where rapidly clicking the 'Back' button during barcode internal transfer creation resulted in duplicated quantities being recorded. The fix prevents multiple 'save' calls, ensuring accurate inventory tracking. This improves the reliability of barcode-based stock transfers.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to the > Settings*, enable *Packages* and *Storage Locations*(warehouse). * Create a storable product and set *Tracking Inventory* to **By…
**Steps to reproduce:** * Install `stock` module. * Go to the > Settings*, enable *Packages* and *Storage Locations*(warehouse). * Create a storable product and set *Tracking Inventory* to **By Quantity** and set some *barcode* * Update the on-hand quantity for the product and assign it to one packages. * Open *Barcode > Operations > Internal Transfer* and create a new transfer. * Click the *gear icon* in the top-right corner to open the barcode scanning flow. * manually enter the created product barcode and apply it. * Click the **Back** button multiple times in quick succession. * Go to the backend and open the created internal transfer. **Observed behavior:** * The internal transfer is created with *double quantities* compared to what was added in the barcode interface. **Cause:** * When clicking the *Back* button, the following flow is triggered: `exit()` → `beforeQuit()` → `save()`. https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/components/main.js#L406-L414 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_model.js#L473-L475 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_picking_model.js#L828-L832 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_model.js#L477-L483 * If the button is clicked multiple times rapidly, `exit()` is called again before the previous `save()` RPC completes. * This results in multiple `save()` calls being executed, causing duplicated quantities on the picking. reference - https://github.com/odoo/enterprise/pull/103999/changes/b791239c154deb6a25f85d65ebc72e3ac53b6c74 **Fix:** * Prevent rapidly clicking the Back button multiple times does not multiply quantities. --- opw-5375899 Forward-Port-Of: odoo/enterprise#109013 Forward-Port-Of: odoo/enterprise#103130
This update ensures that B2C customers in Taiwan requesting a paper invoice during guest checkouts correctly skip the 'Invoicing Info' step. Previously, a technical issue caused problems with saving the paper invoice preference. This change improves the checkout experience for Taiwanese customers and ensures compliance with e-invoicing regulations.
Original PR description
In Taiwan e-invoicing, B2C customers can request a paper copy of their invoice. When selected, the "Invoicing Info" step—which collects data like donation codes or carriers—should be skipped as it is…
In Taiwan e-invoicing, B2C customers can request a paper copy of their invoice. When selected, the "Invoicing Info" step—which collects data like donation codes or carriers—should be skipped as it is not applicable to physical copies. Previously, this logic failed during guest checkouts because the partner initially associated with the order is an archived public user. The persistent partner is only created/assigned after the address form is submitted. This commit: - Overrides `_create_or_update_address` instead of `_handle_extra_form_data` to ensure the paper format preference is saved on the correct, newly generated partner. - Updates `_prepare_address_form_values` to correctly load existing preferences from the partner for registered users. - Ensures the `l10n_tw_edi_is_print` flag on the Sales Order stays in sync with the partner's preference. Task-5912985 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247961
This update resolves an issue where planners couldn't see unscheduled shifts for resources with no existing bookings. The fix removes a filtering restriction in the scheduling dialog, ensuring all available shifts are displayed, allowing for more efficient resource allocation. This improves usability for sales and operations teams.
Original PR description
Steps to Reproduce ------------------ 1. Open the Planning Gantt view. 2. Click a cell that belongs to a resource with **no** scheduled shifts. 3. The Plan dialog opens with an empty list. Issue…
Steps to Reproduce ------------------ 1. Open the Planning Gantt view. 2. Click a cell that belongs to a resource with **no** scheduled shifts. 3. The Plan dialog opens with an empty list. Issue ----- A previous change keeps the clicked resource in the dialog context; the Gantt model turns it into a default search filter, so only shifts already linked to that resource are shown. Unassigned shifts are therefore hidden, preventing planners from assigning them by role or availability. Current Behaviour ----------------- The Plan dialog is always filtered by `resource_id`, which returns no results for unscheduled resources, even when they have the right roles. Expected Behaviour ------------------ The dialog should list all unscheduled shifts that match the resource’s roles, or every unscheduled shift if the resource has no roles, while still preserving full context for scheduling once a shift is selected. Fix --- Remove the automatic resource filter from the dialog context in `getSelectCreateDialogProps()`. This prevents the unwanted search restriction; role defaults remain, so the dialog now displays the correct shifts. Task-4922525 Issue – https://github.com/odoo/enterprise/pull/87424/commits/a218a7cedce61f992fbe76284c273be8f937d28d Forward-Port-Of: odoo/enterprise#92100
This update fixes an issue where Point of Sale session messages were consistently displayed in English, regardless of the user's selected language. The fix ensures that all chat messages related to cash transactions are translated accurately based on the user's language preference, improving the user experience for international customers.
Original PR description
**Problem:** When opening or closing a POS session, chatter messages display untranslated English text regardless of the user's language setting. **Steps to reproduce:** 1. Set user language to any non-English language (e.g., Spanish) 2. Open a POS session and register cash in/out operations 3. Close the session 4. Check the chatter messages - labels appear in English **Current behavior:** Messages display in English: "Opening cash difference", "Opening cash expected", "Opening cash counted", "Closing difference", etc. **Expected behavior:** Messages should be translated according to the user's language setting. **Cause of the issue:** The hardcoded strings were not wrapped in the translation function `_()`, preventing them from being translated. **Fix:** Wrap the concatenated strings with `_()` to enable proper translation of all cash details messages. opw-5185310 Forward-Port-Of: odoo/odoo#248982 Forward-Port-Of: odoo/odoo#244501
This update resolves an issue where Avatax taxes weren't being correctly calculated during Stripe Express Checkout, particularly when using Google Pay. The fix ensures that all applicable taxes, including those from Avatax, are accurately reflected in the order total, improving payment accuracy and preventing discrepancies between the displayed price and the final payment amount.
Original PR description
## Versions 17.0+ ## Issue Avataxes are not computed during express checkout leading to discrepancies between customer payments and effective price including Avalara taxes. ## Steps to reproduce…
## Versions
17.0+
## Issue
Avataxes are not computed during express checkout leading to discrepancies between customer payments and effective price including Avalara taxes.
## Steps to reproduce
*Ensure the Stripe account has activated Google Pay* *This requires a complete Google profile on Google Chrome (with a valid payment method)*
- Setup Stripe payment method in test mode with Express Checkout;
- In the Settings, in the Accounting section:
- Setup Avatax;
- Set main Sales/Purchase taxes to 0.
- Create a new product with 0% selling taxes and any Avatax category;
- Activate fiscal position and enable automatic detection;
- Open a Chrome session with the Google profile:
- Go to the shop;
- Add the product you created to the cart;
- Enter the cart;
- Click the "Buy with GPay" button:
- The amount is equal to the sales price excluding taxes.
- Go to the Sales app and open the newly created order:
- The total amount differs from the amount paid (cf. transaction).
opw-5020793
Forward-Port-Of: odoo/enterprise#108957
Forward-Port-Of: odoo/enterprise#101579This update fixes an issue where landed costs weren't correctly applied to subcontracted products, leading to inaccurate product valuations and missing journal entries. The fix ensures that landed costs are properly linked to the subcontracted manufacturing order, resulting in accurate valuation updates and the creation of necessary account move lines.
Original PR description
…bcontracted **Problem:** Landed cost added on the receipt of a subcontracted product do not increase the valuation of the product and do not create account move lines. **Steps to reproduce:** -…
…bcontracted **Problem:** Landed cost added on the receipt of a subcontracted product do not increase the valuation of the product and do not create account move lines. **Steps to reproduce:** - create a tracked product with avco perpetual category - create a subcontracted bom for this product with no comp - create and confirm a PO for 10 unit of this product at a unit price of 1$ with the same partner as the subcontractor of the bom - validate the receipt - navigate to inventory/operations/adjustments/landed costs - create a new landed cost - select the receipt from the PO - add a landed cost of 10$ and validate - navigate to inventory/reporting/stock - search for your product and click on the unit cost **Current behavior:** 1) the valuation of the product was not increased by the value of the landed cost 2) open journal items : no account move lines were created for the landed cost **Expected behavior:** 1) the valuation of the product should have been increased: in the unit cost view, the SBC move should have gone from a value of 10 to 20 2) account move lines should have been created with a value of 10 **Cause of the issue:** both issues come from the fact that when creating the stock valuation adjustment line, the move linked is the receipt move when it should be the move of the subcontracted MO linked to the receipt. **fix:** if we create the adjustement line with move_id as the move of the MO (instead of the move of the receipt as it is the case currently) : when button_validate is called on the landed cost : - when using the remaining quantity, it will be the correct one (in our case 10, instead of 0 for the move of the receipt because it's actually an internal move) so the account move line are going to be created https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_landed_cost.py#L129-L130 https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_landed_cost.py#L372-L373 which solves problem 2) - when calling _set_value on the move (which will be the move of the MO thanks to this fix), https://github.com/odoo/odoo/blob/064407d32f998ceb08601f9e0a6356c94ad10347/addons/stock_landed_costs/models/stock_landed_cost.py#L152 get_value_data will call _get_value_from_extra, https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_account/models/stock_move.py#L392 which uses _get_landed_cost to fetch the landed cost https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_move.py#L18 before this fix the landed cost created from the receipt were linked to the receipt move so they were not fetched inside _get_landed_cost which caused problem 1) but now the move_id of the adjustment lines is the move of the MO so they are fetched inside _get_landed_cost https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_move.py#L7-L12 So now the adjustment lines do impact the valuation of the move of the MO which solves problem 1) opw-5723126 Forward-Port-Of: odoo/odoo#248469
This update fixes a bug where users could cancel subscriptions even if they didn't have access to the associated invoices. Now, a user must view the invoice before they can cancel the subscription, ensuring accurate subscription management and preventing accidental cancellations. This improves data integrity and reduces potential revenue loss.
Original PR description
Before this commit, when a user had access to an invoiced subscription but not to the invoiced, he could cancel the subscription. Step to reproduce: - create a subscription in company A, with a pricelist available in company B. Sales person A belong to company A. - invoice the subscription and confirm the invoice - update the company (company B) and sales person of the subscription (B). The new salesperon don't see the invoice in the stat button. After this commit salesperson B can't cancel the subscription. task-5907345 Forward-Port-Of: odoo/enterprise#108550 Forward-Port-Of: odoo/enterprise#106441
This update addresses a potential issue in the Swiss payroll reporting process. Specifically, it now displays a warning instead of an error when the 'AVS' (Authorized Vendor System) value is negative, providing clearer guidance to users. This ensures accurate reporting and avoids potential disruptions to payroll calculations.
Original PR description
Forward-Port-Of: odoo/enterprise#109046
This update resolves a test failure caused by demo data interfering with the lot search functionality. The fix creates new data and adds safeguards to prevent the test from failing due to existing demo lots. This ensures the test runs reliably and accurately.
Original PR description
The `test_lot_search_partner_ids` expects a specific number of lots/SNs to exist in the database in order to ensure its custom `partner_ids` search works correctly. Because of this, the test fails if any lot demo data is installed. Therefore we create all new locations, products, lots and add extra search domain fields to avoid loading any of these demo data. Also add in extra long partner name to avoid conflicts with overlapping demo/test partner names. runbot error: 162921 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250783 Forward-Port-Of: odoo/odoo#220777
This update resolves a bug that prevented stock quantities from being correctly deleted when their quantity was set to zero, particularly within inventory mode. The fix ensures that the current user isn't incorrectly associated with the quantity, allowing the system to properly remove the record and maintain accurate stock levels. This improves data integrity and prevents potential discrepancies.
Original PR description
Steps to reproduce: - Create a storable product "P1" - Click on Quantity On Hand - Set the quantity to 10 and save - Set the quantity to 0 - Go back to the quant list view by clicking on Quantity On Hand - The quant is deleted by: https://github.com/odoo/odoo/blob/08015c2a15704b30c7815b62612b71b8970e3ac2/addons/stock/models/stock_quant.py#L1076-L1079 - Set the quantity to 10 again and save - Select the quant - Action > Set to 0 Problem: The function `action_set_inventory_quantity_zero` sets the current user on the quant even on inventory mode. This prevents the quant from being deleted when `_unlink_zero_quants` is called. opw-5906681 Forward-Port-Of: odoo/odoo#248881
This update fixes an issue where fiscal positions were incorrectly applied to Brazilian customers, leading to errors when creating tasks. The change ensures that each customer's fiscal position is correctly associated with the company they belong to, resolving inconsistencies and preventing errors.
Original PR description
Issue ===== The fiscal position defined on a partner was not properly isolated per company, leading to cross-company inconsistencies and errors. Steps to Reproduce ================== 1. Install…
Issue ===== The fiscal position defined on a partner was not properly isolated per company, leading to cross-company inconsistencies and errors. Steps to Reproduce ================== 1. Install `industry_fsm_sale` and `l10n_br`. 2. In the US company: - Create a Brazilian customer. - Set a fiscal position on the customer. 3. Switch to the Brazilian company: - Open the same customer. - Set a fiscal position on the customer. 4. Still in the Brazilian company: - Create a task for that customer in the Field Service app. - Add a product to the task. Result ====== An error is raised because the fiscal position from the US company is used, which is not valid for the Brazilian company. Root Cause ========== When reading the fiscal position from the partner, the value is fetched in the environment of the company in which the partner record was originally created (US company). If no company is explicitly specified, the fiscal position is read in that original environment, even when the user is operating under the Brazilian company. Solution ======== Explicitly enforce the current company context when reading the fiscal position from the partner to ensure the correct company-specific value is used. opw-5270522 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250115 Forward-Port-Of: odoo/odoo#249482
This update corrects an error that occurred when generating payslips for employees who had changed contracts within a pay period. The fix ensures accurate calculation of work years by using the employee's initial contract start date, preventing errors related to holiday table lookups. This improves the reliability of payroll processing.
Original PR description
An error is thrown when we try to generate a payslip for an employee that changed contract on a period before the contract change Steps to reproduce: 1. Install l10n_mx and l10n_mx_hr_payroll modules…
An error is thrown when we try to generate a payslip for an employee that changed contract on a period before the contract change
Steps to reproduce:
1. Install l10n_mx and l10n_mx_hr_payroll modules
2. Switch to INNOVACION VALOR... company
3. Go to Employees and open Cecilia Miranda Sanchez
4. Go to Payroll tab, set the end of the contract to Jan 31 and save
5. Create a new contract from Feb 1
6. Go to Payroll > Payslips > Payslips and create a new pay run
7. Select Salary Structure 'Mexico: Regular Pay', Pay Schedule 'Bi-weekly' and Period 'Jan 1 -> Jan 15'
8. Click on Continue, select Cecilia and click on Select
9. An error is thrown
Problem:
In `_compute_integration_factor` we try to compute the number of years the employee has worked by accessing the start date on the employee but this date might be earlier than the start date of the employee's current contract if the employee has changed contract. This will throw an error when we try to access the holidays count for 0 year because `payslip._rule_parameter('l10n_mx_holiday_tables')` doesn't have an entry for 0
Solution:
Use the start date of the first contract of the employee, take gaps in between the employee's contracts into consideration to correctly compute the number of years worked
opw-5931355
Forward-Port-Of: odoo/enterprise#1084953 changes
Resolved issues and error corrections
This update ensures the IEPS (tax) breakdown on Mexican invoices (CFDI) accurately reflects requirements from the SAT tax catalog. Specifically, the system now correctly displays IEPS only for global invoices or when a specific tax object (07) is used, aligning with current regulations.
Original PR description
This commit targets to modify the behaviour of IEPS breakdown on CFDI to follow on what is specified on SAT cfdi Tax Object Catalog. Now the IEPS will be displayed only considering if the CFDI is a global invoice, the value of the tax object and whether the check is set. The general idea is: - Is a global invoice? -> show IEPS - Is tax object 07? -> show IEPS - Has ieps breakdown but is not tax object 08? -> show IEPS - Anything else, don't. task-5953499 target: saas-18.4 -> master
This update resolves a problem where the automated processing of Brazilian e-invoices (BR-EDI) was failing due to a flawed cron job setup. The fix ensures invoices are processed in smaller batches, with individual commits to prevent data loss and wasted credits. This improves the reliability of the BR-EDI service.
Original PR description
The cron searched with limit=batch_size and only retriggered when >batch_size records were found which never happens. It also ran all invoices in a single transaction so one failure rolled back all progress while IAP credits were already consumed. Search batch_size + 1 so remaining invoices are detected, and commit after each invoice to preserve progress. opw-5954211 Forward-Port-Of: odoo/enterprise#108468 Forward-Port-Of: odoo/enterprise#108191
This update fixes a minor issue in the Documents app where the action name displayed when creating account moves was inconsistent. Now, the action name accurately reflects the type of document being processed (e.g., 'Vendor Bills' for vendor bills), providing a clearer and more intuitive user experience. This ensures users are always directed to the correct functionality.
Original PR description
Previously, creating account moves from the Documents app opened the account.move list view with a static `Invoices` title, which was not explicit for all move types. Steps to reproduce: 1. Select suitable PDFs in Document App. 2. Click on `Vendor Bill`. 3. See the name of action (below Breadcrumbs) should be `Vendor Bills` instead of `Invoices` This fix adds and uses a mapping based on move_type to set the correct action name (e.g., Vendor Bills) after record creation. task-5983372 Forward-Port-Of: odoo/enterprise#109180
9 changes
Resolved issues and error corrections
This update fixes a hidden error in the Point of Sale system that prevented invoice generation when an untrusted bank account was used. Previously, users wouldn't receive any explanation of the problem. Now, a popup will clearly identify the issue, such as an untrusted bank account, guiding the user to correct the setup.
Original PR description
Steps to reproduce: - Add untrusted bank account to the database's selected company's contact - Finalize an order in point of sale through register - While in register, go to orders and click on the invoice button for the finalized order Current behavior: - There is no indication of why you can't generate an invoice Expected behavior: - There should be a popup to the user identifying the error (e.g. untrusted bank account) This addresses a side effect of: https://github.com/odoo/odoo/pull/248108 opw-5946239 Forward-Port-Of: odoo/odoo#249558
This update fixes a critical issue in the invoice processing cron job for Brazil's electronic invoicing system. Previously, a single failure could halt the entire process and consume valuable IAP credits. The fix now processes invoices in smaller batches, committing changes after each, ensuring progress is preserved and preventing disruptions.
Original PR description
The cron searched with limit=batch_size and only retriggered when >batch_size records were found which never happens. It also ran all invoices in a single transaction so one failure rolled back all progress while IAP credits were already consumed. Search batch_size + 1 so remaining invoices are detected, and commit after each invoice to preserve progress. opw-5954211 Forward-Port-Of: odoo/enterprise#108468 Forward-Port-Of: odoo/enterprise#108191
This update corrects a minor issue in the Documents app where the action name displayed when creating account moves wasn't specific to the document type. Now, when creating a Vendor Bill from a document, the action name will correctly show as 'Vendor Bills', ensuring clarity and ease of use for users. This improves the overall user experience within the Documents app.
Original PR description
Previously, creating account moves from the Documents app opened the account.move list view with a static `Invoices` title, which was not explicit for all move types. Steps to reproduce: 1. Select suitable PDFs in Document App. 2. Click on `Vendor Bill`. 3. See the name of action (below Breadcrumbs) should be `Vendor Bills` instead of `Invoices` This fix adds and uses a mapping based on move_type to set the correct action name (e.g., Vendor Bills) after record creation. task-5983372 Forward-Port-Of: odoo/enterprise#109180
This update resolves an issue where posted 'Miscellaneous' journal entries in the Chilean localization were incorrectly flagged with a validation error regarding document numbers. The fix exempts these journal entries from the numeric folio validation rule, allowing users to modify and save them without interruption. This ensures proper functionality for Chilean accounting operations.
Original PR description
Currently, editing a posted `miscellaneous` journal entry in Chile localization incorrectly raises a validation error. **Steps to reproduce:** - Install the `l10n_cl` module and switch to the `CL…
Currently, editing a posted `miscellaneous` journal entry in Chile localization incorrectly raises a validation error. **Steps to reproduce:** - Install the `l10n_cl` module and switch to the `CL company`. - Go to Accounting > Accounting > Journal Entries. - Create a balanced entry using the `Miscellaneous journal `and `post` it. - Reset it to draft, modify the `name`, and try to `save` it. **Observation:** `Validation error`: `The DTE document number (folio) must contain only digits.` **Root cause:** At [1], the constraint validation is applied to all journal entries in Chilean companies, including `miscellaneous` journals. However, `miscellaneous journals (move_type = 'entry')` are not linked to Chilean electronic documents, so the numeric folio validation should not apply to them. **Fix:** This commit ensures that the validation is not raised for `miscellaneous` journal types by excluding miscellaneous journals from the numeric folio validation constraint. [1]: https://github.com/odoo/odoo/blob/f39785bcddd1eb5b7fb503d053c9bb66e2a0f15c/addons/l10n_cl/models/account_move.py#L20-L30 opw-5926773 Forward-Port-Of: odoo/odoo#248965
This update corrects a technical issue in the Hungarian tax audit export process. Previously, changes to invoice data were unintentionally saved to the database, despite attempts to roll them back. By ensuring data is flushed to the database before and after savepoints, this fix prevents incorrect data updates and maintains data integrity.
Original PR description
At the moment, the Hungarian tax audit export wizard's `action_export` creates a savepoint with `flush=False`. The intention of this savepoint is to roll back the changes to `l10n_hu_edi_invoice_chain` once the savepoint exits. But because the changes to `l10n_hu_edi_invoice_chain` stay in cache, and the cache is not flushed before the savepoint is created nor cleared afterwards, those changes end up being committed to DB. Which is precisely what the savepoint was there to prevent. Solution: we use `flush=True` to make sure the cache is flushed before and cleared after the savepoint. task-none Forward-Port-Of: odoo/odoo#251322 Forward-Port-Of: odoo/odoo#250971
This update fixes an issue where the lot number wasn't consistently displayed for products tracked by lot when opening sales orders within the Point of Sale (POS) system. The fix ensures that the correct lot number is accurately reflected for all product lines within the POS interface, improving inventory accuracy and order fulfillment. It also addresses a related issue with quantity processing during POS closing.
Original PR description
When opening an SO in POS that has a product tracked by lot that is split into several location, the lot number will only appear in one of the line and not the others Steps to reproduce:…
When opening an SO in POS that has a product tracked by lot that is split into several location, the lot number will only appear in one of the line and not the others Steps to reproduce: ------------------- 1. Create a Product A tracked by lot, create lot 111 and add 1 unit to location A and another one to location B 1. Create a sales order 2. Add two units of the product to the sale order 3. Confirm the sales order 4. Open the transfer, make the transfer retrieve the product from several location with the same lot. 5. Save the transfer 6. Open the sales order in POS 7. Load the SN/lots -> Two line of qty 1 appear for the product A but only the first one has the lot number Additional Issue: 8. Change the number of the product for the first line to 2 and erase the second line 9. Confirm and Pay 10. Close POS 11. Open move lines for this product (Inventory>product>In/out) -> It moves 2 product from one location (when there is only product) Observation: ------------- When loading the SO in POS, we will retrieve the SO: https://github.com/odoo/odoo/blob/cb1f5d9c6db64b9ace9b7aa46bd6f94e4462176b/addons/pos_sale/static/src/app/order_management_screen/sale_order_management_screen/sale_order_management_screen.js#L104 While retrieving the SO, we will also retrieve the SOL, with additional information: https://github.com/odoo/odoo/blob/d9b2e5ee730a4e79586bfd3f09adfb794d2dc1f3/addons/pos_sale/models/sale_order.py#L79 -> Issue is that when several moves_line have the sale lot_id.name, their quantity will be overwritten. Addition Issue : When closing pos, all the move will be processed, when processing those moves, the origin only check if the quantity is more than 0 and not if there is enought units. https://github.com/odoo/odoo/blob/cb1f5d9c6db64b9ace9b7aa46bd6f94e4462176b/addons/point_of_sale/models/stock_picking.py#L293-L297 opw-5347992 Forward-Port-Of: odoo/odoo#251270 Forward-Port-Of: odoo/odoo#243347
This update fixes an issue where the display of shift durations in the Planning app was incorrect when shifts spanned over multiple days. Specifically, the hours weren't shown when the shift ended within 3 hours of the previous day. The change removes outdated logic related to snapping to the grid, ensuring accurate duration display across shifts.
Original PR description
### Issue: The pill name contains the hours when it spans over the next day for less than 3 hours but not if more than 3 hours. ### Steps to reproduce: - Go to Planning app - Create a shift for an…
### Issue: The pill name contains the hours when it spans over the next day for less than 3 hours but not if more than 3 hours. ### Steps to reproduce: - Go to Planning app - Create a shift for an employee from 3pm to 2am (over two days) - The hours of the shift are displayed - Modify the shift end to 3am - The hours of the shift aren't displayed ### Cause: Before the refactor adapting the gantt view to OWL, when a shift spanned over two days less than three hours, then the gantt view truncated the pill to display it in only one day. (see [`_snapToGrid()`](https://github.com/odoo/enterprise/blame/a16b2ef569903c0ae5803c169dbd68acd0141fe1/web_gantt/static/src/js/gantt_row.js#L1044-L1072)) The same logic was done for the computation of the pill's name in [this commit](https://github.com/odoo/enterprise/commit/98a86cbacf484646f486e4648788cfa53cc9648c). But as the pills are no longer truncated since 17.0, the computation of pill names is faulty. ### Solution: We remove the checks of the 3-hour margin. This also makes the variable `spanMoreThanOneDay` useless, so we delete it. opw-5881532 Forward-Port-Of: odoo/enterprise#109217 Forward-Port-Of: odoo/enterprise#107233
This update corrects a technical issue preventing proper state management during background processing for Nemhandel invoices. Previously, sending invoices via Nemhandel was unreliable. This fix ensures invoices are processed correctly in the background, improving the overall reliability of the DK accounting integration.
Original PR description
State is not being correctly managed in case of background processing. task-5963885 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251219
This update corrects inaccuracies in the Romanian tax reports to align with the latest VAT rate changes (19% to 21% and 5%/9% to 11%). The changes ensure the reports accurately reflect current Romanian tax regulations, improving financial reporting reliability. Inactive taxes were adjusted to maintain report functionality.
Original PR description
Romanian VAT has increased from 19% to 21% and from 5%/9% to 11%, some taxes were added previously to the module but they were not reflected in the tax report, also other taxes were missing in order for the report to replicate the current up to date version issued by the romanian government. Forward-Port-Of: odoo/odoo#250468 Forward-Port-Of: odoo/odoo#241529
4 changes
Resolved issues and error corrections
This update fixes a critical issue in the invoice processing cron job for Brazil (l10n_br_edi_services). Previously, a single error would halt the entire process, wasting IAP credits. The fix now processes invoices in smaller batches, committing changes after each, ensuring progress is preserved and preventing disruptions.
Original PR description
The cron searched with limit=batch_size and only retriggered when >batch_size records were found which never happens. It also ran all invoices in a single transaction so one failure rolled back all progress while IAP credits were already consumed. Search batch_size + 1 so remaining invoices are detected, and commit after each invoice to preserve progress. opw-5954211 Forward-Port-Of: odoo/enterprise#108468 Forward-Port-Of: odoo/enterprise#108191
This update fixes a minor inconsistency in the Documents app by ensuring action names (like 'Vendor Bills') accurately reflect the type of account move being created, regardless of the document selected. This improves clarity and usability for users creating account moves from the Documents app.
Original PR description
Previously, creating account moves from the Documents app opened the account.move list view with a static `Invoices` title, which was not explicit for all move types. Steps to reproduce: 1. Select suitable PDFs in Document App. 2. Click on `Vendor Bill`. 3. See the name of action (below Breadcrumbs) should be `Vendor Bills` instead of `Invoices` This fix adds and uses a mapping based on move_type to set the correct action name (e.g., Vendor Bills) after record creation. task-5983372 Forward-Port-Of: odoo/enterprise#109180
This update resolves an issue where payslip line creation was failing in the stable version of Odoo Enterprise. The team re-introduced a previous fix to ensure stable operation and prevent errors related to missing data fields. This improves the reliability of payroll processing.
Original PR description
Related is not applied correctly in stable after https://github.com/odoo/enterprise/pull/108729, leading to a missing field error, we reintroduce it for stability reasons Forward-Port-Of: odoo/enterprise#109198
This update corrects a display issue where upsell sales orders created from subscriptions incorrectly showed as "Quotation" instead of a standard sales order. The fix ensures that upsell orders now match the naming convention of other sales orders, providing a more consistent and accurate view for users. This improves clarity and simplifies reporting.
Original PR description
## Issue When creating and confirming an Upsell SO from a Subscription, the preview still shows the Sale Order as a "Quotation", which is inaccurate. <img width="1330" height="296" alt="5489970"…
## Issue
When creating and confirming an Upsell SO from a Subscription, the preview still shows the Sale Order as a "Quotation", which is inaccurate.
<img width="1330" height="296" alt="5489970" src="https://github.com/user-attachments/assets/cfff4c7a-fff7-4859-861b-c190dab9097d" />
## Steps to reproduce
1. Install *Subscription* (`sale_subscription`)
2. Create a Subscription S00001
- Any Customer
- Any Recurring Plan
- Any Product
3. Create and confirm the invoice for the subscription S00001
4. On the subscription S, click Upsell and confirm the resulting Sale Order S00002
5. On the Sale Order S00002, click Preview
6. **The title of the Sale Order is "Quotation - S000002". In the sale.order list view, the Sale Order is shown as a Sales order, just like the initial Subscription.**
## Cause
The title shown in the preview is defined here:
https://github.com/odoo/enterprise/blob/a4e2c7c7d3aa50c8b57668c9ca73f523a31a5c41/sale_subscription/views/sale_subscription_portal_templates.xml#L187-L195
The initial subscription falls into the `if` condition, which only shows the name of the SO. The upsell sale order is not considered as a subscription, as explained and showed here:
https://github.com/odoo/enterprise/blob/6bfd057b3d17ce8b266aa6dbd88ffef70ca634aa/sale_subscription/models/sale_order.py#L193-L201
The word *"Quotation"* shown in the preview is the `sale_order.type_name`", computed here:
https://github.com/odoo/enterprise/blob/6bfd057b3d17ce8b266aa6dbd88ffef70ca634aa/sale_subscription/models/sale_order.py#L227-L237
The term "Quotation" was chosen in https://github.com/odoo/enterprise/commit/14e5cff65affa888f33d4008d10a32e6992d3a39.
## Fix
Before this commit, an upsell would always be named *"Quotation"*. With this commit, upsells are now added to the `other_orders` variable in `_compute_type_name` and follow the same logic as other SO:
https://github.com/odoo/odoo/blob/a3bf9264ca25ec11b0c9742e142d2404cac6d261/addons/sale/models/sale_order.py#L797-L803
<img width="1316" height="308" alt="5479900_2" src="https://github.com/user-attachments/assets/7cfeb578-2870-43a6-a48b-ba0898718641" />
## Alternative
An alternative to this fix would be to update the condition used to display the name of the subscription in the preview (cf. first code snippet). This would probably result in removing the `sale_order.is_subscription` from the condition, as it is the part of the condition that upsell SOs do not meet.
opw-5489970
Forward-Port-Of: odoo/enterprise#1067679 changes
Resolved issues and error corrections
This update corrects a misleading warning displayed in the payroll system when a payslip had a zero or negative net wage. The fix ensures the warning only appears for individual payslips with negative wages, preventing confusion for users. A new test has been added to verify this behavior.
Original PR description
Steps to Reproduce: 1. Generate payslips for a batch of employees (e.g., Employee A and Employee B). 2. Ensure the last processed payslip (Employee B) has a negative net wage or is uncomputed (net…
Steps to Reproduce: 1. Generate payslips for a batch of employees (e.g., Employee A and Employee B). 2. Ensure the last processed payslip (Employee B) has a negative net wage or is uncomputed (net wage 0.0). 3. Ensure Employee A has a valid, positive net wage. 4. Open the payslip for Employee A. Issue: Employee A displays the warning "The net pay for this payslip is zero or negative," even though their net wage is positive. This occurred because the lambda filter used the `slip` variable from the outer loop scope instead of the iterator, causing the last record's net wage to determine the warning for the entire batch. Additionally, uncomputed payslips (which have no lines) default to a net wage of 0.0, which triggered the warning condition prematurely. Expected Behavior: The warning should only appear if the specific payslip being checked has a negative or zero net wage. Furthermore, the warning should be suppressed if the payslip lines have not yet been computed. Additionally, added a test to check the message is not displayed if we don't have net salary, and appears if the net is indeed negative. task-5484107 Forward-Port-Of: odoo/enterprise#108601 Forward-Port-Of: odoo/enterprise#103918
This update resolves an issue where the Colombian electronic invoicing system (l10n_co_dian) didn't properly handle mismatched DIAN operation modes. When the selected mode doesn't align with the system's expectations, a warning is now triggered to prevent incorrect invoice generation. This ensures compliance and accurate electronic invoicing.
Original PR description
Steps to reproduce: - Install `l10n_co_dian` module(demo data) > Switch to `CO Company` - Settings > Colombian Electronic Invoicing > Change the Operation Mode: `DIAN 2.1: Support Documents`(eg:…
Steps to reproduce:
- Install `l10n_co_dian` module(demo data) > Switch to `CO Company`
- Settings > Colombian Electronic Invoicing > Change the Operation Mode: `DIAN 2.1: Support Documents`(eg: [Image](https://www.awesomescreenshot.com/image/58874464?key=0cb74e446dcdb0f087df6ed619f785c2))
- Vendors > Create a Bill > Confirm > `Acknowledge Reception`
Traceback:
```py
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_move.py", line 293, in l10n_co_dian_send_event_update_status_received
self._l10n_co_dian_send_event_update_status('received')
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_move.py", line 313, in _l10n_co_dian_send_event_update_status
document = self.env['l10n_co_dian.document']._send_commercial_event(self, commercial_state_next)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/l10n_co_dian_document.py", line 593, in _send_commercial_event
xml, errors = self.env['account.edi.xml.ubl_dian']._export_co_send_event_update_status_invoice(locked_move, commercial_state_next)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1208, in _export_co_send_event_update_status_invoice
return self.with_context(l10n_co_next_commercial_state=next_commercial_state)._dian_sign_xml(xml, invoice)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1524, in _dian_sign_xml
'software_security_code': self._dian_get_security_code(operation_mode, document_number),
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1443, in _dian_get_security_code
operation_mode.dian_software_id
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```
We are getting this error because `_dian_get_operation_mode` [returns] an empty `l10n_co_dian.operation_mode()` record. This happens when the `Operation modes` do not match. As a result, [operation_mode] also contains an empty record.
[operation_mode]: https://github.com/odoo/enterprise/blob/84022deef3414096fcaf61f8d45c08393431e0ab/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L1432
[returns]: https://github.com/odoo/enterprise/blob/84022deef3414096fcaf61f8d45c08393431e0ab/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L1394-L1400
sentry-7273771732
Forward-Port-Of: odoo/enterprise#107885A technical issue preventing payrun creation for Hong Kong employees has been fixed. The problem stemmed from a missing function name during the implementation of eMPF support. This update ensures payruns can be successfully generated for Hong Kong employees, resolving a previous error.
Original PR description
In the big commit adding eMPF to the hk localization, a function was miss named and was causing an error when trying to create a payrun. Steps to reproduce: - Install belgian localization - Install HK localization - Select the belgian company - Create a payslip for a belgian employee (works fine) - Create a payrun and select the same employee from the list - Get an error In this commit we fix the naming of the function and everything goes back to working. Task: 5960503 Forward-Port-Of: odoo/enterprise#109196
This update resolves an issue where the date input field in the HR payroll form would become uneditable after editing. The change ensures the popover is opened first, guaranteeing the input remains editable. This improves the user experience for HR staff.
Original PR description
With this additionnal step in tour, we ensure the popover is opened before clear the input. If we not wait for this, the input can be no longer editable.
This update makes two key payroll fields accessible across all Odoo companies, regardless of their location. Previously, these fields were tied to the Belgian localization, limiting functionality for non-BE users. This change simplifies deployment and ensures consistent access to essential payroll data.
Original PR description
This change relocates two generic payroll fields (can_be_requested and default_car_value) into the base hr_payroll_fleet module so any deployment using payroll+fleet (including non‑BE companies) can access them without requiring the Belgian localization. The Belgian module keeps all its fiscal computations and (previously absent) visibility checks task-5906656
This update fixes a JavaScript error that occurred when users closed the certificate signing wizard without saving. The fix ensures the system correctly handles wizard dismissals, preventing a crash caused by incorrect data type validation. This improves stability and user experience.
Original PR description
**Issue:**
Closing the signing certificate wizard without saving triggers a client-side traceback (`UncaughtPromiseError: Invalid ids list: [object Object]`).
**Cause:**
When the wizard dialog is discarded, Odoo's dialog manager passes a dismissal object (`{dismiss: true}`) to the `onClose` callback. The existing code only checked if the payload was truthy (`if (cert_id)`), causing it to attempt to update the `signing_certificate_id` Many2one field with the event object. The framework's validation (`validatePrimitiveList`) expects an integer or array of integers, resulting in a crash when it tries to parse the object.
**Fix:**
Updated the `onClose` callback to strictly verify the type of the payload (`typeof cert_id === 'number'`). The record is now only updated when the wizard successfully returns a valid primitive integer ID.
task: 5975643
Forward-Port-Of: odoo/enterprise#108864This update fixes a mobile map issue where the pin list was too small, making it unusable. The team replaced the permanent list with a toggle button for on-demand access, and added styling improvements for a better mobile experience. This ensures maps are easily viewable and functional on mobile devices.
Original PR description
**Problem:** Recent changes (https://github.com/odoo/enterprise/pull/104618) broke the mobile map layout, causing the pin list to shrink to an unusable 46px height on top of the map. **Solution:** Replaced the permanent list section with a toggle button to access the pin list on demand. Added polishing CSS to improve the general mobile aesthetic and usability of the map view. task-5126312 Forward-Port-Of: odoo/enterprise#108345
This update corrects a display issue where EG-specific payroll fields were incorrectly shown in employee forms for companies outside of the EG locale. The fix ensures these fields are hidden when a different country is selected, maintaining data accuracy and preventing confusion. This improves the user experience for international users.
Original PR description
[FIX] some EG l18n fields are visible in other country's employee forms Bug reproduction: Go to >= saas~19.2 version, install EG and select company other than EG -> payroll -> personal -> there are EG: Social Sec. Number and NOSI Registration strings that belongs to EG. Bug cause: In EG view, they did not make the additional fields invisible if they belong to other company. Bug solution: Make the appended fields invisible when company country code is not EG. task - 5975886 Forward-Port-Of: odoo/enterprise#108896
This update resolves an issue where the arrow button within the Urban Piper settings was not functioning correctly. The fix involved ensuring the arrow was properly enclosed within a button tag, allowing users to navigate to the correct settings. This ensures a smooth and functional experience for users managing Urban Piper configurations.
Original PR description
In the settings, under the Urban Piper section, the arrow was not clickable. This is because the arrow was not inside a button tag. task: 5972833
10 changes
Resolved issues and error corrections
This update resolves a technical problem where tests were failing due to how keyboard events were being handled within the Odoo system. Specifically, the 'hoot' feature was affected, ensuring that key presses were correctly processed and that the system functioned as intended. This improves the stability and reliability of the Odoo Enterprise platform.
Original PR description
Adapt tests failing due to keydown events being applied to the current active element. Community: https://github.com/odoo/odoo/pull/247137 Forward-Port-Of: odoo/enterprise#109094 Forward-Port-Of: odoo/enterprise#107286
This update fixes a critical issue in the invoice processing cron job for Brazil (l10n_br_edi_services) that caused failures and wasted credits. The previous system processed invoices in large batches, leading to rollback issues if one invoice failed. Now, the cron job processes invoices in smaller batches, committing changes after each, ensuring progress is preserved and preventing credit loss.
Original PR description
The cron searched with limit=batch_size and only retriggered when >batch_size records were found which never happens. It also ran all invoices in a single transaction so one failure rolled back all progress while IAP credits were already consumed. Search batch_size + 1 so remaining invoices are detected, and commit after each invoice to preserve progress. opw-5954211 Forward-Port-Of: odoo/enterprise#108468 Forward-Port-Of: odoo/enterprise#108191
This update corrects a minor issue in the Documents app where action names were not consistently reflecting the type of account move being created (e.g., 'Vendor Bills' instead of 'Invoices'). This change ensures a clearer and more accurate user experience when working with account moves generated from documents.
Original PR description
Previously, creating account moves from the Documents app opened the account.move list view with a static `Invoices` title, which was not explicit for all move types. Steps to reproduce: 1. Select suitable PDFs in Document App. 2. Click on `Vendor Bill`. 3. See the name of action (below Breadcrumbs) should be `Vendor Bills` instead of `Invoices` This fix adds and uses a mapping based on move_type to set the correct action name (e.g., Vendor Bills) after record creation. task-5983372 Forward-Port-Of: odoo/enterprise#109180
This update removes an unnecessary size check during AI image processing, streamlining the workflow. Previously, large images triggered errors despite being automatically resized. This change aligns the system with existing image processing logic, avoids user intervention, and maintains consistent resource usage without impacting stability.
Original PR description
Prevent unnecessary ["Too large image (above 50.0Mbpx)" error](https://github.com/odoo/odoo/blob/fee6b32a8a57577bd8229c80dff6f93964f9f556/odoo/tools/image.py#L99) when the image is resized…
Prevent unnecessary ["Too large image (above 50.0Mbpx)" error](https://github.com/odoo/odoo/blob/fee6b32a8a57577bd8229c80dff6f93964f9f556/odoo/tools/image.py#L99) when the image is resized immediately afterward. Currently, an image larger than 50Mpx triggers an error when inserted into a prompt, even though the image processing pipeline resizes it right after. This makes the size check inconsistent with the actual behavior of the system. Current behavior: - 51Mpx image → prompt → error - 49Mpx image → prompt → resized → OK Proposed behavior: - 51Mpx image → prompt → resized → OK - 49Mpx image → prompt → resized → OK In practice, the 50Mpx limit does not protect against memory issues in this flow, since the image is systematically resized (max 1024px width/height) before being stored or used by the AI module. The original full-resolution image is never processed beyond the resizing step. Moreover, similar image processing logic in base/models/ir_attachment.py already allows larger images, meaning we support them elsewhere in the codebase. This makes the current restriction here inconsistent and redundant. By removing this premature size validation, we: - Avoid forcing users to manually resize images that would be resized anyway - Align the behavior with other ImageProcess() usages - Keep the same effective resource usage, since resizing still happens immediately The safeguard against excessive memory usage remains in place through the resizing logic itself, so this change does not introduce additional risk.
This update resolves a printing problem that was occurring with Odoo's Knowledge articles. The team reverted a previous change that was causing issues with the ‘wkhtmltopdf’ printing tool. This ensures that users can reliably print Knowledge articles.
Original PR description
### Purpose of this PR: - Restore the static file box implementation and drop the embedded component, as it breaks printing with wkhtmltopdf. - The original issue with the static file box was fixed in [#241591](https://github.com/odoo/odoo/pull/241591) Reverts: https://github.com/odoo/enterprise/pull/88929 community: https://github.com/odoo/odoo/pull/251098
This update corrects a redirection issue where internal users receiving ‘Signed Document’ emails were incorrectly directed to the public portal. Now, internal users automatically receive a preview of the signed document, while the existing portal redirection for public users remains unchanged. This ensures a consistent and accurate experience for all users.
Original PR description
Internal users opening the “Signed Document” email link were redirected to the portal instead of the document preview. Now they are redirected to the internal preview, while public users remain unchanged. task-5486043
This update resolves an issue where rapidly clicking the 'Back' button during barcode internal transfer creation resulted in duplicated quantities being added to the transfer. The fix ensures that multiple 'Back' clicks don't trigger redundant saving operations, preventing incorrect quantity calculations.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to the > Settings*, enable *Packages* and *Storage Locations*(warehouse). * Create a storable product and set *Tracking Inventory* to **By…
**Steps to reproduce:** * Install `stock` module. * Go to the > Settings*, enable *Packages* and *Storage Locations*(warehouse). * Create a storable product and set *Tracking Inventory* to **By Quantity** and set some *barcode* * Update the on-hand quantity for the product and assign it to one packages. * Open *Barcode > Operations > Internal Transfer* and create a new transfer. * Click the *gear icon* in the top-right corner to open the barcode scanning flow. * manually enter the created product barcode and apply it. * Click the **Back** button multiple times in quick succession. * Go to the backend and open the created internal transfer. **Observed behavior:** * The internal transfer is created with *double quantities* compared to what was added in the barcode interface. **Cause:** * When clicking the *Back* button, the following flow is triggered: `exit()` → `beforeQuit()` → `save()`. https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/components/main.js#L406-L414 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_model.js#L473-L475 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_picking_model.js#L828-L832 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_model.js#L477-L483 * If the button is clicked multiple times rapidly, `exit()` is called again before the previous `save()` RPC completes. * This results in multiple `save()` calls being executed, causing duplicated quantities on the picking. reference - https://github.com/odoo/enterprise/pull/103999/changes/b791239c154deb6a25f85d65ebc72e3ac53b6c74 **Fix:** * Prevent rapidly clicking the Back button multiple times does not multiply quantities. --- opw-5375899 Forward-Port-Of: odoo/enterprise#109013 Forward-Port-Of: odoo/enterprise#103130
This update resolves an error that occurred when generating payslips for employees who had changed contracts within a pay period. The fix ensures that the system now uses the employee's initial contract start date for accurate calculations, preventing errors related to holiday entitlements. This improves the reliability of payroll processing.
Original PR description
An error is thrown when we try to generate a payslip for an employee that changed contract on a period before the contract change Steps to reproduce: 1. Install l10n_mx and l10n_mx_hr_payroll modules…
An error is thrown when we try to generate a payslip for an employee that changed contract on a period before the contract change
Steps to reproduce:
1. Install l10n_mx and l10n_mx_hr_payroll modules
2. Switch to INNOVACION VALOR... company
3. Go to Employees and open Cecilia Miranda Sanchez
4. Go to Payroll tab, set the end of the contract to Jan 31 and save
5. Create a new contract from Feb 1
6. Go to Payroll > Payslips > Payslips and create a new pay run
7. Select Salary Structure 'Mexico: Regular Pay', Pay Schedule 'Bi-weekly' and Period 'Jan 1 -> Jan 15'
8. Click on Continue, select Cecilia and click on Select
9. An error is thrown
Problem:
In `_compute_integration_factor` we try to compute the number of years the employee has worked by accessing the start date on the employee but this date might be earlier than the start date of the employee's current contract if the employee has changed contract. This will throw an error when we try to access the holidays count for 0 year because `payslip._rule_parameter('l10n_mx_holiday_tables')` doesn't have an entry for 0
Solution:
Use the start date of the first contract of the employee, take gaps in between the employee's contracts into consideration to correctly compute the number of years worked
opw-5931355
Forward-Port-Of: odoo/enterprise#108495This update resolves an issue where planners couldn't see available shifts for resources with no scheduled shifts. The fix removes a filter that was incorrectly limiting the shift options in the planning dialog, allowing planners to effectively assign all available shifts.
Original PR description
Steps to Reproduce ------------------ 1. Open the Planning Gantt view. 2. Click a cell that belongs to a resource with **no** scheduled shifts. 3. The Plan dialog opens with an empty list. Issue…
Steps to Reproduce ------------------ 1. Open the Planning Gantt view. 2. Click a cell that belongs to a resource with **no** scheduled shifts. 3. The Plan dialog opens with an empty list. Issue ----- A previous change keeps the clicked resource in the dialog context; the Gantt model turns it into a default search filter, so only shifts already linked to that resource are shown. Unassigned shifts are therefore hidden, preventing planners from assigning them by role or availability. Current Behaviour ----------------- The Plan dialog is always filtered by `resource_id`, which returns no results for unscheduled resources, even when they have the right roles. Expected Behaviour ------------------ The dialog should list all unscheduled shifts that match the resource’s roles, or every unscheduled shift if the resource has no roles, while still preserving full context for scheduling once a shift is selected. Fix --- Remove the automatic resource filter from the dialog context in `getSelectCreateDialogProps()`. This prevents the unwanted search restriction; role defaults remain, so the dialog now displays the correct shifts. Task-4922525 Issue – https://github.com/odoo/enterprise/pull/87424/commits/a218a7cedce61f992fbe76284c273be8f937d28d Forward-Port-Of: odoo/enterprise#92100
This update addresses a potential issue in the Swiss payroll reporting process. Specifically, it now displays a warning instead of an error when the 'AVS' (Authorized Value System) calculation results in a negative value. This prevents disruptions in reporting and ensures accurate data transmission for tax compliance.
Original PR description
Forward-Port-Of: odoo/enterprise#109046
8 changes
Resolved issues and error corrections
This update fixes a minor issue where the system was incorrectly checking user trust permissions on multiple records instead of a single one. This change ensures data integrity and improves the reliability of account-related processes. The fix was implemented to streamline the system's functionality.
Original PR description
In some cases, the check was done on multiple records, though the method should be called on one and only one record. Forward-Port-Of: odoo/odoo#251457
This update fixes a bug where leave hours weren't being calculated correctly for time off allocations without a defined end date. The change treats all such allocations as starting from their earliest start date, ensuring accurate hour tracking in reports. This improves the reliability of leave balance reporting.
Original PR description
### Steps to reproduce: - Create a Overtime hours time off type - Create mutliple allocations with different start dates but no end date - Create some leaves for the created allocations one after each allocation start date - Compare the number of hours remaining for the allocations' employee in his time off dashboard and in the Balance report. ### Cause: After this commit https://github.com/odoo/odoo/pull/245860/changes/d9bb4d206e91d10eac7311adede307b8c5019213 we changed the way we match leaves with allocations but we were strict that the leave has to lie in between the allocation dates and this created a wrong accumlated taken_hours in the taken_per_allocation subquery. ### Fix: Following the same approach we use in if the allocation has no expiry date we don't check if the leave.date_to > allocation.date_from as we are going to treat all allocations as they form one big allocation that started in the earliest start date opw-5474596
This update corrects a visual glitch where sample data continued to appear after creating new records in certain views (like lists). The fix ensures that sample data is properly disabled when the view is reloaded, providing a cleaner and more accurate user experience. This resolves a previously reported issue impacting the appearance of the control panel.
Original PR description
Have a view (e.g. list) with no real records but sample data. In the control panel, have a button that, when clicked, creates new records which match the current filter, i.e. which are displayed…
Have a view (e.g. list) with no real records but sample data. In the control panel, have a button that, when clicked, creates new records which match the current filter, i.e. which are displayed directly in the UI. Before this commit, the new records were correctly displayed, but the sample data overlay (opacity) was still there. The problem came from the fact that the sample data are automatically disabled when the view is reloaded **from above** (typically from the WithSearch component, when the user interacts with the search view). However, in the faulty scenario, the `load` function of the model is called directly by the view itself, so we don't go through WithSearch, and the code of model.js that ensures that we leave the sample mode. We already faced that issue in pivot and graph, and we solved it locally. This commit fixes it globally, by creating a small override of model.load which leaves the sample mode. task~5980226 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 fixes an issue where meeting dates in the CRM were incorrectly displayed as a day after the scheduled meeting, particularly when using different time zones. The fix aligns the displayed date with the user's timezone preference, ensuring accurate meeting scheduling and visibility.
Original PR description
# How to reproduce - Use a browser extension to manage your browser's timezone - Set your browser's timezone to a timezone with quite a big delay (like "America/Grand_Turk" if you live in Europe) -…
# How to reproduce - Use a browser extension to manage your browser's timezone - Set your browser's timezone to a timezone with quite a big delay (like "America/Grand_Turk" if you live in Europe) - Go to the form view of an opportunity - Click on the smart button for meetings (Should be "No Meeting" if it is a new Opportunity) - In the calendar view, add a new meeting for very late in the day (Example : 2026-02-10 22:00:00 => 23:00:00) - Go back to the opportunity for view # The problem The date displayed is a day after the meeting that was just set up. Taking back our example, the date displayed would be 2026-02-11 # Why The calendar view uses the browser's timezone to manage the dates. The smart button does not. It is not possible to make the smart button use the browser's timezone, atleast in a clean way. That is because the smart button's data is managed by a python template, which does not have access to the browser's data. Trying to change the data displayed by the framework would be clunky as the html would need to be edited directly. The fix that I implemented follows what the hr_appraisal module does for it's smart button with a date: use the timezone set in the user's preferences. opw-5898520 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the Documents app would crash after deleting a payslip run. The fix ensures that related documents are also removed when a payslip run is deleted, preventing data inconsistencies and improving app stability. This improves the user experience and avoids potential errors.
Original PR description
### Issue: When deleting a payslip run, the documents from the payslips of the run are not deleted. This results in a traceboack when opening the document app. ### Steps to reproduce: - Have a…
### Issue: When deleting a payslip run, the documents from the payslips of the run are not deleted. This results in a traceboack when opening the document app. ### Steps to reproduce: - Have a payslip run with payslips - Go to a payslip, validate and generate the document - Then cancel and reset to draft - Reset the Payslip Run to draft - Delete it - Open the Documents app ### Cause: The payslips are linked to the run with a `ondelete='cascade'` relation. https://github.com/odoo/enterprise/blob/03b2a7dae0e5c5ad3142ec2da8f3de5c9b1957f4/hr_payroll/models/hr_payslip.py#L110-L113 This means that deleting the run also deletes its payslips on a database level, bypassing the ORM. As the document is not directly linked by a relational field but instead by `res_model` and `res_id`, these fields are not updated and therefore are still pointing to a record that is no longer in DB. ### Solution: Extend the `unlink()` method in `hr.payslip.run` and unlink the documents there. opw-5501061
This update resolves an issue where rounded borders and background colors weren't consistently applied in the Mass Mailing editor's inline preview. The fix adjusts table styling to ensure accurate rendering of rounded corners and background colors, improving the visual consistency of email templates.
Original PR description
**Steps to reproduce:** - Go to mass_mailing app - Add Columns block with multiple content size - Increase Round Corners (e.g. 20 px) - In "Vert. Alignment" field > Select the "Stretch to Equal…
**Steps to reproduce:**
- Go to mass_mailing app
- Add Columns block with multiple content size
- Increase Round Corners (e.g. 20 px)
- In "Vert. Alignment" field > Select the "Stretch to Equal Height" option
- Add color background for the columns
- Save the record and send test mail
- Round corners are not applied
- Background color doesn't expand to the bottom of the body
**Issue:**
Default table style used for the inline conversion of
`await toInline($(editableClone), { $iframe: $(iframe), wysiwyg: this.wysiwyg });` in `mass_mailing_html_field`,
has its 'border-collapse' attribute set to 'collapse' by default in `enforceTablesResponsivity`.
This attribute doesn't work with `border-radius` and the resulting display differs from the preview of the editor.
Relevant links:
https://stackoverflow.com/questions/628301/the-border-radius-property-and-border-collapsecollapse-dont-mix-how-can-i-use https://stackoverflow.com/questions/36035461/what-is-the-difference-between-border-collapse-collapse-and-border-spacing-0
**Fix:**
Use `'border-collapse': 'separate'` and `'border-spacing': 0` but this can
introduce border stacking inside the table element where the original collapse
was needed.
Add back the `overflow` inherited by the card attributes to ensure
inside border are visually properly contained inside the border (but not
sure as to why it was removed 4 years ago).
Also set the height of table sub-elements to `100%` to ensure background
property is properly applied on the whole card body.
opw-5218581This update fixes an issue where SMS reminders weren't being sent for calendar events synced with Google or Microsoft. The change ensures that Odoo correctly handles SMS notifications for these synced events, aligning with the intended functionality. This improves the reliability of reminders for users who prefer SMS alerts.
Original PR description
SMS reminders are not sent for calendar events synced with Google, even though only email reminders should be delegated to Google. Reproduction steps: * Create a calendar event in Odoo with an SMS…
SMS reminders are not sent for calendar events synced with Google, even though only email reminders should be delegated to Google. Reproduction steps: * Create a calendar event in Odoo with an SMS reminder. * Sync the calendar with Google. * Wait for the reminder to trigger. * Observe that no SMS is sent by Odoo. Cause: The event reminder scheduled action groups events by alarm type and calls `_get_events_by_alarm_to_notify`. For Google-synced events, `_get_notify_alert_extra_conditions` blindly excludes any event with a `google_id`, assuming Google will manage all reminders. This exclusion is incorrect for non-email alarms (e.g. SMS), which must still be handled by Odoo. Fix: The alarm type is propagated through the context so Google-specific exclusions only apply to email reminders. This restores SMS notifications while preserving the existing behavior for emails. A context key is used for stability; a proper method argument will be introduced in master. opw-5172958
This update addresses a potential issue in the transmission of Swiss payroll data. Specifically, a warning is now displayed when the ‘AVS’ (Authorized Value System) is negative, providing clearer guidance for users. This ensures accurate reporting and compliance with Swiss regulations.
Original PR description
Forward-Port-Of: odoo/enterprise#109046
8 changes
Resolved issues and error corrections
This update fixes an issue where users weren't seeing their ratings in helpdesk average rating views when they weren't directly members of the associated helpdesk team. The fix ensures all assigned tickets' ratings are displayed, regardless of team membership, improving reporting accuracy and customer insights.
Original PR description
Steps to reproduce: - Configure a helpdesk team to be viewable by the test user - Remove test user from member_ids of helpdesk team - With that team selected, create a helpdesk ticket assigned to test user - Submit a rating for the ticket as the customer - As the test user in the helpdesk app overview, click on today average rating or last 7 days average rating Current behavior: - In both views, the test user won't see ratings for tickets attached to helpdesk teams where they are not listed in member_ids Expected behavior: - In both views, the test user should see all ratings of assigned tickets regardless if they are included in a helpdesk team's member_ids Note: member_ids in helpdesk.team appear to be only used for auto assigning new helpdesk tickets, so checking member_ids doesn't account for all potential users working in a team opw-5949917
This update corrects an issue where incorrect withholding reasons were sometimes used for Italian VAT invoices. The change broadens the import process to allow taxes with the same withholding type to be used, even if the specific reason doesn't match, ensuring more accurate VAT calculations. This resolves a previous bug reported in related tasks.
Original PR description
Some invoice come in with a wrong ENASARCO withholding reason. We now broaden the search to allow taxes with the same withholding type to be used during import even if the withholding reason doesn't match. In the test, I change the Enasarco tax to reason Q to check that it gets correctly assigned. Ticket [link](https://www.odoo.com/odoo/project.task/5175587), [link](https://www.odoo.com/odoo/project.task/5933699) opw-5175587 opw-5933699
This update fixes a limitation in Italian invoicing that prevented multiple tax lines (like 0% taxes) from being added to the same invoice. Previously, only the DOI tax could be included. This change now allows for the inclusion of other taxes such as Enasarco and RIT, aligning with Italian tax regulations and enabling more accurate invoice processing.
Original PR description
We should be able to add more taxes with the 0% on the same line, like the Enasarco and 23% RIT. Indeed in italy it is possible to have invoices with Dichiarazione d'intento togheter with a withholding and Enasarco taxes. See also: odoo/odoo#236251 Ticket [link](https://www.odoo.com/odoo/project.task/5933699) opw-5933699
This update resolves an issue related to early payment discounts within Factur-X invoices. The change adds the necessary handling for EPD (Early Payment Discount) information, ensuring accurate invoice generation and compliance with relevant regulations. This improves the reliability of invoices processed through the Factur-X format.
Original PR description
Added the handling of early payment discount in the factur-x format. opw-5265981 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update addresses a potential issue in the transmission of Swiss payroll data. Specifically, it changes the warning level displayed when an ‘AVS’ (Authorized Value System) result is negative, ensuring more accurate reporting and reducing the risk of misinterpretation. This improves the reliability of financial data for Swiss businesses using Odoo Enterprise.
This update resolves an issue where disabled records were incorrectly flagged as blacklisted, potentially blocking legitimate users. The change ensures that disabled records are ignored when determining blacklist status, improving user access and functionality. This fix was driven by a Loom demo and related internal ticket MT-13153.
Original PR description
Same as https://github.com/odoo/odoo/pull/249466, but for v17 and with tests. > When computing wether the user is blacklisted, disabled records must be ignored. > > https://www.loom.com/share/41ea437477f8416f8b50f9ef979d82bf > > > --- > I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr > > @moduon MT-13153 OPW-5952301
This update corrects a problem where QR codes generated in self-ordering mode (for pickup zones) contained incorrect URLs. The fix ensures QR codes accurately reflect the order without including table identifiers, improving the reliability of order downloads. This resolves an issue reported in opw-5095607.
Original PR description
Step to reproduce: - setup Restaurant and do the following config - set "self-ordering" -> "Qr Menu + Ordering" - set "service At" -> "pickup zone" - save and print the qr-code ( option is right there below these configs) Observation: - in downloaded pdf, we see a wrong url, which includes table_id, which shouldn't be. - QRs do not have table_id Cause: - there is issue in `generate_qr_codes_page` method, which uses table_id even if ordering mode is "pickup zone" Fix: - we only use table_id when ordering_mode = 'table'. **Before:** <img width="1002" height="397" alt="image" src="https://github.com/user-attachments/assets/e6dc50e5-6384-45b8-8ee5-817526769dc2" /> **After** <img width="1021" height="405" alt="image" src="https://github.com/user-attachments/assets/0be9b902-3870-4fc7-a409-e01265b7a1b3" /> opw-5095607 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where product catalogs weren't correctly converting currency when displaying products or adding them to purchase orders. Now, the catalog accurately reflects the vendor's currency, ensuring consistent pricing across all sales channels. This improves accuracy and avoids discrepancies in purchase order calculations.
Original PR description
When a product is sold by a vendor in a different currency from the PO currency, the product catalog did not correctly convert the currency when displaying the product or when adding it to the PO. This was inconsistent with the backend form view, which does convert the currency when the product is added. This fix is a backport of: https://github.com/odoo/odoo/commit/aadb877f971c638bc39e91136bfe7f8dc2fce500 opw-5266131 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr