Thursday, May 29, 2025
15 changes · saas-18.3
Resolved issues and error corrections
The website page properties test has been adjusted to match recent changes in how page dependencies are handled. This helps keep automated checks reliable so future website updates can be validated correctly.
Original PR description
Since [1], we have to adapt the tour for the website page properties to fit the new behaviour of the page dependencies. [1]: https://github.com/odoo/odoo/commit/cd4b0c91c1cf60ff72e91cf0544cb255ee5aff3f
The message action menu icon now has cleaner spacing, preventing it from appearing too far away from nearby controls. This small visual fix improves consistency and polish in the messaging interface without changing functionality.
Original PR description
Before this commit, message action spacing was too big next to the "expand / ..." icon. This comes from new icon `.oi-ellipsis-v` which has a smaller visual by default and thus needs bigger size scale `.oi-large` to match font-awesome icons. Due to this bigger scaling, the horizontal spacing if quite big. This commit fixes the issue by removing extra `px-1` on the button that was relevant with `.fa-ellipsis-v` that had thin width. Even with this removal, the spacing is still to big, so an extra `ms-n1`/`me-n1` is added to make the proper spacing. Before / After  
Installing the Settle Due point-of-sale module no longer fails if the default Services product category was previously removed. This prevents an installation error and lets businesses enable the module without manually restoring that category first.
Original PR description
Currently a ParseError is arising when the user installs the `pos_settle_due` module after deleting the `Services` in Product Categories/Configuration. Steps to reproduce: --- - Install `Invoicing`…
Currently a ParseError is arising when the user installs the `pos_settle_due` module after deleting the `Services` in Product Categories/Configuration.
Steps to reproduce:
---
- Install `Invoicing` application (without demo data).
- Invoicing > Configuration > Product Categories > Delete `Services`
- Now install `pos_settle_due` module
Traceback:
---
```
ValueError: External ID not found in the system: product.product_category_services
ParseError: while parsing /home/odoo/src/enterprise/saas-18.3/pos_settle_due/data/pos_settle_due_data.xml:22, somewhere inside <record id="product_product_settle_invoice" model="product.product">
<field name="name">Settle Invoice</field>
<field name="categ_id" ref="product.product_category_services"/>
<field name="type">service</field>
<field name="weight">0.00</field>
<field name="available_in_pos">False</field>
<field name="taxes_id" eval="[]"/>
</record>
```
The error occurs because the user deleted `Services` in Product Categories, and then tried to install the other module.
This commit resolves the error by providing a False value for the field if the product category is missing.
sentry-6377659355Miscellaneous changes
## Issue: Completing a flow from quotation to payment (down payment → settle) via Point of Sale does not properly update the sale order lines when settling. ## Reason: During the down payment process, the PoS adds new lines to the sale order. These are added during the order validation stage. However, the updated order lines are not written back to IndexedDB. If the user attempts to settle the order without reloading the session or clearing the cache, the PoS relies on stale data from In
Original PR description
## Issue: Completing a flow from quotation to payment (down payment → settle) via Point of Sale does not properly update the sale order lines when settling. ## Reason: During the down payment…
## Issue: Completing a flow from quotation to payment (down payment → settle) via Point of Sale does not properly update the sale order lines when settling. ## Reason: During the down payment process, the PoS adds new lines to the sale order. These are added during the order validation stage. However, the updated order lines are not written back to IndexedDB. If the user attempts to settle the order without reloading the session or clearing the cache, the PoS relies on stale data from IndexedDB. This causes Odoo to see outdated `order_lines`, usually only the original item(s), leading to incorrect behavior such as product quantities resetting to 0. ## Fix: To ensure data consistency, we explicitly remove the affected sale orders from IndexedDB after the down payment is completed. This forces the PoS to re-fetch the updated order from the backend. The re-fetch happens through the `missingRecursive` function, which will retrieve the complete and up-to-date sale order data, including the new order lines, ensuring accurate behavior during the settlement process. ## Steps to reproduce: 1. Create a service product with "Ordered quantities" as the invoicing policy. 2. Create a quotation using this product. 3. Open the PoS. 4. Click "Actions" → "Quotations" → select the quotation. 5. Choose the "Down Payment" option (any type) and set amount/percentage. 6. Pay the order. 7. Again, go to "Actions" → "Quotations" and select the same order. 8. Click "Settle the order". 9. At this point, Odoo will incorrectly reset product quantity to 0. OPW-4811612 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212017 Forward-Port-Of: odoo/odoo#211139
Steps to reproduce: ---- - Install pos_self_order - Configuration > Settings > Under Mobile self-order & Kiosk - Select Self Ordering Mode as QR menu + Ordering and save changes - Click Preview Web Interface Issue: ---- - Slideshow is not working in QR menu + Ordering mode. Cause: ---- - It was intentionally bypassed for the QR menu + Ordering mode. Fix: ---- - Removed unnecessary code which caused the issue. --- task-4745666 Forward-Port-Of: odoo/odoo#207235
Original PR description
Steps to reproduce: ---- - Install pos_self_order - Configuration > Settings > Under Mobile self-order & Kiosk - Select Self Ordering Mode as QR menu + Ordering and save changes - Click Preview Web Interface Issue: ---- - Slideshow is not working in QR menu + Ordering mode. Cause: ---- - It was intentionally bypassed for the QR menu + Ordering mode. Fix: ---- - Removed unnecessary code which caused the issue. --- task-4745666 Forward-Port-Of: odoo/odoo#207235
Fix the import of vendor bills that use per-line ScontoMaggiorazione. The discount/surcharge should be applied to the price unit before taxes, instead of summed and subtracted from the total. #### Correct | Product | Qty | Unit Price | Discount | VAT % | Formula | Total | |-----------|-----|------------|----------|-------|----------------------------------|-----------| | Product 1 | 2 | 5.00 | 3.00 | 22% | `2 * (5 - 3) * 1.22` | 4.8
Original PR description
Fix the import of vendor bills that use per-line ScontoMaggiorazione. The discount/surcharge should be applied to the price unit before taxes, instead of summed and subtracted from the total. ####…
Fix the import of vendor bills that use per-line ScontoMaggiorazione. The discount/surcharge should be applied to the price unit before taxes, instead of summed and subtracted from the total. #### Correct | Product | Qty | Unit Price | Discount | VAT % | Formula | Total | |-----------|-----|------------|----------|-------|----------------------------------|-----------| | Product 1 | 2 | 5.00 | 3.00 | 22% | `2 * (5 - 3) * 1.22` | 4.88 | | Product 2 | 1 | 10.00 | 3.00 | 10% | `1 * (10 - 3) * 1.10` | 7.70 | | | | | | | | **12.58** | #### Before the scontomaggiorazione is not managed line by line. We have to manage line by line because the ScontoMaggiorazione should decrease the "Imponibile" and than calculate the amount tax line by line because each line can have different tax % . ATTENTION: the ScontoMaggiorazione on ImportoTotaleDocumento is not the sum of the ScontoMaggiorazione on the lines. It is a discount on the amount tax included Forward-Port-Of: odoo/odoo#206238
This commit adds the livechat username of the users next to their real names when choosing to invite them. This is to avoid having a leak of the real name when inviting new operators. task-4775090 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208855
Original PR description
This commit adds the livechat username of the users next to their real names when choosing to invite them. This is to avoid having a leak of the real name when inviting new operators. task-4775090 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208855
In the Time Off app dashboard, employees can view whether some of their unused time off days are set to expire and the exact expiration date. At the accrual plan level, a validity period can be defined for carried-over days, after which they expire. However, the expiration date of these carried-over days hasn't been considered when calculating the employee's expiring balance. Steps to reproduce: 1. Create a new accrual plan. 2. Define a new accrual plan level. 3. Configure the lev
Original PR description
In the Time Off app dashboard, employees can view whether some of their unused time off days are set to expire and the exact expiration date. At the accrual plan level, a validity period can be…
In the Time Off app dashboard, employees can view whether some of their unused time off days are set to expire and the exact expiration date. At the accrual plan level, a validity period can be defined for carried-over days, after which they expire. However, the expiration date of these carried-over days hasn't been considered when calculating the employee's expiring balance. Steps to reproduce: 1. Create a new accrual plan. 2. Define a new accrual plan level. 3. Configure the level to accrue 10 days annually. 4. Set the carryover validity to 2 months. 5. Keep all other settings as default. 6. Create a new allocation. 7. Apply the previously defined accrual plan. 8. Set the start date to 01/01/20xx (where xx is the previous year). 9. Confirm the employee's balance is now 10 days. 10. Navigate to the dashboard. 11. Set the date to 01/01/(20xx + 2), corresponding to the carryover date. 12. Notice that no expiration date is displayed on the dashboard. 13. The expiration date should be displayed as 01/03/(20xx + 2). This update addresses the issue by incorporating the expiration dates of carried-over days into the calculation. task-4207987 Forward-Port-Of: odoo/odoo#209992 Forward-Port-Of: odoo/odoo#181502
The adaptations from [1] and [2] added some code to the snippet preview dialog, mainly to adapt text highlights in the snippets content (starting from `18.0`) and enable the snippets preview interactions (starting from `18.3`) [A]. In a runbot test context, the snippet selection happens too fast that the code from [A] (linked to the async behaviour of `insertSnippets`) can still process the snippets dialog `iframeDocument` (lost after the dialog being closed on snippet selection). Th
Original PR description
The adaptations from [1] and [2] added some code to the snippet preview dialog, mainly to adapt text highlights in the snippets content (starting from `18.0`) and enable the snippets preview…
The adaptations from [1] and [2] added some code to the snippet preview dialog, mainly to adapt text highlights in the snippets content (starting from `18.0`) and enable the snippets preview interactions (starting from `18.3`) [A]. In a runbot test context, the snippet selection happens too fast that the code from [A] (linked to the async behaviour of `insertSnippets`) can still process the snippets dialog `iframeDocument` (lost after the dialog being closed on snippet selection). The goal of this commit is to fix this behaviour by simply taking into consideration the fact that the preview content can be lost (since in a real use case, a user will select a snippet in a reasonable time). [1]: https://github.com/odoo/odoo/commit/1aaf483c5d3b8e8816cfbea7da96ac007a42d492 [2]: https://github.com/odoo/odoo/commit/e008c92fcad2b8cc160586ba6ab94bc077b9bf3d Remark: This commit will be adapted on `18.3` to fix the code from [2]. runbot-190596 Forward-Port-Of: odoo/odoo#210295
### Steps to reproduce: - Navigate to Recruitment > Job Position > Any job position > Job applications (smart button) - Create an applicant - Set a Recruiter for the applicant - Move the stage to 'Contract Signed' - Click on 'Create Employee' - Notice a validation error that the opertion cannot be completed ### Cause: This is happening as the 'Job applications' smart button has default value for the user_id in context https://github.com/odoo/odoo/blob/889f25f1322f00dff7cacad95
Original PR description
### Steps to reproduce: - Navigate to Recruitment > Job Position > Any job position > Job applications (smart button) - Create an applicant - Set a Recruiter for the applicant - Move the stage to…
### Steps to reproduce: - Navigate to Recruitment > Job Position > Any job position > Job applications (smart button) - Create an applicant - Set a Recruiter for the applicant - Move the stage to 'Contract Signed' - Click on 'Create Employee' - Notice a validation error that the opertion cannot be completed ### Cause: This is happening as the 'Job applications' smart button has default value for the user_id in context https://github.com/odoo/odoo/blob/889f25f1322f00dff7cacad95236d6f045c30d64/addons/hr_recruitment/views/hr_job_views.xml#L207-L211 so when creating an employee it will add the missing fields from defaults and it will get the default value in the context which for an existing user so when creating the employee with this user_id it will trigger the sql constraint https://github.com/odoo/odoo/blob/889f25f1322f00dff7cacad95236d6f045c30d64/addons/hr/models/hr_employee.py#L145-L148 ### Fix: clean the context before creating the partner and the employee corresponding to this applicant opw-4629219 Forward-Port-Of: odoo/odoo#211468 Forward-Port-Of: odoo/odoo#204997
When the user tries to export a file of attachment in xlsx format, A traceback will appear. Steps to reproduce the error: - Open attachments > Upload a file that does not contain base64-encoded content - Select that file > Actions > Export > Export Format: XLSX > Add File content(raw) field > Export Traceback: ``` AttributeError: 'ExportXlsxWriter' object has no attribute 'field_names' ``` In this commit: https://github.com/odoo/odoo/commit/a4e04518a437f09d6a10e25a35900c4adfe11
Original PR description
When the user tries to export a file of attachment in xlsx format, A traceback will appear. Steps to reproduce the error: - Open attachments > Upload a file that does not contain base64-encoded content - Select that file > Actions > Export > Export Format: XLSX > Add File content(raw) field > Export Traceback: ``` AttributeError: 'ExportXlsxWriter' object has no attribute 'field_names' ``` In this commit: https://github.com/odoo/odoo/commit/a4e04518a437f09d6a10e25a35900c4adfe11dc6 ``field_names`` is renamed to ``fields``. https://github.com/odoo/odoo/blob/0e98b684834cf9e1d646e55599e7bc00aa5997f0/addons/web/controllers/export.py#L231 Here, ``field_names`` is still used. So, it will lead to the above traceback. sentry-6096581800 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#189110
When sending a combo to a preparation printer, the combo items where not indented correctly. This was leading to a preparation ticket that made it look like all items were normal items, instead of being part of a combo. Steps to reproduce: ------------------- * Create a combo product A * Setup a kitchen printer in the PoS * Open PoS and add the combo product A * Send the order to the kitchen printer > Observation: The preparation ticket does not show the combo items > indented correctl
Original PR description
When sending a combo to a preparation printer, the combo items where not indented correctly. This was leading to a preparation ticket that made it look like all items were normal items, instead of being part of a combo. Steps to reproduce: ------------------- * Create a combo product A * Setup a kitchen printer in the PoS * Open PoS and add the combo product A * Send the order to the kitchen printer > Observation: The preparation ticket does not show the combo items > indented correctly Why the fix: ------------ We add a new fields in the `changes` that state if the line is part of a combo. If it is part of a combo, we add a css class that will indent the line accordingly. opw-4459211 Forward-Port-Of: odoo/odoo#211499 Forward-Port-Of: odoo/odoo#196397
Purpose: Splitting QR codes should not be done in documents. They are unusable if broken and some of them have legal impications. Problem Cause: If the QR code is contained in `<div>` that has class `row`, the css property `display: flex;` would cause it to be split among pages when needed. All EDI modules with QR codes were visited, but the problem was only spotted in Mexico and Peru. Solution: `<div>` containing QR codes and having `row` class should also have class `avoid-pa
Original PR description
Purpose: Splitting QR codes should not be done in documents. They are unusable if broken and some of them have legal impications. Problem Cause: If the QR code is contained in `<div>` that has class `row`, the css property `display: flex;` would cause it to be split among pages when needed. All EDI modules with QR codes were visited, but the problem was only spotted in Mexico and Peru. Solution: `<div>` containing QR codes and having `row` class should also have class `avoid-page-break-inside` task-4756331 Forward-Port-Of: odoo/enterprise#85038
The system failed to retrieve `worked_days.payslip_id.date_to` because user remove end period Steps to Reproduce: 1. Switch to `My Mexican Company`. 2. Go to Payroll > click Payslips > To Pay > Click New 3. Select Employee from the selection 4. Remove end date from period (Right One). Error: `TypeError: unsupported operand type(s) for -: 'bool' and 'datetime.date'` Solution: Ensure that if worked_days.payslip_id.date_to, start_date, end_date are not present then continue the flo
Original PR description
The system failed to retrieve `worked_days.payslip_id.date_to` because user remove end period Steps to Reproduce: 1. Switch to `My Mexican Company`. 2. Go to Payroll > click Payslips > To Pay > Click New 3. Select Employee from the selection 4. Remove end date from period (Right One). Error: `TypeError: unsupported operand type(s) for -: 'bool' and 'datetime.date'` Solution: Ensure that if worked_days.payslip_id.date_to, start_date, end_date are not present then continue the flow Sentry - 6473512002 Forward-Port-Of: odoo/enterprise#82675
Issue Before This Commit: ============================ In MO barcode interface, the by-products section displays the source location instead of the destination location for each by-product line. This is misleading, as by-products are outputs of a production process and should reference a destination location. Steps to Reproduce: ============================ - Install the stock_barcode_mrp module. - Activate multi-step routes and By-Products. - Create a Manufacturing Order with by
Original PR description
Issue Before This Commit: ============================ In MO barcode interface, the by-products section displays the source location instead of the destination location for each by-product line. This…
Issue Before This Commit:
============================
In MO barcode interface, the by-products section displays the
source location instead of the destination location for each by-product line.
This is misleading, as by-products are outputs of a production
process and should reference a destination location.
Steps to Reproduce:
============================
- Install the stock_barcode_mrp module.
- Activate multi-step routes and By-Products.
- Create a Manufacturing Order with by-products.
- Open the MO using the barcode app.
- In the by-product section notice that:
- The lines are grouped by Source Location.
- If you edit by-product line then user has option to edit source location.
- If the MO operation type has Source Location scan as mandatory,
user can't edit by-product line.
With This Commit:
============================
- By-product lines are now grouped by their destination location.
- The destination location is displayed for each by-product line.
- The source location field is hidden when editing by-product lines.
- Even if the MO operation type has Source Location scan as mandatory,
users can still edit by-product lines.
This fix improves clarity and usability for production operators by ensuring
that the appropriate location context is accurately displayed and
can be edited when necessary.
task - [4654161](https://www.odoo.com/odoo/my-tasks/4654161)
Forward-Port-Of: odoo/enterprise#86564
Forward-Port-Of: odoo/enterprise#83617