Daily updates from Odoo
Tuesday, September 23, 2025
140 changes
16 changes
Enhancements to existing features
The IoT Box homepage now displays each device's MAC address alongside its device information. This makes it easier for installers to identify boxes and assign fixed IP addresses during setup.
Original PR description
This PR adds the MAC address to the device info returned by the IoT Box. It is displayed on the IoT Box Homepage. This helps to fix ip addresses of the IoT Boxes during the installations.
Resolved issues and error corrections
Fixed an issue in the Spanish SME balance sheet where some current payable accounts were counted twice, causing inflated totals. This improves the accuracy of financial reporting for Spanish companies using the affected balance sheet report.
Original PR description
In **`balance_pymes_line_32300`** (`CURRENT LIABILITIES > Current payables > Other current payables`), amounts are **doubled** because account **551** is included twice. * **Formula using…
In **`balance_pymes_line_32300`** (`CURRENT LIABILITIES > Current payables > Other current payables`), amounts are **doubled** because account **551** is included twice.
* **Formula using `account_codes`:**
```xml <field name="formula">-1034 - 1044 - 190 - 192 - 194 - 500 - 501 - 505 ...551 - 5566 - 5595 - 5598 - 560 - 561 - 569</field> ```
→ Explicitly includes account **551**.
* **Formula using `domain`:**
```xml <field name="formula" eval="['|', ('account_id.code','=like','550%'), '|', ('account_id.code','=like','551%'), '|', ('account_id.code','=like','554%'), ('account_id.code','=like','5525%')]"/> ```
→ Includes **all accounts starting with 551**, so **551** is also counted here.
This overlap causes the balance to be counted twice, inflating the reported value.
**steps to reproduce:**
1. With a Spanish company, go to **Accounting > Dashboard > Bank > Transaction > New**.
2. Select an account, search for **55100**, and add it.
3. Go to **Reporting > Balance Sheet > Other current payables**.
4. Notice that the reported amount is **double** the actual accounting data.
Overlapping formulas: specific account `551` and `5525` are counted in `account_codes`, while the `domain` formula already includes `551%`, leading to duplication.
**Fix**
Remove explicit account codes from `account_codes` if they are already covered by the `domain` prefixes to avoid double-counting. and also made sure to correct the same issue in the whole report.
opw-5075035
Forward-Port-Of: odoo/enterprise#94494This fix stops users from deleting the default barcode nomenclature that the barcode scanner setup depends on. It prevents crashes when enabling the barcode scanner in Inventory settings, keeping configuration changes reliable for users.
Original PR description
The system will crash with error when user tries to enable barcode scanner in settings. **Steps to produce: -** - Install `Inventory` module. - `Inventory > configuration > products > Barcode…
The system will crash with error when user tries to enable barcode scanner in settings.
**Steps to produce: -**
- Install `Inventory` module.
- `Inventory > configuration > products > Barcode Nomenclatures`.
- Delete the `Default Nomenclature` record.
- Go to settings uncheck `Barcode Scanner` and save settings.
- Now, again `enable` that and save.
Error: -
```py
ValueError: External ID not found in the system: barcodes.default_barcode_nomenclature
ParseError: while parsing /home/odoo/src/enterprise/saas-18.4/stock_barcode/data/data.xml:40, somewhere inside <record id='scale_up_alias_1' model='barcode.rule'>
<field name='name'>Scale Up Receipt</field>
<field name='type'>alias</field>
<field name='pattern'>WH-RECEIPTS</field>
<field name='alias'>WHIN</field>
<field name='barcode_nomenclature_id' ref='barcodes.default_barcode_nomenclature'/>
<field name='sequence'>0</field>
</record>
```
**Root cause: -**
- At [1], the records use the ref of `default_barcode_nomenclature` which is defined in barcode module. So, when the ref is deleted and we are trying to use it then it gives error.
**Solution: -**
- This commit resolves the error by prevent the deletion of `default nomenclature`.
[1]: https://github.com/odoo/enterprise/blob/400171c9cebc46ecdd907ada210c65f3bbd2dd66/stock_barcode/data/data.xml#L40-L71
**sentry-6823596992**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#226594Fixed an issue where changing a timesheet entry in list view and moving focus away could show the old time again. This helps users trust that their latest Time Spent edits are retained while entering or updating timesheets.
Original PR description
Steps to reproduce: ----------------- 1. Go to Timesheet → My Timesheet → List View → New OR Edit already filled time. 2. Change time in the Time Spent field. 3. Press Shift + Tab. Observation:…
Steps to reproduce: ----------------- 1. Go to Timesheet → My Timesheet → List View → New OR Edit already filled time. 2. Change time in the Time Spent field. 3. Press Shift + Tab. Observation: ----------------- The focus changes, but the Time Spent field reverts to its old value instead of keeping the newly entered one. Issue: ----------------- - For new records, the component retrieves the value only from the state, which is updated in the `onWillUpdateProps` lifecycle. This lifecycle triggers only on saving or editing, not when simply changing focus. https://github.com/odoo/enterprise/blob/e14b991927df14f41535e92dd01ea2ecac44a404/timesheet_grid/static/src/components/timesheet_display_timer/timesheet_display_timer.js#L123-L128 - The same behavior occurs when editing existing records, leading to incorrect value display. https://github.com/odoo/enterprise/blob/e14b991927df14f41535e92dd01ea2ecac44a404/timesheet_grid/static/src/components/timesheet_display_timer/timesheet_display_timer.js#L31-L33 Solution: ----------------- - For new records, since the default value is 0, the fix makes the component fall back to the updated record value if the state value is not yet available. - For existing records, if the timer is running, the timer’s value is displayed. otherwise, the component falls back to the updated record value. opw-4922847 Forward-Port-Of: odoo/enterprise#95141 Forward-Port-Of: odoo/enterprise#94729
Fixed an issue where field service sales orders could remain marked as "To invoice" even after the related invoice was created and posted. This helps users see the correct billing status for zero-priced service lines in Anglo-Saxon accounting setups.
Original PR description
Steps: - Install sale and fsm module. - Enable anglo-saxon from the setting. - Create a service type product with fsm project as template. - Select that product on SO and set unit price to 0 on SOL. - Confirm that order and create and post invoice. Issue: - Sale order status still shows `To invoice` even though we create SOL related invoice. Cause: - In [PR] we made invoice status for anglo-saxon line `To Invoice` so it always say `To Invoice` even user create related invoice. Fix: - Make those lines `Invoiced` if there is related invoice by checking qty_invoiced is greater or equal to qty. [PR]: https://github.com/odoo/enterprise/pull/70132 opw-5055540 Forward-Port-Of: odoo/enterprise#94723
Payroll users with Administrator access can now cancel completed payslips as intended. This prevents an incorrect error from blocking authorized payroll staff and keeps payroll correction workflows running smoothly.
Original PR description
steps to reproduce: ------------------- 1. Install payroll 2. Create a user and grant "Administrator" access to Payroll. 3. Log in as the new user and try to cancel a 'Done' payslip. issue: ------ A UserError is raised: "Cannot cancel a payslip that is done." observation: ------------ A user with Payroll "Administrator" access is unable to cancel a payroll payslip cause of the issue: ------------------- During cancellation, the system checks whether the user is "Admin" instead of verifying if the user has Payroll "Administrator" access. https://github.com/odoo/enterprise/blob/13832d80570956e504e1c09f41acbeb0bc4baedc/hr_payroll/models/hr_payslip.py#L509-L513 solution: ---------- Check that the user has Payroll "Administrator" access. opw-5040029 Forward-Port-Of: odoo/enterprise#95049 Forward-Port-Of: odoo/enterprise#93831
This fix prevents users from editing the amount in currency on posted invoice journal items where the change could leave invoice totals and related analytic entries inconsistent. The field remains editable only for appropriate draft tax lines, helping protect accounting data accuracy.
Original PR description
- Create an invoice with some products and post it - Go to Accounting > Journal items and ser for the ones belonging to the invoice. - Set the checkbox for the product sales one and set whatever tax…
- Create an invoice with some products and post it - Go to Accounting > Journal items and ser for the ones belonging to the invoice. - Set the checkbox for the product sales one and set whatever tax grid (you'll have to reveal that column). - Accept the changes. - Now go back to the invoice. - You'll see a new tracking message. Something like Journal Item #1093 updated - It contains a link and from that link you can go to the journal item form. - In that form you can edit the *amount in currency* field. Issue: - If a user do so, it leaves inconsistent invoice amounts: totals aren't recomputed, analytic lines aren't recomputed either. How it should behave: - Amount in currency shouldn't be editable here. Mainly when the journal entry is already posted! opw-4951629 A vídeo showing the issue: 📹️ https://www.loom.com/share/f7cd1d8f4138458f9b6c190233b0b9df?sid=eec77c17-a4a6-4698-8604-10aaa7e33f47 MT-10887 cc @moduon --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225346 Forward-Port-Of: odoo/odoo#223187
Sendcloud deliveries now allow customs HS codes up to 12 characters, matching Sendcloud's current API rules. This helps prevent international parcels, especially shipments to the US, from being delayed because customs information was cut short.
Original PR description
**PROBLEM** We limit the `hs_code` length to 8 characters, but if we refer to the [sendcloud v2 api doc](https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/parcels/schemas/parcel-item), we see that `hs_code` length can be up to 12 characters. Some clients have issue with parcels being held longer in custom when sending them to the US. [opw-5051585](https://www.odoo.com/odoo/project/49/tasks/5051585) Forward-Port-Of: odoo/enterprise#94894
Field Service sales orders now use the product's currency when calculating line prices, instead of treating it as the sales order currency. This ensures prices are converted correctly when products and orders use different currencies, preventing incorrect invoice amounts.
Original PR description
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any…
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any employee and any service. - Return to the task and in the Timesheets tab, add a new timesheet. - Click the Mark as done button. - Click the Sales order button. ### Cause: When creating the sale order out of the fsm task we use _get_tax_included_unit_price to get the price of the SO line but we are passing the order currency twice to this method so it doesn't convert the price as when it checks the currency and the product_currency it found they are the same so no need to convert https://github.com/odoo/odoo/blob/6653355b8bc063ceadf08af17fbf2c4a250553e6/addons/account/models/product.py#L239-L240 ### Fix: We pass the product currency instead of the order currency in order to be able to convert the price according to the currencies opw-5045071 Forward-Port-Of: odoo/enterprise#95134 Forward-Port-Of: odoo/enterprise#94947
Credit notes for Mexican public customer invoices can now keep the selected "Returns, discounts or bonuses" tax usage when allowed by SAT rules. This prevents incorrect XML values and helps businesses issue compliant credit notes without manual correction.
Original PR description
**Steps to reproduce:** 1. Install `l10n_mx` and `l10n_mx_edi`. 2. Create an invoice with: * Enable *CFDI to Public*. * Confirm, then send to SAT. 3. Create a credit note with: * *Usage* = `Returns,…
**Steps to reproduce:** 1. Install `l10n_mx` and `l10n_mx_edi`. 2. Create an invoice with: * Enable *CFDI to Public*. * Confirm, then send to SAT. 3. Create a credit note with: * *Usage* = `Returns, discounts or bonuses` (G02). 4. Download the generated XML for the credit note. **Observed behavior:** - The `<UsoCFDI>` tag in the XML shows `S01` (No fiscal effects). **Expected behavior:** - The `<UsoCFDI>` tag should show `G02` for credit notes under regime 616 when explicitly selected. **Root cause:** - For regime 616 (`Público en general`), the code always defaults to `S01`. - The condition only allowed `G02` when refunding a global invoice (`is_refund_gi`), not for normal credit notes. **Solution:** - Allow `G02` usage to be preserved for credit notes (tipo_de_comprobante = 'E') even when `CFDI to public` is active, as this is now permitted by SAT regulations for fiscal regime 616. **ref:** http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI_V_4_20250820.xls opw-5012917 Forward-Port-Of: odoo/enterprise#93071
This fix ensures online orders use the correct warehouse when a customer switches from Click and Collect to standard delivery before payment. It prevents quotations from staying tied to the pickup warehouse, helping stock and fulfillment route orders from the right location.
Original PR description
Steps: - Activate Click and Collect, then create a new warehouse. - For the product, add quantities in both locations. - Assign the second warehouse to Click and Collect. - Go to the website, add the product to the cart, choose Click and Collect as the delivery method, then switch it to Delivery and confirm payment. Issue: - When checking the quotation, it still uses the warehouse linked to Click and Collect. Cause: - Warehouse recomputation logic is called after _remove_delivery_line which resets the delivery_type of sale order. Since delivery_type is reset the sale order filter for warehouse recomputation does not work as intended. Fix: - Moved warehouse recomputation logic to _set_delivery_method which will filter the sale order before _remove_delivery_line. opw - 4965726, 5004170 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225989
Generating PDF quotations for several sales orders now skips any order that cannot produce a valid PDF instead of stopping with an error. This prevents one incomplete quotation from blocking the whole batch and makes sales document printing more reliable.
Original PR description
Description of the issue/feature this PR addresses: This PR addresses a KeyError that occurs when attempting to generate a PDF quotation for multiple sales orders at once in Odoo. The issue arises…
Description of the issue/feature this PR addresses: This PR addresses a KeyError that occurs when attempting to generate a PDF quotation for multiple sales orders at once in Odoo. The issue arises when one or more selected orders do not have a valid PDF stream (e.g., due to missing data like order lines or incorrect templates). The error occurs because the system tries to access result[order.id]['stream'] for a sales order that doesn't have the stream generated, causing the server to fail. Current behavior before PR: Before this PR, when attempting to print the quotation for multiple sales orders, the system will throw a KeyError if any of the selected orders do not have a valid PDF stream generated. This can happen if a sales order is missing data (such as products or a client) or has an incomplete quotation template. The error prevents users from generating quotations for a group of sales orders, even if only one order is missing the necessary data. Desired behavior after PR is merged: After merging this PR, the system will check if the PDF stream exists before attempting to access it. If a sales order does not have a valid stream (due to missing data or other issues), it will be skipped without causing a server error. This allows users to print multiple quotations at once without the system failing due to one incomplete order. The feature will improve robustness when handling orders with missing or incomplete data and prevent unexpected crashes. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227517 Forward-Port-Of: odoo/odoo#227347
This fix prevents imported invoice lines with very short product names from being linked to unrelated products. It improves accounting document accuracy by avoiding overly broad name matches during product lookup.
Original PR description
hen resolving a product in _retrieve_product, the code searched by barcode, default_code, and then by name using both exact and ilike domains. For very short item names coming from imports (e.g., “-”, “A-1”, “0001”), the ilike fallback could match unrelated products whose names merely contain that short string. this led to incorrect product linkage on created documents (e.g., EDI-imported invoices). discussed with: Christophe (chkl) Steps to reproudce: Accounting -> Invoices upload an XML with a product name liek `-` or `a` See the product attched to the invoice line. opw-5003482 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225143
The Point of Sale now blocks product updates when that product is already part of the current order. This prevents mismatched product information in active carts and helps cashiers avoid order inconsistencies.
Original PR description
- Prevent update of product via POS when the product is already in the current order (to avoid leading to inconcistent data on this product for the current order). task-id: 4943650 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Receipts now use a smaller, more compatible version of the company logo and store it in a way that avoids browser cache problems. This helps ensure customers consistently see the business branding on printed or displayed receipts, especially on iOS devices and self-order flows.
Original PR description
Some clients reported that the company logo was not displayed on receipts. This issue was reproducible when using iOS with a large logo file, and in some cases when the browser cache was disabled. This commit addresses the issue by: - Using the image_256 version of the company logo to fix rendering on iOS. - Storing the logo as data url to avoid repeated URL requests and cache-related issues. Task-5055910 Sample company logo causing issue [logo.zip](https://github.com/user-attachments/files/22251877/logo.zip) Forward-Port-Of: odoo/odoo#225743
This update prevents an error when users validate deliveries for products with expiry tracking where no removal date is set. It lets the delivery process continue as expected while still handling expiry checks safely.
Original PR description
currently an error occur when user proceed except expired delivery. Steps to Reproduce: - Install the `product_expiry` module. - Create a product with the configuration: - In `Track Inventory`,…
currently an error occur when user proceed except expired delivery. Steps to Reproduce: - Install the `product_expiry` module. - Create a product with the configuration: - In `Track Inventory`, select `By Lots`. - In the `Inventory tab`, check `Expiration Date`. - In the newly created product, click `Lot/Serial Numbers` button, create a new `Lot/Serial Number`, and clear the `Removal Date` of that Lot/Serial Number. - Go back to the newly created product and update the `Quantity On Hand` of the linked `Lot/Serial Number` by clicking `Update`. - Now go to `deliveries` and create a new `delivery` and add the newly created product and `validate` > `Proceed except expired`. `TypeError: '<' not supported between instances of 'bool' and 'datetime.datetime'` This error occurs when user proceed except expired delivery, The removal_date of the move line is computed based on the lot's removal date and the move line's expiration date. If the lot does not have a removal date and the move line also does not have an expiration date, then removal_date on the move line is set to False [1], which raises the error here [2] This commit ensures that it only compares with the move line removal_date if it is present. [1]- https://github.com/odoo/odoo/blob/70a7babcc830f72bd069a5bb1504748363e4e848/addons/product_expiry/models/stock_move_line.py#L56 [2]-https://github.com/odoo/odoo/blob/70a7babcc830f72bd069a5bb1504748363e4e848/addons/product_expiry/wizard/confirm_expiry.py#L48 sentry-6864176071 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
15 changes
Resolved issues and error corrections
Odoo now protects the default barcode setup record from being deleted. This prevents crashes when users disable and re-enable the Barcode Scanner setting, keeping inventory barcode configuration reliable.
Original PR description
The system will crash with error when user tries to enable barcode scanner in settings. **Steps to produce: -** - Install `Inventory` module. - `Inventory > configuration > products > Barcode…
The system will crash with error when user tries to enable barcode scanner in settings.
**Steps to produce: -**
- Install `Inventory` module.
- `Inventory > configuration > products > Barcode Nomenclatures`.
- Delete the `Default Nomenclature` record.
- Go to settings uncheck `Barcode Scanner` and save settings.
- Now, again `enable` that and save.
Error: -
```py
ValueError: External ID not found in the system: barcodes.default_barcode_nomenclature
ParseError: while parsing /home/odoo/src/enterprise/saas-18.4/stock_barcode/data/data.xml:40, somewhere inside <record id='scale_up_alias_1' model='barcode.rule'>
<field name='name'>Scale Up Receipt</field>
<field name='type'>alias</field>
<field name='pattern'>WH-RECEIPTS</field>
<field name='alias'>WHIN</field>
<field name='barcode_nomenclature_id' ref='barcodes.default_barcode_nomenclature'/>
<field name='sequence'>0</field>
</record>
```
**Root cause: -**
- At [1], the records use the ref of `default_barcode_nomenclature` which is defined in barcode module. So, when the ref is deleted and we are trying to use it then it gives error.
**Solution: -**
- This commit resolves the error by prevent the deletion of `default nomenclature`.
[1]: https://github.com/odoo/enterprise/blob/400171c9cebc46ecdd907ada210c65f3bbd2dd66/stock_barcode/data/data.xml#L40-L71
**sentry-6823596992**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#226594Timesheet users can now edit the Time Spent value in list view and move focus away without the field reverting to the previous value. This prevents confusion and helps ensure newly entered or adjusted time remains visible before saving.
Original PR description
Steps to reproduce: ----------------- 1. Go to Timesheet → My Timesheet → List View → New OR Edit already filled time. 2. Change time in the Time Spent field. 3. Press Shift + Tab. Observation:…
Steps to reproduce: ----------------- 1. Go to Timesheet → My Timesheet → List View → New OR Edit already filled time. 2. Change time in the Time Spent field. 3. Press Shift + Tab. Observation: ----------------- The focus changes, but the Time Spent field reverts to its old value instead of keeping the newly entered one. Issue: ----------------- - For new records, the component retrieves the value only from the state, which is updated in the `onWillUpdateProps` lifecycle. This lifecycle triggers only on saving or editing, not when simply changing focus. https://github.com/odoo/enterprise/blob/e14b991927df14f41535e92dd01ea2ecac44a404/timesheet_grid/static/src/components/timesheet_display_timer/timesheet_display_timer.js#L123-L128 - The same behavior occurs when editing existing records, leading to incorrect value display. https://github.com/odoo/enterprise/blob/e14b991927df14f41535e92dd01ea2ecac44a404/timesheet_grid/static/src/components/timesheet_display_timer/timesheet_display_timer.js#L31-L33 Solution: ----------------- - For new records, since the default value is 0, the fix makes the component fall back to the updated record value if the state value is not yet available. - For existing records, if the timer is running, the timer’s value is displayed. otherwise, the component falls back to the updated record value. opw-4922847 Forward-Port-Of: odoo/enterprise#95141 Forward-Port-Of: odoo/enterprise#94729
Credit notes for Mexico’s general public tax regime now keep the selected “Returns, discounts or bonuses” usage when allowed by current SAT rules. This prevents XML documents from being generated with the wrong usage value, helping businesses issue compliant credit notes without manual correction.
Original PR description
**Steps to reproduce:** 1. Install `l10n_mx` and `l10n_mx_edi`. 2. Create an invoice with: * Enable *CFDI to Public*. * Confirm, then send to SAT. 3. Create a credit note with: * *Usage* = `Returns,…
**Steps to reproduce:** 1. Install `l10n_mx` and `l10n_mx_edi`. 2. Create an invoice with: * Enable *CFDI to Public*. * Confirm, then send to SAT. 3. Create a credit note with: * *Usage* = `Returns, discounts or bonuses` (G02). 4. Download the generated XML for the credit note. **Observed behavior:** - The `<UsoCFDI>` tag in the XML shows `S01` (No fiscal effects). **Expected behavior:** - The `<UsoCFDI>` tag should show `G02` for credit notes under regime 616 when explicitly selected. **Root cause:** - For regime 616 (`Público en general`), the code always defaults to `S01`. - The condition only allowed `G02` when refunding a global invoice (`is_refund_gi`), not for normal credit notes. **Solution:** - Allow `G02` usage to be preserved for credit notes (tipo_de_comprobante = 'E') even when `CFDI to public` is active, as this is now permitted by SAT regulations for fiscal regime 616. **ref:** http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI_V_4_20250820.xls opw-5012917 Forward-Port-Of: odoo/enterprise#93071
Field service sales orders with zero-priced service lines now correctly show as invoiced after the related invoice is created and posted. This prevents orders from remaining incorrectly marked as needing invoicing, reducing confusion during billing follow-up.
Original PR description
Steps: - Install sale and fsm module. - Enable anglo-saxon from the setting. - Create a service type product with fsm project as template. - Select that product on SO and set unit price to 0 on SOL. - Confirm that order and create and post invoice. Issue: - Sale order status still shows `To invoice` even though we create SOL related invoice. Cause: - In [PR] we made invoice status for anglo-saxon line `To Invoice` so it always say `To Invoice` even user create related invoice. Fix: - Make those lines `Invoiced` if there is related invoice by checking qty_invoiced is greater or equal to qty. [PR]: https://github.com/odoo/enterprise/pull/70132 opw-5055540 Forward-Port-Of: odoo/enterprise#94723
This change fixes an access problem in the self-ordering feature that could block public users from completing expected actions. It helps keep the customer ordering flow reliable without requiring unnecessary sign-in or extra permissions.
Original PR description
bypass Public user ACLs. build_error-231606
Sendcloud shipments can now include longer customs classification codes, matching the carrier API limit. This helps avoid customs delays for affected international parcels, especially shipments to the US.
Original PR description
**PROBLEM** We limit the `hs_code` length to 8 characters, but if we refer to the [sendcloud v2 api doc](https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/parcels/schemas/parcel-item), we see that `hs_code` length can be up to 12 characters. Some clients have issue with parcels being held longer in custom when sending them to the US. [opw-5051585](https://www.odoo.com/odoo/project/49/tasks/5051585) Forward-Port-Of: odoo/enterprise#94894
Field service tasks now create sales orders using the product's currency when calculating line prices. This ensures prices are converted correctly when the product and sales order use different currencies, preventing incorrect billing amounts.
Original PR description
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any…
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any employee and any service. - Return to the task and in the Timesheets tab, add a new timesheet. - Click the Mark as done button. - Click the Sales order button. ### Cause: When creating the sale order out of the fsm task we use _get_tax_included_unit_price to get the price of the SO line but we are passing the order currency twice to this method so it doesn't convert the price as when it checks the currency and the product_currency it found they are the same so no need to convert https://github.com/odoo/odoo/blob/6653355b8bc063ceadf08af17fbf2c4a250553e6/addons/account/models/product.py#L239-L240 ### Fix: We pass the product currency instead of the order currency in order to be able to convert the price according to the currencies opw-5045071 Forward-Port-Of: odoo/enterprise#95134 Forward-Port-Of: odoo/enterprise#94947
This fixes missing timesheet entries when public holidays are deleted or their work calendar changes after employee leave has already been approved. Businesses get more reliable time tracking and fewer manual corrections around holiday and leave overlaps.
Original PR description
…ay change **Steps to reproduce** - Create a public holiday without a calendar during a work day. - Create a leave for an employee overlapping the public holiday for a time off type generating…
…ay change **Steps to reproduce** - Create a public holiday without a calendar during a work day. - Create a leave for an employee overlapping the public holiday for a time off type generating Timesheets. Validate it. - Expected: on the day of the public holiday, no timesheet is generated for the `hr.leave` to avoid duplication. - Either delete the public holiday, or set a calendar on it different than the one defined on the employee. - Issue: the public holiday timesheet has been deleted, but its deletion should've lead to the creation of the `hr.leave` timesheet that we didn't create at the time the public holiday existed. - Second issue: after that, change the calendar of the public holiday to the same as the employee's. Still a missing timesheet. **Solution** We can use `_reevaluate_leaves` to find the leaves affected by changes in public holidays. `_generate_timesheets` then re-generates the timesheets as if the leave was just validated (the call to `list_work_time_per_day` ignores the already present resource.calendar.leave). We also check missing public holidays timesheets to fix the second issue. opw-4819697 Forward-Port-Of: odoo/odoo#225066 Forward-Port-Of: odoo/odoo#216901
This fix stops users from editing the amount in currency on posted journal items where it could leave invoices with inconsistent totals and related analytic data. The field is now only editable for tax lines while the entry is still in draft, helping preserve accurate accounting records.
Original PR description
- Create an invoice with some products and post it - Go to Accounting > Journal items and ser for the ones belonging to the invoice. - Set the checkbox for the product sales one and set whatever tax…
- Create an invoice with some products and post it - Go to Accounting > Journal items and ser for the ones belonging to the invoice. - Set the checkbox for the product sales one and set whatever tax grid (you'll have to reveal that column). - Accept the changes. - Now go back to the invoice. - You'll see a new tracking message. Something like Journal Item #1093 updated - It contains a link and from that link you can go to the journal item form. - In that form you can edit the *amount in currency* field. Issue: - If a user do so, it leaves inconsistent invoice amounts: totals aren't recomputed, analytic lines aren't recomputed either. How it should behave: - Amount in currency shouldn't be editable here. Mainly when the journal entry is already posted! opw-4951629 A vídeo showing the issue: 📹️ https://www.loom.com/share/f7cd1d8f4138458f9b6c190233b0b9df?sid=eec77c17-a4a6-4698-8604-10aaa7e33f47 MT-10887 cc @moduon --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225346 Forward-Port-Of: odoo/odoo#223187
Invoice imports now avoid linking lines to unrelated products when the item name is very short, such as “-” or “a”. This reduces incorrect product assignments on imported accounting documents and improves data accuracy.
Original PR description
hen resolving a product in _retrieve_product, the code searched by barcode, default_code, and then by name using both exact and ilike domains. For very short item names coming from imports (e.g., “-”, “A-1”, “0001”), the ilike fallback could match unrelated products whose names merely contain that short string. this led to incorrect product linkage on created documents (e.g., EDI-imported invoices). discussed with: Christophe (chkl) Steps to reproudce: Accounting -> Invoices upload an XML with a product name liek `-` or `a` See the product attched to the invoice line. opw-5003482 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225143
Odoo now avoids crashing when printing PDF quotations for multiple sales orders if one of the selected orders cannot generate a valid PDF. Incomplete or problematic orders are skipped so users can continue producing quotations for the rest of the selection.
Original PR description
Description of the issue/feature this PR addresses: This PR addresses a KeyError that occurs when attempting to generate a PDF quotation for multiple sales orders at once in Odoo. The issue arises…
Description of the issue/feature this PR addresses: This PR addresses a KeyError that occurs when attempting to generate a PDF quotation for multiple sales orders at once in Odoo. The issue arises when one or more selected orders do not have a valid PDF stream (e.g., due to missing data like order lines or incorrect templates). The error occurs because the system tries to access result[order.id]['stream'] for a sales order that doesn't have the stream generated, causing the server to fail. Current behavior before PR: Before this PR, when attempting to print the quotation for multiple sales orders, the system will throw a KeyError if any of the selected orders do not have a valid PDF stream generated. This can happen if a sales order is missing data (such as products or a client) or has an incomplete quotation template. The error prevents users from generating quotations for a group of sales orders, even if only one order is missing the necessary data. Desired behavior after PR is merged: After merging this PR, the system will check if the PDF stream exists before attempting to access it. If a sales order does not have a valid stream (due to missing data or other issues), it will be skipped without causing a server error. This allows users to print multiple quotations at once without the system failing due to one incomplete order. The feature will improve robustness when handling orders with missing or incomplete data and prevent unexpected crashes. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227517 Forward-Port-Of: odoo/odoo#227347
This change prevents public website visitors using older Safari versions from seeing a crash when pages load. It adds browser compatibility support needed for translation caching, improving reliability for affected users without changing normal functionality.
Original PR description
Safari < 17 (09/2023) doesn't support Set.difference. This function is used in our indexeddb wrapper, which runs also in the frontend, even for public (non logged-in) users, to fetch and cache translations. As a consequence, those people have a crash at each page launch. Safari 17 being recent enough for public users, we add a polyfill (for frontend only). 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
The point of sale payment screen now correctly keeps the Validate button disabled on mobile when no payment method has been selected. This prevents cashiers from accidentally proceeding with incomplete payments and improves checkout reliability on mobile devices.
Original PR description
- Fix issue where the `Validate` button (in the payment screen) was not correctly disabled on mobile devices when no payment methods was selected. community PR: https://github.com/odoo/odoo/pull/225917 task-id: 5072759 Forward-Port-Of: odoo/enterprise#94132 Forward-Port-Of: odoo/enterprise#94100
Brazilian service invoices using AvaTax now send installment amounts without tax values, preventing mismatches that could cause invoice rejection. This improves reliability when processing service invoices with installment payments.
Original PR description
Service invoices require us to send installments without taxes. If we include taxes we get an error: **Errors**: Rejection: Total Installments doesn’t match Total Lines ∑ installments[m]grossValue - ∑ (lines[n].lineAmount-line[n].lineTaxedDiscount) <> 0 This **PR** clears taxes before tax calculation to ensure the installments we send are correct. **task**-4761630 Forward-Port-Of: odoo/enterprise#95244 Forward-Port-Of: odoo/enterprise#85108
Large online stores can now generate product sitemaps without exhausting server memory. This helps prevent crashes caused by search engine crawlers repeatedly requesting sitemaps for very large catalogs.
Original PR description
### Issue Server crashes with MemoryErrors when a database has a large product catalogs. ### Solution This commit disables the prefetcher to avoid MemoryErrors when generating the sitemap for large product catalogs as web crawlers would continously crash the server when requesting the sitemap. ### References opw-5001680 opw-4955333 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223054
7 changes
Resolved issues and error corrections
Fixed an issue that blocked invoice creation when multiple Point of Sale orders for the same customer were selected in a Mexican company. This prevents an error during batch invoicing and helps staff complete sales administration without manual workarounds.
Original PR description
Currently, an error is raised when generating an invoice for multiple POS orders created for the same customer in a Mexican location. **Steps to reproduce:** - Install `l10n_mx_edi_pos` module. -…
Currently, an error is raised when generating an invoice for multiple POS orders created for the same customer in a Mexican location. **Steps to reproduce:** - Install `l10n_mx_edi_pos` module. - Switch the company to a **Mexican** company. - Create two POS orders for the same customer (ensure Invoice is disabled on the payment screen). - Without closing the POS session, go to the backend and navigate to Orders. - Select both orders and click **"Create Invoice"**. **Error:** `ValueError - Expected singleton: pos.order(5, 4)` **Cause:** The method `_prepare_invoice_vals()` accesses fields on `self`, assuming a single record. However, during batch invoicing, `self` can be multiple `pos.order` records. - [1] [1] - https://github.com/odoo/enterprise/blob/6e0396b078e7c6ffc98eef5a0d21a7df80651c19/l10n_mx_edi_pos/models/pos_order.py#L130-L135 **Fix:** Ensure the method only accesses fields on the first record, which prevents the singleton error during multi-record processing. sentry-6563854524
Sales orders for field service products with zero-priced lines now show the correct invoicing status after an invoice is created. This prevents orders from incorrectly appearing as still needing invoicing, reducing confusion for sales and accounting teams.
Original PR description
Steps: - Install sale and fsm module. - Enable anglo-saxon from the setting. - Create a service type product with fsm project as template. - Select that product on SO and set unit price to 0 on SOL. - Confirm that order and create and post invoice. Issue: - Sale order status still shows `To invoice` even though we create SOL related invoice. Cause: - In [PR] we made invoice status for anglo-saxon line `To Invoice` so it always say `To Invoice` even user create related invoice. Fix: - Make those lines `Invoiced` if there is related invoice by checking qty_invoiced is greater or equal to qty. [PR]: https://github.com/odoo/enterprise/pull/70132 opw-5055540 Forward-Port-Of: odoo/enterprise#94723
Credit notes for Mexico's public customer tax regime now keep the selected returns/discounts usage instead of being changed to no fiscal effects. This helps businesses generate compliant electronic invoice XML when issuing refunds or discounts under updated SAT rules.
Original PR description
**Steps to reproduce:** 1. Install `l10n_mx` and `l10n_mx_edi`. 2. Create an invoice with: * Enable *CFDI to Public*. * Confirm, then send to SAT. 3. Create a credit note with: * *Usage* = `Returns,…
**Steps to reproduce:** 1. Install `l10n_mx` and `l10n_mx_edi`. 2. Create an invoice with: * Enable *CFDI to Public*. * Confirm, then send to SAT. 3. Create a credit note with: * *Usage* = `Returns, discounts or bonuses` (G02). 4. Download the generated XML for the credit note. **Observed behavior:** - The `<UsoCFDI>` tag in the XML shows `S01` (No fiscal effects). **Expected behavior:** - The `<UsoCFDI>` tag should show `G02` for credit notes under regime 616 when explicitly selected. **Root cause:** - For regime 616 (`Público en general`), the code always defaults to `S01`. - The condition only allowed `G02` when refunding a global invoice (`is_refund_gi`), not for normal credit notes. **Solution:** - Allow `G02` usage to be preserved for credit notes (tipo_de_comprobante = 'E') even when `CFDI to public` is active, as this is now permitted by SAT regulations for fiscal regime 616. **ref:** http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI_V_4_20250820.xls opw-5012917 Forward-Port-Of: odoo/enterprise#93071
Brazilian service invoices with payment installments will now be sent to AvaTax without taxes included in the installment values. This prevents invoice rejection errors caused by mismatches between installment totals and line totals.
Original PR description
Service invoices require us to send installments without taxes. If we include taxes we get an error: **Errors**: Rejection: Total Installments doesn’t match Total Lines ∑ installments[m]grossValue - ∑ (lines[n].lineAmount-line[n].lineTaxedDiscount) <> 0 This **PR** clears taxes before tax calculation to ensure the installments we send are correct. **task**-4761630 Forward-Port-Of: odoo/enterprise#85108
Sendcloud delivery shipments can now use customs HS codes up to 12 characters, matching Sendcloud's API requirements. This helps avoid delays for international parcels, especially shipments to the US that may be held in customs when codes are incomplete.
Original PR description
**PROBLEM** We limit the `hs_code` length to 8 characters, but if we refer to the [sendcloud v2 api doc](https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/parcels/schemas/parcel-item), we see that `hs_code` length can be up to 12 characters. Some clients have issue with parcels being held longer in custom when sending them to the US. [opw-5051585](https://www.odoo.com/odoo/project/49/tasks/5051585) Forward-Port-Of: odoo/enterprise#94894
Field Service sales orders now calculate service line prices using the product's currency before converting to the order currency. This prevents incorrect prices when products and customers use different currencies, improving invoice accuracy.
Original PR description
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any…
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any employee and any service. - Return to the task and in the Timesheets tab, add a new timesheet. - Click the Mark as done button. - Click the Sales order button. ### Cause: When creating the sale order out of the fsm task we use _get_tax_included_unit_price to get the price of the SO line but we are passing the order currency twice to this method so it doesn't convert the price as when it checks the currency and the product_currency it found they are the same so no need to convert https://github.com/odoo/odoo/blob/6653355b8bc063ceadf08af17fbf2c4a250553e6/addons/account/models/product.py#L239-L240 ### Fix: We pass the product currency instead of the order currency in order to be able to convert the price according to the currencies opw-5045071 Forward-Port-Of: odoo/enterprise#95134 Forward-Port-Of: odoo/enterprise#94947
Tax return closing entry reports now show the selected reporting month instead of the month when the closing entry is posted. This prevents incorrect PDF and XML report labels, helping businesses file and review tax returns with the right period information.
Original PR description
**Issue** When posting a closing entry in September on a tax return report for the month of August, the generated report (PDF/XML) incorrectly shows September instead of August. **Steps to…
**Issue** When posting a closing entry in September on a tax return report for the month of August, the generated report (PDF/XML) incorrectly shows September instead of August. **Steps to Reproduce** 1. Install Belgian localization. 2. Go to Accounting > Reporting > Tax Return. 3. Select August as the reporting period. 4. Post the Closing Entry. 5. The report shows September as the month instead of August. **Root Cause** The logic in `_init_options_date` was changed in PR #89290 mutating the `options['date']['filter']` by replacing `"tax_period"` with a resolved period type (e.g., `"month"`). As a result, the `"month"` branch was triggered later in the code, recomputing `date_from` and `date_to` based on the current date instead of the selected tax period boundaries. **Fix** Keep the `options['date']['filter']` unchanged (e.g., `"custom_tax_period"`). Use `period_type` field to indicate whether the tax period represents a month, quarter, or year. Opw-5073081 Forward-Port-Of: odoo/enterprise#94322
1 change
Resolved issues and error corrections
Planning now blocks shift templates that span an excessive number of days before they can be used. This prevents employees from encountering an error when creating shifts from templates and gives users clearer feedback instead.
Original PR description
Currently, An error occurs when the employee adds a working 'Shift' in the resource calendar using a planning template that has too many span days. Step to produce: - Install the `planning` module. - Go to Planning / Configuration / Shift Templates, and Create a template that span day is more than 1000. - Create a 'Shift' in 'My Planning', Add an administrator as 'Resource,' and click on the 'Shift Templates'. `AttributeError: 'bool' object has no attribute 'replace'` The issue occurs because the system attempts to replace an hour and minute with end time at [1], But end time is False(boolean) as the 'plan_days' method returns a False value due to the excessive span days in the template. Link [1]: https://github.com/odoo/enterprise/blob/fd94c8bbe8f75540681f3b85ebf8d9767cf30f2a/planning/models/planning.py#L636 To resolve this, raise a validation error if the user tries to create a shift template with an excessive span days. Sentry-6190026432
1 change
Resolved issues and error corrections
This fix reduces excessive database checkpoints created during failed imports, preventing severe slowdowns or freezes in busy transactions. It also improves related accounting partner update processing and adds monitoring warnings before the risky database limit is reached.
Original PR description
Global Issue ----- Each time a save point is created inside a transaction, it creates a substransaction with its own subxid. As said in the documentation "The more subtransactions each transaction…
Global Issue
-----
Each time a save point is created inside a transaction, it creates a
substransaction with its own subxid. As said in the documentation
"The more subtransactions each transaction keeps open (not rolled back or released),
the greater the transaction management overhead. Up to 64 open subxids are cached in shared memory for each backend;
after that point, the storage I/O overhead increases significantly due to additional lookups of subxid entries in pg_subtrans."
https://www.postgresql.org/docs/current/subxacts.html
When the 64 is reach, it causes a huge I/O overhead (waiting for subtrans LRU) on every
transaction and lead to a complete freeze until the transaction that
create that many savepoints is killed.
Problem 1
---------
This amount of save point is reach during an import that eventually
failed. It retries with one savepoint per record. After 10 errors, the
import stops but if those error happen after few hundred correct line.
Hundreds of save point are created with their respective sub transaction
id.
Solution: We only create one savepoint when the import retries for
every record and rollback each time the import face an error.
As consequence, if record depends on previous one imported before the
rollback, some phantom error will appear and if some record sould be in
error due to previous record (unique constraint for ie.) some error can
be missed. Anyway the first error will remain correct.
In addition, in this PR we want to monitor the number of savepoint per
transaction and fire a warning with the stack info when the limit of 60 savepoint per
transaction is reached.
In order to monitor properly all the savepoint, we need to convert the
last cr.execute("SAVEPOINT") to the context manager
Problem 2
---------
Increase rank is call during _post once per partner.
Since https://github.com/odoo/odoo/commit/f12ce318020169b1355538066a8f81f78ecbf007
_do_action_change_account trigger the increase the rank of many partner
in one transaction.
By grouping the call of increase rank by count it reduce drastically the
amount of call to increase_rank and thus the number of savepoint11 changes
Enhancements to existing features
Businesses using international bpost shipping methods can now request bpack World Easy Retour return labels. This makes cross-border returns easier to manage and improves the customer return experience for international orders.
Original PR description
This ensures you can request 'bpack World Easy Retour' labels when using international bpost shipping methods. This PR is based on feedback from a PR I did on base 16.0 branch: https://github.com/odoo/enterprise/pull/58836.
Indian payroll now includes account mappings for selected salary rules. This helps payroll-related accounting entries flow into the correct accounts, reducing manual setup and improving financial reporting consistency.
Original PR description
In this commit, Include chart of account for some of salary rules of Indian payroll. task-4929815
Document breadcrumbs now reflect the views users previously opened when moving into folders, making it easier to return to where they came from. The add link document wizard also no longer lets users open the folder directly, aligning it with the request document flow.
Original PR description
When navigating to a folder using the folder many2one widget, instead of using the folder parents hierarchy as breadcrumbs, using the previously opened views so that users can easily go back. Like for the "request document" wizard, removing the possibility to open the folder from the "add link" document wizard. Task-4298814
Resolved issues and error corrections
Fixed an issue in the Spanish SME balance sheet where some payable accounts could be counted twice. This ensures the reported liabilities match the underlying accounting data and avoids overstated balances.
Original PR description
In **`balance_pymes_line_32300`** (`CURRENT LIABILITIES > Current payables > Other current payables`), amounts are **doubled** because account **551** is included twice. * **Formula using…
In **`balance_pymes_line_32300`** (`CURRENT LIABILITIES > Current payables > Other current payables`), amounts are **doubled** because account **551** is included twice.
* **Formula using `account_codes`:**
```xml <field name="formula">-1034 - 1044 - 190 - 192 - 194 - 500 - 501 - 505 ...551 - 5566 - 5595 - 5598 - 560 - 561 - 569</field> ```
→ Explicitly includes account **551**.
* **Formula using `domain`:**
```xml <field name="formula" eval="['|', ('account_id.code','=like','550%'), '|', ('account_id.code','=like','551%'), '|', ('account_id.code','=like','554%'), ('account_id.code','=like','5525%')]"/> ```
→ Includes **all accounts starting with 551**, so **551** is also counted here.
This overlap causes the balance to be counted twice, inflating the reported value.
**steps to reproduce:**
1. With a Spanish company, go to **Accounting > Dashboard > Bank > Transaction > New**.
2. Select an account, search for **55100**, and add it.
3. Go to **Reporting > Balance Sheet > Other current payables**.
4. Notice that the reported amount is **double** the actual accounting data.
Overlapping formulas: specific account `551` and `5525` are counted in `account_codes`, while the `domain` formula already includes `551%`, leading to duplication.
**Fix**
Remove explicit account codes from `account_codes` if they are already covered by the `domain` prefixes to avoid double-counting. and also made sure to correct the same issue in the whole report.
opw-5075035
Forward-Port-Of: odoo/enterprise#94494Field service sales orders with zero-priced service lines now show as invoiced once the related invoice has been created. This prevents completed invoicing from incorrectly appearing as still needing invoicing, improving clarity for users managing field service sales.
Original PR description
Steps: - Install sale and fsm module. - Enable anglo-saxon from the setting. - Create a service type product with fsm project as template. - Select that product on SO and set unit price to 0 on SOL. - Confirm that order and create and post invoice. Issue: - Sale order status still shows `To invoice` even though we create SOL related invoice. Cause: - In [PR] we made invoice status for anglo-saxon line `To Invoice` so it always say `To Invoice` even user create related invoice. Fix: - Make those lines `Invoiced` if there is related invoice by checking qty_invoiced is greater or equal to qty. [PR]: https://github.com/odoo/enterprise/pull/70132 opw-5055540 Forward-Port-Of: odoo/enterprise#94723
Tax return company data validation can now complete even when the logged-in user has no email address configured. The system still records the update in the activity log, preventing unnecessary interruptions for users.
Original PR description
Before Fix: When validating failed `company data` check in the Tax Return Kanban, the system attempted to log an update in the chatter. However, if the logged-in user did not have an email address configured, the action failed with the error: 'Unable to send message, please configure the sender's email address.' After Fix: The logging now runs in superuser mode. This ensures that updates are always posted in the chatter, regardless of whether the user has an email address set. Explanation: This change guarantees that important updates are consistently tracked in the chatter without interruption. Previously, users without an email address could not complete the validation, even though no actual email needed to be sent, the system only needed to record the change. By switching to superuser mode, we align with intended behavior: the system does not crash due to no email. task-5014717
Sendcloud deliveries can now send customs product codes up to 12 characters, matching Sendcloud's current requirements. This helps reduce the risk of parcels, especially shipments to the US, being delayed in customs due to truncated or incomplete codes.
Original PR description
**PROBLEM** We limit the `hs_code` length to 8 characters, but if we refer to the [sendcloud v2 api doc](https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/parcels/schemas/parcel-item), we see that `hs_code` length can be up to 12 characters. Some clients have issue with parcels being held longer in custom when sending them to the US. [opw-5051585](https://www.odoo.com/odoo/project/49/tasks/5051585) Forward-Port-Of: odoo/enterprise#94894
Field Service sales orders created from completed tasks now use the product’s currency when calculating line prices. This prevents incorrect pricing when the sales order and product use different currencies, helping invoices reflect the right converted amounts.
Original PR description
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any…
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any employee and any service. - Return to the task and in the Timesheets tab, add a new timesheet. - Click the Mark as done button. - Click the Sales order button. ### Cause: When creating the sale order out of the fsm task we use _get_tax_included_unit_price to get the price of the SO line but we are passing the order currency twice to this method so it doesn't convert the price as when it checks the currency and the product_currency it found they are the same so no need to convert https://github.com/odoo/odoo/blob/6653355b8bc063ceadf08af17fbf2c4a250553e6/addons/account/models/product.py#L239-L240 ### Fix: We pass the product currency instead of the order currency in order to be able to convert the price according to the currencies opw-5045071 Forward-Port-Of: odoo/enterprise#95134 Forward-Port-Of: odoo/enterprise#94947
Rental orders that are returned late now correctly include the extra delay fee. This prevents missed charges when rental delays are measured in hours, helping keep customer billing accurate.
Original PR description
In [^1], during a small refactor of the `sale.order.is_late` method to only account for logistic delays rather than rental delays, the rental extra delay margin computation was moved to the `sale.order.line._generate_delay_line` method. However, the computation used the utility class `relativedelta` instead of `timedelta`, which transformed the final rental duration into a `relativedelta` object. This object internally stores second durations differently than a `timedelta`. While `timedelta` stores durations as `days` and remaining `seconds`, `relativedelta` splits the information into `days`, `hours`, `minutes`, etc. Since rental orders only account for hours, the `seconds` field was null, resulting in no extra delay fee being added to the order upon return. This commit fixes the issue by using `timedelta` as expected. [^1]: https://github.com/odoo/enterprise/pull/88689 Forward-Port-Of: odoo/enterprise#95116
This fixes an issue where edited time values in the Timesheet list view could revert when users moved focus with Shift + Tab. The entered time now stays visible for both new and existing timesheet lines, helping prevent confusion and inaccurate time entry.
Original PR description
Steps to reproduce: ----------------- 1. Go to Timesheet → My Timesheet → List View → New OR Edit already filled time. 2. Change time in the Time Spent field. 3. Press Shift + Tab. Observation:…
Steps to reproduce: ----------------- 1. Go to Timesheet → My Timesheet → List View → New OR Edit already filled time. 2. Change time in the Time Spent field. 3. Press Shift + Tab. Observation: ----------------- The focus changes, but the Time Spent field reverts to its old value instead of keeping the newly entered one. Issue: ----------------- - For new records, the component retrieves the value only from the state, which is updated in the `onWillUpdateProps` lifecycle. This lifecycle triggers only on saving or editing, not when simply changing focus. https://github.com/odoo/enterprise/blob/e14b991927df14f41535e92dd01ea2ecac44a404/timesheet_grid/static/src/components/timesheet_display_timer/timesheet_display_timer.js#L123-L128 - The same behavior occurs when editing existing records, leading to incorrect value display. https://github.com/odoo/enterprise/blob/e14b991927df14f41535e92dd01ea2ecac44a404/timesheet_grid/static/src/components/timesheet_display_timer/timesheet_display_timer.js#L31-L33 Solution: ----------------- - For new records, since the default value is 0, the fix makes the component fall back to the updated record value if the state value is not yet available. - For existing records, if the timer is running, the timer’s value is displayed. otherwise, the component falls back to the updated record value. opw-4922847 Forward-Port-Of: odoo/enterprise#95229 Forward-Port-Of: odoo/enterprise#94729
Credit notes for Mexico's public customer regime now keep the selected "Returns, discounts or bonuses" usage when allowed by SAT rules. This prevents generated tax XML from incorrectly switching to "No fiscal effects," helping businesses issue compliant credit notes.
Original PR description
**Steps to reproduce:** 1. Install `l10n_mx` and `l10n_mx_edi`. 2. Create an invoice with: * Enable *CFDI to Public*. * Confirm, then send to SAT. 3. Create a credit note with: * *Usage* = `Returns,…
**Steps to reproduce:** 1. Install `l10n_mx` and `l10n_mx_edi`. 2. Create an invoice with: * Enable *CFDI to Public*. * Confirm, then send to SAT. 3. Create a credit note with: * *Usage* = `Returns, discounts or bonuses` (G02). 4. Download the generated XML for the credit note. **Observed behavior:** - The `<UsoCFDI>` tag in the XML shows `S01` (No fiscal effects). **Expected behavior:** - The `<UsoCFDI>` tag should show `G02` for credit notes under regime 616 when explicitly selected. **Root cause:** - For regime 616 (`Público en general`), the code always defaults to `S01`. - The condition only allowed `G02` when refunding a global invoice (`is_refund_gi`), not for normal credit notes. **Solution:** - Allow `G02` usage to be preserved for credit notes (tipo_de_comprobante = 'E') even when `CFDI to public` is active, as this is now permitted by SAT regulations for fiscal regime 616. **ref:** http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI_V_4_20250820.xls opw-5012917 Forward-Port-Of: odoo/enterprise#95246 Forward-Port-Of: odoo/enterprise#93071
21 changes
New functionality added to Odoo
Point of Sale now supports using iMin printers for receipt printing. This helps businesses using iMin hardware print customer receipts directly from Odoo, though kitchen printing is not supported yet.
Original PR description
This module enables the use of iMin printers in the Point of Sale. Note: Currently, iMin printers are only supported as receipt printers and cannot be used as kitchen printers. task-5018605
Enhancements to existing features
The website generator now handles the updated eCommerce building blocks introduced in Odoo 19.0. This keeps generated websites compatible with the latest version and avoids issues caused by older scraping logic.
Original PR description
Corresponding IAP PR: https://github.com/odoo/iap-apps/pull/1196
Resolved issues and error corrections
The Spanish SME balance sheet report now avoids counting the same payable accounts twice. This ensures the “Other current payables” total reflects the real accounting balance, improving accuracy for financial reporting.
Original PR description
In **`balance_pymes_line_32300`** (`CURRENT LIABILITIES > Current payables > Other current payables`), amounts are **doubled** because account **551** is included twice. * **Formula using…
In **`balance_pymes_line_32300`** (`CURRENT LIABILITIES > Current payables > Other current payables`), amounts are **doubled** because account **551** is included twice.
* **Formula using `account_codes`:**
```xml <field name="formula">-1034 - 1044 - 190 - 192 - 194 - 500 - 501 - 505 ...551 - 5566 - 5595 - 5598 - 560 - 561 - 569</field> ```
→ Explicitly includes account **551**.
* **Formula using `domain`:**
```xml <field name="formula" eval="['|', ('account_id.code','=like','550%'), '|', ('account_id.code','=like','551%'), '|', ('account_id.code','=like','554%'), ('account_id.code','=like','5525%')]"/> ```
→ Includes **all accounts starting with 551**, so **551** is also counted here.
This overlap causes the balance to be counted twice, inflating the reported value.
**steps to reproduce:**
1. With a Spanish company, go to **Accounting > Dashboard > Bank > Transaction > New**.
2. Select an account, search for **55100**, and add it.
3. Go to **Reporting > Balance Sheet > Other current payables**.
4. Notice that the reported amount is **double** the actual accounting data.
Overlapping formulas: specific account `551` and `5525` are counted in `account_codes`, while the `domain` formula already includes `551%`, leading to duplication.
**Fix**
Remove explicit account codes from `account_codes` if they are already covered by the `domain` prefixes to avoid double-counting. and also made sure to correct the same issue in the whole report.
opw-5075035
Forward-Port-Of: odoo/enterprise#94494This fix prevents users from deleting the default barcode setup that other barcode features depend on. It avoids crashes when re-enabling barcode scanner settings, keeping inventory barcode configuration stable.
Original PR description
The system will crash with error when user tries to enable barcode scanner in settings. **Steps to produce: -** - Install `Inventory` module. - `Inventory > configuration > products > Barcode…
The system will crash with error when user tries to enable barcode scanner in settings.
**Steps to produce: -**
- Install `Inventory` module.
- `Inventory > configuration > products > Barcode Nomenclatures`.
- Delete the `Default Nomenclature` record.
- Go to settings uncheck `Barcode Scanner` and save settings.
- Now, again `enable` that and save.
Error: -
```py
ValueError: External ID not found in the system: barcodes.default_barcode_nomenclature
ParseError: while parsing /home/odoo/src/enterprise/saas-18.4/stock_barcode/data/data.xml:40, somewhere inside <record id='scale_up_alias_1' model='barcode.rule'>
<field name='name'>Scale Up Receipt</field>
<field name='type'>alias</field>
<field name='pattern'>WH-RECEIPTS</field>
<field name='alias'>WHIN</field>
<field name='barcode_nomenclature_id' ref='barcodes.default_barcode_nomenclature'/>
<field name='sequence'>0</field>
</record>
```
**Root cause: -**
- At [1], the records use the ref of `default_barcode_nomenclature` which is defined in barcode module. So, when the ref is deleted and we are trying to use it then it gives error.
**Solution: -**
- This commit resolves the error by prevent the deletion of `default nomenclature`.
[1]: https://github.com/odoo/enterprise/blob/400171c9cebc46ecdd907ada210c65f3bbd2dd66/stock_barcode/data/data.xml#L40-L71
**sentry-6823596992**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#226594Field service sales orders with zero-priced service lines now correctly show as invoiced once the related invoice is created and posted. This prevents orders from incorrectly remaining marked as needing invoicing, giving teams a more accurate view of billing status.
Original PR description
Steps: - Install sale and fsm module. - Enable anglo-saxon from the setting. - Create a service type product with fsm project as template. - Select that product on SO and set unit price to 0 on SOL. - Confirm that order and create and post invoice. Issue: - Sale order status still shows `To invoice` even though we create SOL related invoice. Cause: - In [PR] we made invoice status for anglo-saxon line `To Invoice` so it always say `To Invoice` even user create related invoice. Fix: - Make those lines `Invoiced` if there is related invoice by checking qty_invoiced is greater or equal to qty. [PR]: https://github.com/odoo/enterprise/pull/70132 opw-5055540 Forward-Port-Of: odoo/enterprise#94723
Survey live session leaderboards now show score changes in a clearer sequence, so participants can better understand how points are added after each question. The leaderboard display size was also adjusted to prevent scores from appearing cramped or incorrect.
Original PR description
The way the score bars were animated was a bit confusing. We simplify the animation by: - Showing the score accumulated so far without the question - Animating the score bar towards the accumulated…
The way the score bars were animated was a bit confusing. We simplify the
animation by:
- Showing the score accumulated so far without the question
- Animating the score bar towards the accumulated score with the question
- Animating the numerical score on the left towards the accumulated score with the question while fading the numerical score increment on the bar ("+ x p")
- (reordering participants)
We also fix the size of the leaderboard as it was too small to display the score correctly.
How to reproduce
- Create a scored survey with time reward
- Add a question to get the name and toggle the nickname option
- Add a question with an answer that grants n points
- Start a live session
- After a user has completed the question
- Display the leaderboard
The score animation is confusion as it was going through:
- Showing the score accumulated so far without the question
- Animating towards 0: showing a minimal bar due to the minimum size of the score bar
- Animating towards the score question (on top of the minimal bar)
- And finally adding the score accumulated so far without the question
Task-4893763
Forward-Port-Of: odoo/odoo#224996Website form file upload fields now respect the configured maximum number of files. This lets visitors upload multiple files when allowed, while preventing invalid limits below one.
Original PR description
Steps to Reproduce: - Open the website module. - Drop a basic form snippet. - Change the field type of any field to 'File Upload'. - Set the `Max # of files` to any value greater than 1 and save the changes. - Attempt to upload more than one file. Observed Issue: Users are unable to upload more than one file. Before this commit: The `Max # of files` option available in the snippet settings had no effect. Even when set to more than one, the file input would only allow replacing the previously uploaded file, preventing users from adding multiple files. After this commit: The `Max # of files` setting now functions as intended. When the limit is set to more than one, users can select multiple files, up to the configured limit and within the maximum file size. If the limit is set to one, users can only upload a single file. task-4626847 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226219
Older Safari browsers could crash when public users opened pages because a browser feature needed for translation caching was missing. This change adds a frontend compatibility fallback so those visitors can load pages normally.
Original PR description
Safari < 17 (09/2023) doesn't support Set.difference. This function is used in our indexeddb wrapper, which runs also in the frontend, even for public (non logged-in) users, to fetch and cache translations. As a consequence, those people have a crash at each page launch. Safari 17 being recent enough for public users, we add a polyfill (for frontend only). 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 fix prevents users from editing the foreign currency amount on posted invoice journal items except where it is safe and intended. It helps keep invoice totals and related analytic accounting data consistent after an invoice has been posted.
Original PR description
- Create an invoice with some products and post it - Go to Accounting > Journal items and ser for the ones belonging to the invoice. - Set the checkbox for the product sales one and set whatever tax…
- Create an invoice with some products and post it - Go to Accounting > Journal items and ser for the ones belonging to the invoice. - Set the checkbox for the product sales one and set whatever tax grid (you'll have to reveal that column). - Accept the changes. - Now go back to the invoice. - You'll see a new tracking message. Something like Journal Item #1093 updated - It contains a link and from that link you can go to the journal item form. - In that form you can edit the *amount in currency* field. Issue: - If a user do so, it leaves inconsistent invoice amounts: totals aren't recomputed, analytic lines aren't recomputed either. How it should behave: - Amount in currency shouldn't be editable here. Mainly when the journal entry is already posted! opw-4951629 A vídeo showing the issue: 📹️ https://www.loom.com/share/f7cd1d8f4138458f9b6c190233b0b9df?sid=eec77c17-a4a6-4698-8604-10aaa7e33f47 MT-10887 cc @moduon --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225346 Forward-Port-Of: odoo/odoo#223187
Sendcloud shipment data now allows customs HS codes up to 12 characters, matching Sendcloud's current API limits. This helps avoid issues where parcels, especially shipments to the US, could be delayed in customs because longer valid codes were cut off or rejected.
Original PR description
**PROBLEM** We limit the `hs_code` length to 8 characters, but if we refer to the [sendcloud v2 api doc](https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/parcels/schemas/parcel-item), we see that `hs_code` length can be up to 12 characters. Some clients have issue with parcels being held longer in custom when sending them to the US. [opw-5051585](https://www.odoo.com/odoo/project/49/tasks/5051585) Forward-Port-Of: odoo/enterprise#94894
Timesheet entries in list view now keep the newly entered time when users move focus with Shift+Tab. This prevents confusion and avoids showing outdated time values while creating or editing timesheets.
Original PR description
Steps to reproduce: ----------------- 1. Go to Timesheet → My Timesheet → List View → New OR Edit already filled time. 2. Change time in the Time Spent field. 3. Press Shift + Tab. Observation:…
Steps to reproduce: ----------------- 1. Go to Timesheet → My Timesheet → List View → New OR Edit already filled time. 2. Change time in the Time Spent field. 3. Press Shift + Tab. Observation: ----------------- The focus changes, but the Time Spent field reverts to its old value instead of keeping the newly entered one. Issue: ----------------- - For new records, the component retrieves the value only from the state, which is updated in the `onWillUpdateProps` lifecycle. This lifecycle triggers only on saving or editing, not when simply changing focus. https://github.com/odoo/enterprise/blob/e14b991927df14f41535e92dd01ea2ecac44a404/timesheet_grid/static/src/components/timesheet_display_timer/timesheet_display_timer.js#L123-L128 - The same behavior occurs when editing existing records, leading to incorrect value display. https://github.com/odoo/enterprise/blob/e14b991927df14f41535e92dd01ea2ecac44a404/timesheet_grid/static/src/components/timesheet_display_timer/timesheet_display_timer.js#L31-L33 Solution: ----------------- - For new records, since the default value is 0, the fix makes the component fall back to the updated record value if the state value is not yet available. - For existing records, if the timer is running, the timer’s value is displayed. otherwise, the component falls back to the updated record value. opw-4922847 Forward-Port-Of: odoo/enterprise#95141 Forward-Port-Of: odoo/enterprise#94729
Field Service sale orders now calculate service line prices using the product's currency before converting to the customer's sales order currency. This prevents incorrect pricing when tasks generate sales orders involving products and orders in different currencies.
Original PR description
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any…
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any employee and any service. - Return to the task and in the Timesheets tab, add a new timesheet. - Click the Mark as done button. - Click the Sales order button. ### Cause: When creating the sale order out of the fsm task we use _get_tax_included_unit_price to get the price of the SO line but we are passing the order currency twice to this method so it doesn't convert the price as when it checks the currency and the product_currency it found they are the same so no need to convert https://github.com/odoo/odoo/blob/6653355b8bc063ceadf08af17fbf2c4a250553e6/addons/account/models/product.py#L239-L240 ### Fix: We pass the product currency instead of the order currency in order to be able to convert the price according to the currencies opw-5045071 Forward-Port-Of: odoo/enterprise#95134 Forward-Port-Of: odoo/enterprise#94947
Printing PDF quotations for multiple sales orders now handles incomplete orders more safely. If one selected order cannot generate a valid PDF, it is skipped instead of stopping the whole batch with an error, helping users complete bulk quotation printing more reliably.
Original PR description
Description of the issue/feature this PR addresses: This PR addresses a KeyError that occurs when attempting to generate a PDF quotation for multiple sales orders at once in Odoo. The issue arises…
Description of the issue/feature this PR addresses: This PR addresses a KeyError that occurs when attempting to generate a PDF quotation for multiple sales orders at once in Odoo. The issue arises when one or more selected orders do not have a valid PDF stream (e.g., due to missing data like order lines or incorrect templates). The error occurs because the system tries to access result[order.id]['stream'] for a sales order that doesn't have the stream generated, causing the server to fail. Current behavior before PR: Before this PR, when attempting to print the quotation for multiple sales orders, the system will throw a KeyError if any of the selected orders do not have a valid PDF stream generated. This can happen if a sales order is missing data (such as products or a client) or has an incomplete quotation template. The error prevents users from generating quotations for a group of sales orders, even if only one order is missing the necessary data. Desired behavior after PR is merged: After merging this PR, the system will check if the PDF stream exists before attempting to access it. If a sales order does not have a valid stream (due to missing data or other issues), it will be skipped without causing a server error. This allows users to print multiple quotations at once without the system failing due to one incomplete order. The feature will improve robustness when handling orders with missing or incomplete data and prevent unexpected crashes. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227517 Forward-Port-Of: odoo/odoo#227347
This fix prevents IoT boxes from getting stuck after a power loss or crash during an update checkout. It clears a leftover lock file before retrying, helping devices resume updates without manual intervention.
Original PR description
Before this commit, if the IoT box were to crash or lose power during a git checkout, it would then become stuck unable to checkout again due to the lockfile never being deleted. After this commit, we remove the lockfile if it exists to ensure we can't get stuck in this way. task-5059113 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226903
Fixed an issue where selection lists could show missing results after a user changed related information, such as switching a country in an address form. This ensures users see the correct suggestions without needing to refresh or retry.
Original PR description
Some web_name_search calls in Many2XAutocomplete were incorrectly cached. The cache key only took into account the latest empty search input, while ignoring changes in the domain or context of the search. As a result, changing the domain or context (e.g., selecting a country without states, then switching to USA) could lead to missing results — for instance, no states being suggested in the partner address form.
This fix ensures POS receipts are sent to the receipt printer configured for the point of sale, even when another IoT printer is also available. It prevents receipts from being accidentally printed on preparation printers, reducing operational confusion at checkout.
Original PR description
Steps to reproduce: 1. Configure a POS with a receipt printer and a preparation printer. 2. Ensure that the preparation printer has a higher ID than the receipt printer (you can force this by deleting it and letting the IoT redetect it.) 3. Try to print a receipt. EXPECTED: The receipt is printed on the configured receipt printer. ACTUAL: The receipt is printed on the prepation printer. This was caused by the hardware proxy code assuming that there will only be 1 printer `iot.device` model loaded, and that it will correspond to the receipt printer. The fix is to ensure the hardware proxy only chooses the printer that is configured as the receipt printer. Forward-Port-Of: odoo/enterprise#93225
Payroll users can now open work entries while several companies are selected without encountering an error. The fix makes the company filter include all active companies, supporting smoother multi-company payroll operations.
Original PR description
**Steps to reproduce:** - Choose multicompanes from the companies on top right - Open work entries by going into Payroll/Work Entries/Work Entries **Issue:** Previously, the domain contained the current company id only, when in reality there was more than a company **Fix:** Changed the domain to cover all companies in the env Task: 5077545 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix helps prevent IoT actions from running twice when the first connection method times out and a fallback is used. It reduces the risk of duplicate prints, registrations, or other device actions, improving reliability for businesses using IoT hardware.
Original PR description
Community PR: odoo/odoo#225678 In the following case an IoT box action can be duplicated: 1. Request is sent over longpolling 2. Action takes longer than 6s to execute, longpolling times out on the client side 3. Websocket request is sent as a fallback 4. Both requests cause an action to be executed (double blackbox registration, double print, etc.) To solve this we will send an ID with every action, and if the ID has already been recently seen we will ignore the action and log a warning. This PR handles the client side code, which just involves adding the new `action_unique_id` key to all our actions that are using fallbacks. task-5067737 Forward-Port-Of: odoo/enterprise#94031 Forward-Port-Of: odoo/enterprise#93985
This fix prevents the same IoT box action from being carried out twice when a request times out and is retried through a fallback connection. It helps avoid duplicate prints, registrations, or other device actions, improving reliability for businesses using connected hardware.
Original PR description
Enterprise PR: odoo/enterprise#93985 In the following case an IoT box action can be duplicated: 1. Request is sent over longpolling 2. Action takes longer than 6s to execute, longpolling times out on the client side 3. Websocket request is sent as a fallback 4. Both requests cause an action to be executed (double blackbox registration, double print, etc.) To solve this we will send an ID with every action, and if the ID has already been recently seen we will ignore the action and log a warning. task-5067737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225777 Forward-Port-Of: odoo/odoo#225678
Event registration now avoids showing a misleading or broken sign-in button in cases where checkout cannot proceed or is not needed. This prevents users from hitting an error when seats are unavailable and makes free event registration clearer by showing the correct confirmation action.
Original PR description
This commit fixes two bugs related to the "Sign in" in button of the registration form. First bug: ------------ If there is more ordered seats than available seats, an error modal is displayed with a…
This commit fixes two bugs related to the "Sign in" in button of the registration form. First bug: ------------ If there is more ordered seats than available seats, an error modal is displayed with a "Sign In" button. This button shouldn't be present. On click, a 500 error is triggered. Now, the button does not appeared on this modal. Reproduce: Check "Mandatory" for "Sign in/up at checkout" in the settings. In the event form, add a limit of 1 available seat and add two tickets with each one 1 seat. With a public user, on the website page of the event, click on "Register" to open the registration modal. In the tickets form, select the maximum number of registrations for each tickets. The error modal with the "Sign In" button should appear. Clicking on this button trigger the 500 error. Second bug: ---------------- The "Sign in" button is displayed even if the tickets have no price. So the label of the button is wrong because public users are not redirected to the checkout. Now, the "Confirm Registration" button is displayed in this case. Reproduce: With the same settings as for the first bug, create an event without tickets. Order a registration with an public user. Click on the "Sign In" button of the attendee details form. The confirmation page appears instead of the sign in page. task-4797022 Forward-Port-Of: odoo/odoo#215585
The website editor now respects the same filtering rules used in the backend when selecting related records such as job locations. This prevents users from seeing unrelated contacts and keeps website editing choices consistent with recruitment setup.
Original PR description
Steps to reproduce: 1. Install `website_hr_recruitment` 2. Open the Recruitment module's tree view 3. Create a new job position 4. See the Job Location field in the form view under the recruitment page 5. Observe the fetched records 6. Go to the website via the smart button 7. Edit the website and click on the remote under the job position (Job Location) 8. Observe contacts in the web editor Issue: All partners are fetched instead of the filtered ones. Cause: The backend domain of the clicked field is not applied while fetching records in the web editor. https://github.com/odoo/odoo/blob/afa26af132566a68ad6bf67565062bd73ddd7429/addons/hr_recruitment/models/hr_job.py#L25-L36 Solution: Apply the backend domain of the clicked field when fetching records in editor. opw-4879929
21 changes
Enhancements to existing features
Adds a download button for IR56B reports in Hong Kong Payroll, making it easier for users to export the required XML file. This supports smoother payroll reporting and reduces manual steps for preparing statutory submissions.
Original PR description
Add ir56b report download button for downloading .xml file in Hong Kong Payroll. task - 5081474
Resolved issues and error corrections
Credit notes for Mexican public invoices can now keep the selected “Returns, discounts or bonuses” tax usage when allowed by SAT rules. This prevents the XML from being generated with the wrong default value, reducing compliance errors for companies using fiscal regime 616.
Original PR description
**Steps to reproduce:** 1. Install `l10n_mx` and `l10n_mx_edi`. 2. Create an invoice with: * Enable *CFDI to Public*. * Confirm, then send to SAT. 3. Create a credit note with: * *Usage* = `Returns,…
**Steps to reproduce:** 1. Install `l10n_mx` and `l10n_mx_edi`. 2. Create an invoice with: * Enable *CFDI to Public*. * Confirm, then send to SAT. 3. Create a credit note with: * *Usage* = `Returns, discounts or bonuses` (G02). 4. Download the generated XML for the credit note. **Observed behavior:** - The `<UsoCFDI>` tag in the XML shows `S01` (No fiscal effects). **Expected behavior:** - The `<UsoCFDI>` tag should show `G02` for credit notes under regime 616 when explicitly selected. **Root cause:** - For regime 616 (`Público en general`), the code always defaults to `S01`. - The condition only allowed `G02` when refunding a global invoice (`is_refund_gi`), not for normal credit notes. **Solution:** - Allow `G02` usage to be preserved for credit notes (tipo_de_comprobante = 'E') even when `CFDI to public` is active, as this is now permitted by SAT regulations for fiscal regime 616. **ref:** http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/catCFDI_V_4_20250820.xls opw-5012917
The website shop sitemap generation now uses less memory when handling very large product catalogs. This helps prevent server crashes caused by search engines or web crawlers requesting product sitemap pages.
Original PR description
### Issue Server crashes with MemoryErrors when a database has a large product catalogs. ### Solution This commit disables the prefetcher to avoid MemoryErrors when generating the sitemap for large product catalogs as web crawlers would continously crash the server when requesting the sitemap. ### References opw-5001680 opw-4955333 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Brazilian service invoices with installments now exclude taxes from the installment data sent for validation. This prevents rejection errors where installment totals do not match line totals, helping invoices process correctly.
Original PR description
Service invoices require us to send installments without taxes. If we include taxes we get an error: **Errors**: Rejection: Total Installments doesn’t match Total Lines ∑ installments[m]grossValue - ∑ (lines[n].lineAmount-line[n].lineTaxedDiscount) <> 0 This **PR** clears taxes before tax calculation to ensure the installments we send are correct. **task**-4761630
The Mexican e-invoicing flow now handles customer names entered with accents when matching them against official legal names that omit accents. This helps prevent invoice stamping errors for PoS customers using the self-invoicing portal.
Original PR description
Currently, the self-invoicing portal lets client request an invoice after making a purchase in PoS. A form allows them to enter their personal informations such as their name. Many of them enter their name with accents, however the government has all the names without any accents which causes errors when trying to match the requesting party with their legal name during the stamping process of the CFDI. task-4952174
Fixes an error that could stop users from printing and sending invoices when a related invoice report setting had been disabled. This helps ensure invoice delivery continues to work even when report options are customized.
Original PR description
Currently, An error occurs when the user print and send invoices and 'Invoice report' is disabled in reports 'report_invoice_with_payments'. Step to produce: - Install the `account` module. - Go to…
Currently, An error occurs when the user print and send invoices and 'Invoice report' is disabled in reports 'report_invoice_with_payments'. Step to produce: - Install the `account` module. - Go to Settings / Technical / Actions / Reports, Search 'report_invoice_with_payments', and disable the 'Invoice report'. - Go to Invoicing / Customers / Invoices, Create one invoice add a customer and invoice line, and Confirm it back to the list view of the invoice - Select this invoice and click on Print & Send. - After Opening a wizard, click the 'Print & Send' button. The issue occurs when the user tries to generate and send invoices and the system checks that 'is_invoice_report' is enabled for invoices at [1]. Link [1]: https://github.com/odoo/odoo/blob/658711aa1e1809b267006149ed6a547e548c1f90/addons/account/models/account_move_send.py#L658 To resolve this, we have to remove this comparison [1] as the user can disable 'is_invoice_report' from 'report_invoice_with_payments'. Sentry-6185986435 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now update the resource on multiple planning entries at the same time from My Planning without triggering an error. This improves reliability for teams managing schedules in bulk and avoids interruptions when editing several planning slots together.
Original PR description
Currently, An error occurs when trying to change(update) all resources in planning slot at once from the 'My Planning' list view. Step to produce: - Install the `sale_planning` module (with demo data). - Open a list view of 'My Planning', Select all records, and try to change(update) all resources at one time. `ValueError: Expected singleton: planning.slot(5, 7)` The error occurs because the system attempts to access a single value of fields (allocated_hours, allocated_percentage) from multiple records at [1]. Link [1]: https://github.com/odoo/enterprise/blob/a3de64e02ea62da0ebb06c589ed122dad44243ca/planning/models/planning.py#L2043-L2044 To resolve this issue, Use an iteration(for loop) to iterate records one by one. Sentry-6217013028
This fixes an invoice sending issue where users could choose postal delivery even after the related postal mail feature was uninstalled, causing an error. The send invoice wizard now only shows delivery methods that are currently available, helping users complete invoice sending without interruption.
Original PR description
Currently, a traceback is occurring when the user tries to send a customer invoice with the sending method as `By Post`. To reproduce this issue: 1) Install Accounting and Unistall `snailmail` 3)…
Currently, a traceback is occurring when the user tries to send a customer invoice with the sending method as `By Post`. To reproduce this issue: 1) Install Accounting and Unistall `snailmail` 3) Create a posted `Customer Invoice` with a customer having no Invoice Sending (Remove the value in customer's accounting page if he has the value) 4) Click the `Send` button and select the sending method as `To Post` 5) Click the `Send` button in wizard Error:- ``` ValueError: Wrong value for res.partner.invoice_sending_method: 'snailmail' ``` The selection value `snailmail` for `invoice_sending_method` is defined in `snailmail_acount`. But it will be uninstalled when the `snailmail` module installed. https://github.com/odoo/odoo/blob/636d76d6dcbbe472b9d57cbe403d0758d94ad81d/addons/snailmail_account/models/res_partner.py#L7-L9 But in the `account.move.send.wizard`, the sending_method values are getting from the computed method `_compute_sending_method_checkboxes`. https://github.com/odoo/odoo/blob/636d76d6dcbbe472b9d57cbe403d0758d94ad81d/addons/account/wizard/account_move_send_wizard.py#L130 We get all the selection values(including the inactive) for the field `invoice_sending_method`. When the user selects the `snailmail` checkbox (By Post)to send the invoice, the value of `invoice_sending_method` for res.partner will be assigned from the below line. https://github.com/odoo/odoo/blob/636d76d6dcbbe472b9d57cbe403d0758d94ad81d/addons/account/wizard/account_move_send_wizard.py#L269 This will lead to the above traceback as the `snailmail` value for the selection field `invoice_sending_method` in the partner is not valid. We can resolve this issue by accessing only the active selection values for the field `invoice_sending_method`. So only the user can select the valid value for sending_method. sentry-6091298443
Users adding images by URL will no longer see a technical crash when the remote image cannot be reached or takes too long to respond. Instead, Odoo shows a user-friendly error while still logging details for support teams to investigate.
Original PR description
Currently, multiple tracebacks are occurring when the tries to add an image through URL. Types of exceptions occurring currently are ConnectionError and TimeoutError. https://github.com/odoo/odoo/blob/e0584a789b4bca0ab0d6691642440eec04433332/addons/html_editor/controllers/main.py#L255 We can resolve this issue by showing a user exception and a logger warning(for debugging) instead of a traceback. sentry-6093300975
Odoo Studio now avoids crashing when a user saves a report after removing all report content. The change checks that the expected report element exists before trying to update it, so the save action can complete without an index error.
Original PR description
The error occurs when `main_qweb.xpath("//*[@id='wrapwrap']")[0]` is accessed,
but the XPath query returns an empty list. This leads to an `IndexError: list
index out of range`.
-Steps to produce:
1. Open Odoo Studio
2. Create an empty new report using studio
3. Click on EDIT SOURCES
4. Select studio customization in uses to edit report
5. remove all elements from <t t-name="studio_main_report">
6. click on save
Error: "IndexError: list index out of range"
-Solution:
Wrapped the XPath query inside a conditional check before accessing `[0]`.
Now, the code verifies whether the list is non-empty before proceeding with
element replacement.
If the element is missing, the operation is skipped, preventing the crash.
sentry-6197314021A live chat rule with certain special characters in the URL field could cause the website to fail when opened. This update safely handles those characters so the website remains available even if a rule contains problematic input.
Original PR description
Setting special regex characters for`regex_url` inside live chat rules throws unhandled regex error.
**Steps to reproduce:**
- Install `website` and `im_livechat`
- Go to `livechat>YourWebsite.com Dropdown Menu>configure channel`
- Go to `channel rules>Add a line`
- Inside URL Regex field enter any of the quantifier regex such as `+`, `*`, `
`{any number}`, `[]`,`{any number range start,any number range limit}` and save
the rule.
-Open `website`.
Error:
`re.error: nothing to repeat at position 0`
**Solution:**
- We use `re.escape()` to safely handle user input that may contain special regex characters.
**Sentry-6538643923**Field service sales orders with zero-priced service lines now correctly move to an invoiced status once their related invoice is posted. This prevents orders from incorrectly remaining marked as needing invoicing, giving teams a clearer view of completed billing work.
Original PR description
Steps: - Install sale and fsm module. - Enable anglo-saxon from the setting. - Create a service type product with fsm project as template. - Select that product on SO and set unit price to 0 on SOL. - Confirm that order and create and post invoice. Issue: - Sale order status still shows `To invoice` even though we create SOL related invoice. Cause: - In [PR] we made invoice status for anglo-saxon line `To Invoice` so it always say `To Invoice` even user create related invoice. Fix: - Make those lines `Invoiced` if there is related invoice by checking qty_invoiced is greater or equal to qty. [PR]: https://github.com/odoo/enterprise/pull/70132 opw-5055540 Forward-Port-Of: odoo/enterprise#94723
Sales orders now better identify coupon and global discount lines, so related integrations can report the correct discounted amount. This also prevents discount line values from being accidentally reset when their quantity changes, improving accuracy for order totals and delivery/payment workflows.
Original PR description
Issue ----- When using Shiprocket with the "Cash On Delivery", the request sent to the Shiprocket API doesn't contain the amounts discounted by coupons. Steps to reproduce ----- - Set an Indian…
Issue ----- When using Shiprocket with the "Cash On Delivery", the request sent to the Shiprocket API doesn't contain the amounts discounted by coupons. Steps to reproduce ----- - Set an Indian company up (with valid address and some dummy mail & phone) - Create a customer "IN Cust" (with valid address and some dummy mail & phone) - Create a product "IN Prod" - Sale price: 1000 INR - Weight: 100g - Set some reference, eg "INPROD" - Create a Shiprocket delivery method - Payment Method: COD - Set some "Shiprocket Channel" - Enable Debug requests - In settings, enable "Promotions, Loyalty & Gift Card" - Go to Sales > Products > Discount & Loyalty - Create a new program - Name: 50% off - Program Type: Coupons - Change the existing reward to 50% discount on order - Generate some coupon - Copy the code to the generated coupon - Create a SO our product and customer - Use the coupon code & apply the 50% discount - Add shipping - Shiprocket COD - Get rate - Confirm the SO - Go to the picking & validate it - Open logs (Settings/Technical/Database Structure/Logging) - Open the "shiprocket_request_external/shipments/create/forward-shipment" log --> total_discount is 0 Cause ----- The problem comes from https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L301 There are 2 issues here. The first and most important one is how we find the discount lines. https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L320 Discounts from coupons don't use the `sale_discount_product_id`, we'll have to define a new function to override in `sale_loyalty` for this. The second issue is that we use the untaxed discount amount. https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L321 This leads to an incoherent total amount, since the tax is computed on the products' full prices. We should instead be forwarding the total discount value (with tax included to offset the taxes applied on the full product price). ----- Enterprise PR: https://github.com/odoo/enterprise/pull/92310 Ticket: opw-4755357 Forward-Port-Of: odoo/odoo#223517
Shiprocket cash-on-delivery shipments now include coupon-based discounts in the amounts sent to Shiprocket. This prevents customers and merchants from seeing incorrect COD totals when promotional coupons are applied, including tax-inclusive discount handling.
Original PR description
Issue ----- When using Shiprocket with the "Cash On Delivery", the request sent to the Shiprocket API doesn't contain the amounts discounted by coupons. Steps to reproduce ----- - Set an Indian…
Issue
-----
When using Shiprocket with the "Cash On Delivery", the request sent to the Shiprocket API doesn't contain the amounts discounted by coupons.
Steps to reproduce
-----
- Set an Indian company up (with valid address and some dummy mail & phone)
- Create a customer "IN Cust" (with valid address and some dummy mail & phone)
- Create a product "IN Prod"
- Sale price: 1000 INR
- Weight: 100g
- Set some reference, eg "INPROD"
- Create a Shiprocket delivery method
- Payment Method: COD
- Set some "Shiprocket Channel"
- Enable Debug requests
- In settings, enable "Promotions, Loyalty & Gift Card"
- Go to Sales > Products > Discount & Loyalty
- Create a new program
- Name: 50% off
- Program Type: Coupons
- Change the existing reward to 50% discount on order
- Generate some coupon
- Copy the code of the generated coupon
- Create a SO our product and customer
- Use the coupon code & apply the 50% discount
- Add shipping
- Shiprocket COD
- Get rate
- Confirm the SO
- Go to the picking & validate it
- Open logs (Settings/Technical/Database Structure/Logging)
- Open the "shiprocket_request_external/shipments/create/forward-shipment" log
--> total_discount is 0
Cause
-----
The problem comes from
https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L301
There are 2 issues here.
The first and most important one is how we find the discount lines.
https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L320
Discounts from coupons don't use the `sale_discount_product_id`. We can use the `_can_be_invoiced_alone` function to find both regular and loyalty discounts
https://github.com/odoo/odoo/blob/ee63fe7863dfa0083674dc927c1aa67c9e36c481/addons/sale/models/sale_order_line.py#L1033-L1041
def _can_be_invoiced_alone(self):
""" Whether a given line is meaningful to invoice alone.
It is generally meaningless/confusing or even wrong to invoice some specific SOlines
(delivery, discounts, rewards, ...) without others, unless they are the only left to invoice
in the SO.
"""
self.ensure_one()
return self.product_id.id != self.company_id.sale_discount_product_id.id
https://github.com/odoo/odoo/blob/ee63fe7863dfa0083674dc927c1aa67c9e36c481/addons/sale_loyalty/models/sale_order_line.py#L50-L51
def _can_be_invoiced_alone(self):
return super()._can_be_invoiced_alone() and not self.is_reward_line
We just have to be careful not to accidentally include delivery fees because of
https://github.com/odoo/odoo/blob/ee63fe7863dfa0083674dc927c1aa67c9e36c481/addons/delivery/models/sale_order_line.py#L18-L19
def _can_be_invoiced_alone(self):
return super()._can_be_invoiced_alone() and not self.is_delivery
The second issue is that we use the untaxed discount amount.
https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L321
This leads to an incoherent total amount, since the tax is computed on the products' full prices. We should instead be forwarding the total discount value (with tax included to offset the taxes applied on the full product price).
-----
Community PR:
https://github.com/odoo/odoo/pull/223517
Ticket:
opw-4755357
Forward-Port-Of: odoo/enterprise#92310This fix prevents users from changing the amount in currency on posted journal items in ways that could leave invoice totals and related analytic entries inconsistent. The field remains editable only where appropriate, such as draft tax lines, helping preserve accurate accounting records.
Original PR description
- Create an invoice with some products and post it - Go to Accounting > Journal items and ser for the ones belonging to the invoice. - Set the checkbox for the product sales one and set whatever tax…
- Create an invoice with some products and post it - Go to Accounting > Journal items and ser for the ones belonging to the invoice. - Set the checkbox for the product sales one and set whatever tax grid (you'll have to reveal that column). - Accept the changes. - Now go back to the invoice. - You'll see a new tracking message. Something like Journal Item #1093 updated - It contains a link and from that link you can go to the journal item form. - In that form you can edit the *amount in currency* field. Issue: - If a user do so, it leaves inconsistent invoice amounts: totals aren't recomputed, analytic lines aren't recomputed either. How it should behave: - Amount in currency shouldn't be editable here. Mainly when the journal entry is already posted! opw-4951629 A vídeo showing the issue: 📹️ https://www.loom.com/share/f7cd1d8f4138458f9b6c190233b0b9df?sid=eec77c17-a4a6-4698-8604-10aaa7e33f47 MT-10887 cc @moduon --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225346 Forward-Port-Of: odoo/odoo#223187
Sendcloud deliveries can now use customs HS codes up to 12 characters, matching Sendcloud's current API rules. This helps prevent international parcels, especially shipments to the US, from being delayed because their customs code was shortened or rejected.
Original PR description
**PROBLEM** We limit the `hs_code` length to 8 characters, but if we refer to the [sendcloud v2 api doc](https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/parcels/schemas/parcel-item), we see that `hs_code` length can be up to 12 characters. Some clients have issue with parcels being held longer in custom when sending them to the US. [opw-5051585](https://www.odoo.com/odoo/project/49/tasks/5051585) Forward-Port-Of: odoo/enterprise#94894
This fixes a problem where users with employees in multiple companies could hit a validation error when adding timesheets to Helpdesk tickets. Timesheets now keep the intended company instead of being overwritten when the linked project has no company set, reducing disruption during daily work and migrations.
Original PR description
Steps to Reproduce: ------------------ - Open Helpdesk. - Go to Configuration → Helpdesk Teams. - Create a new team. - Enable the Billing feature and assign a project to this team. - Set the…
Steps to Reproduce: ------------------ - Open Helpdesk. - Go to Configuration → Helpdesk Teams. - Create a new team. - Enable the Billing feature and assign a project to this team. - Set the project’s Company field to Null. - Create an employee for the current user in another company. - Ensure the user has employees in both companies. - Create a new ticket (or open an existing one) in the newly created team. - Try creating a new timesheet → a Validation Error is raised. Root Cause: ----------------- When a user has employees associated with multiple companies and tries to log a timesheet with multi-company enabled, a validation error occurs. **This happens because:** - The default company is derived from the project linked to the Helpdesk team. Since the company_id field on the project is no longer required, it may be Null, leading to an error when fetching the correct [employee for the company](https://github.com/odoo/odoo/blob/6a36015e2ee69aafe3880bf1fff38439af5cd673/addons/hr_timesheet/models/hr_timesheet.py#L214-L216 ). - Additionally, the [company check](https://github.com/odoo/enterprise/blob/83a1b88c8cae4db5c9b1bf82ee7ebb4e13c41b2a/helpdesk_timesheet/models/analytic.py#L81-L82) is incorrect. The code is checking whether the `company_id` key exists in a `list of vals`, whereas it should be checked directly on the vals dict itself. Issue Faced: ------------- In version 18.3, timesheets are created during migration [here](https://github.com/odoo/upgrade/blob/24f85bbc3408bf10b1cee93e4c395edf806beaa8/migrations/helpdesk_timesheet/saas~18.3.1.0/post-migrate.py#L44-L58 ). Even though the correct company_id is passed, it gets overridden during the process. and If the associated project does not have a company set, the company_id becomes False [here](https://github.com/odoo/enterprise/blob/83a1b88c8cae4db5c9b1bf82ee7ebb4e13c41b2a/helpdesk_timesheet/models/analytic.py#L81-L82), which results in a Validation Error because the [here](https://github.com/odoo/odoo/blob/6a36015e2ee69aafe3880bf1fff38439af5cd673/addons/hr_timesheet/models/hr_timesheet.py#L214-L216) unable to determine the correct employee linked to the company. OPW: 5004092 Forward-Port-Of: odoo/enterprise#92507
ENASARCO taxes are now correctly treated as both withholding and pension fund contributions in Italian electronic invoices. This ensures compliant XML reporting and correct default setup when installing the Italian localization modules.
Original PR description
* = l10n_it, l10n_it_edi, l10n_it_edi_withholding The ENASARCO tax works both as a Withholding (negative) tax and as a Pension Fund tax. It must appear in the XML in both sections DatiRitenuta and CassaPrevidenziale. - We modified the master data to amend this error. Now the correct Withholding type appears right after installing the module. - Since there was an explicit check on taxes being both, we removed it. - Removed an exception where ENASARCO taxes were allowed to have positive values Forward-Port-Of: odoo/odoo#226357
Fixes an issue where matching a purchase order to a vendor bill could fail when both used the same individual contact linked to a company. The matching process now treats the individual and its parent company consistently, preventing the error and allowing the workflow to complete.
Original PR description
**Issue** When both a Purchase Order and a Vendor Bill are created using the same individual contact linked to a company, Bill Matching fails with a traceback. **Steps to Reproduce** 1. Create an…
**Issue** When both a Purchase Order and a Vendor Bill are created using the same individual contact linked to a company, Bill Matching fails with a traceback. **Steps to Reproduce** 1. Create an individual contact and link it to a company. 2. Create a Purchase Order with the individual as a vendor. 3. Create a Vendor Bill with the same individual as the vendor. 4. Try to perform Bill Matching. 5. A `ValueError: Expected singleton: res.partner(...)` is raised. Video for reference: https://drive.google.com/file/d/1qVnPLpk8jyMTKz-6AVLSaN2nVVeWiF4y/view **Root Cause** Purchase Orders store the partner exactly as selected (the individual contact), while Vendor Bills are normalized internally to the parent company (`commercial_partner_id`). This creates a mismatch in the Bill Matching logic, where records reference both the individual and the company, leading to an invalid recordset and the singleton error. **Fix** Always normalize vendors to their `commercial_partner_id` during Bill Matching. This ensures that both Purchase Orders and Vendor Bills consistently reference the same partner, avoiding mismatches between individual contacts and their parent company. Opw-5050339 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an issue where confirming a batch transfer could lose barcode settings, causing location barcodes such as WH-Stock to be read incorrectly. Warehouse users can now confirm batch deliveries and continue scanning locations normally without failed scans caused by split characters.
Original PR description
### Steps to reproduce: - In the settings enable: "Batch, Wave & Cluster Transfers" - Create 2 deliveries - Barcode > operations > Delivery orders > Batches > New - Add your two deliveries and…
### Steps to reproduce: - In the settings enable: "Batch, Wave & Cluster Transfers" - Create 2 deliveries - Barcode > operations > Delivery orders > Batches > New - Add your two deliveries and confirm - Scan WH-Stock #### > The scan fails considering you scanned each letter independently. ### Cause of the issue: When the barcode is scanned a call of the split barcode will be launched to split the barcode in multiple barcodes according to the `barcode_separator_regex` present in the config: https://github.com/odoo/enterprise/blob/aeb9343f4b7dfab0fbc04bca4623ae85b3ea6030/stock_barcode/static/src/models/barcode_model.js#L613-L632 The issue lies in the fact that even thought the is `barcode_separator_regex` was conrrectly populated at the onWillStart of the mainComponent: https://github.com/odoo/enterprise/blob/aeb9343f4b7dfab0fbc04bca4623ae85b3ea6030/stock_barcode/static/src/components/main.js#L209-L213 https://github.com/odoo/enterprise/blob/aeb9343f4b7dfab0fbc04bca4623ae85b3ea6030/stock_barcode/controllers/stock_barcode.py#L97 https://github.com/odoo/enterprise/blob/aeb9343f4b7dfab0fbc04bca4623ae85b3ea6030/stock_barcode/static/src/components/main.js#L229 https://github.com/odoo/enterprise/blob/aeb9343f4b7dfab0fbc04bca4623ae85b3ea6030/stock_barcode/static/src/models/barcode_picking_model.js#L36-L38 It was reset by the batch confirmation here: https://github.com/odoo/enterprise/blob/aeb9343f4b7dfab0fbc04bca4623ae85b3ea6030/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L123-L135 because this part of the config is not meant to be returned by the private method `_get_barcode_data` but rather by public complete version `get_barcode_data`: https://github.com/odoo/enterprise/blob/aeb9343f4b7dfab0fbc04bca4623ae85b3ea6030/stock_barcode/controllers/stock_barcode.py#L91-L98 Now, since no `barcode_separator_regex` was provided to our new config, each character will be considered to be considered as an independent barcodes and the `WH-Stock` barcode will not match any location. opw-5062331
Resetting a user's Odoo Calendar no longer incorrectly triggers an error about changing events the user cannot edit. This makes calendar resets complete as expected and avoids unnecessary support issues for Google Calendar users.
Original PR description
Before this commit, when resetting the Odoo Calendar of an user, it would trigger a ValidationError for updating events that the current user wasn't able to update, even though it was not an updated per se, but just a deletion of it in Odoo. After this commit, we no longer trigger that ValidationError during resets of Odoo Calendars, fixing the error. task-5103918
7 changes
Resolved issues and error corrections
This fix prevents manufacturing work order planning from failing when no start date is available. If the start date is missing, the system now uses today’s date as a fallback, helping production scheduling continue without interruption.
Original PR description
The issue occurs when the system tries to convert different types of date or date objects into proper python datetime.datetime object but 'date_start' is False in vals at [1]. It might be write when…
The issue occurs when the system tries to convert different types of date or date objects into proper python datetime.datetime object but 'date_start' is False in vals at [1]. It might be write when `_plan_workorders` is executed and mrp workorder has not 'leave_id' [2]. The issue occurs when the system attempts to convert various date or date-related objects into a valid Python datetime.datetime object. However, at [1], 'date_start' in 'vals' is False [1]. This may be write when the '_plan_workorders' method is executed and the mrp workorder does not have a 'leave_id' [2]. Link [1]: https://github.com/odoo/odoo/blob/a848c3854c94b5c2b752edddbcf49337acf9d6ea/addons/mrp/models/mrp_production.py#L875 Link [2]: https://github.com/odoo/odoo/blob/a848c3854c94b5c2b752edddbcf49337acf9d6ea/addons/mrp/models/mrp_production.py#L1533-L1536 To resolve this, provide a default date as today if start date is not available Sentry-6255515427 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website domain settings are now checked before they are saved, preventing invalid entries with spaces or overly long domain parts. This avoids errors when visitors or search engines access site files such as robots.txt and gives users a clear message to correct the domain.
Original PR description
The system did not previously validate the `website_domain` field, which could result in domains with invalid formats (e.g., containing spaces or exceeding the maximum acceptable length). The error is generated when the user sets the long domain and tries to access `/robot.txt`. **Steps to Produce:-** 1. Go to **Website's setting > set too long Domain > Save**. 2. Remove all after the first `/` from the URL and add **robots.txt**. **Error:-** `QWebException: Error while render the template` `UnicodeError: label too long` **Solution:-** - Added a constraint on the website_domain field. - The domain must: - Not contain any spaces. - Not exceed 71 characters. - Labels of domain should not exceed 63 characters. - A ValidationError is raised with a descriptive message if any of these conditions are violated. **sentry-6613845697** I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Kenyan eTIMS submissions no longer fail when a vendor bill includes an invoice line without tax. This prevents an error during submission and lets users continue processing valid vendor bills even when tax details are absent.
Original PR description
Currently, an error occurs when clicking the "Send to eTIMS" button on vendor bills. Steps to Reproduce: - Install the l10n_ke_edi_oscu module without demo data. - Create a new company with Kenya as the country and switch to it. - Go to Vendors > Bills, create a new bill, and add an invoice line without tax. - Confirm it, then click Send to eTIMS. StopIteration This error occurs because when the user removed the tax from the invoice line and clicked 'Send to eTIMS', the tax details got empty at [1]. As a result, no tax line is found using next(), which raises a StopIteration error. [1] https://github.com/odoo/enterprise/blob/e9cd1fa8c11d5d9a3dce7a8027a9ac9e19f44190/l10n_ke_edi_oscu/models/account_move.py#L234 This commit ensures that if there are no tax details present in the invoice line, the calculation of line_values is skipped for that case. sentry-6641334969
Swiss payroll now guides users to enter employee names in the expected first-name-then-last-name format. This also fixes the way legal first and last names are derived, helping SwissDEC payroll reports use the correct personal details.
Original PR description
* Add placeholder text to employee name field with Swiss cultural examples: "e.g. Roger Federer, Jean-Luc Godard, Johannna Spyri, ..." * Fix _compute_l10n_ch_legal_name method to correctly assign first_name and last_name from employee name (was previously reversed) * Update all SwissDEC test data to use correct "FirstName LastName" format instead of "LastName FirstName" to match the corrected computation logic task-5102851
CSV imports with missing columns or incorrect separators now show a clear validation error instead of failing unexpectedly. This helps users identify and fix formatting problems in their files, especially for large imports that may skip preview checks.
Original PR description
This error occurs when importing a CSV file containing rows with missing columns or incorrect separators. Large files may bypass preview checks, leading to failures during the actual import. **Steps to replicate:** * Settings>User & Companies>Users >Gear icon>Import Records * Import the [csv file](https://drive.google.com/file/d/1rkYjuiS_8ZO94lBwt_DvPbuRDr36xW1N/view?usp=sharing). * Set role field > title > Import `IndexError: list index out of range` **Solution:** * Catch `IndexError` during row processing and raise a `ImportValidationError` to handle rows with missing or misaligned columns. **Sentry-5588088802**
The website shop price range filter now uses corrected close-match search terms when calculating available price limits. This prevents shoppers from losing the ability to filter by price after a near-miss search, improving product discovery and checkout flow.
Original PR description
Versions
--------
- 17.0+
Steps
-----
1. Navigate to the website shop page.
2. Search for a term that is close to an existing one, but not exact ("dask" instead of "desk" for example)
Issue
-----
The price range filter will stop functioning
Cause
-----
The domain used to get the minimum and maximum prices for the price range filter used the original search term regardless of whether the actual search results are from a fuzzy search term or not
Solution
--------
When there is a fuzzy search term use it to get the minimum and maximum prices for the price range filter instead of the original search term
opw-5020545This update corrects rounding behavior when Mexican companies register payments in pesos for invoices issued in a foreign currency. It helps prevent valid payment e-invoices from being rejected due to small currency conversion differences.
Original PR description
Steps to reproduce:
- With an MX Company setup
- Set USD rate to:
- 0.049216958195 for day 1
- 0.053418803419 for day 2
- Create an invoice in USD as follows:
- line 1: price_unit 91, quantity 64, tax 16%
- Confirm and send CFDI
- Register full payment in MXN
- Send Payment CFDI
Issue: Payment validation will fail with error
Code : CRP20268
Message : El campo BaseP que corresponde a Traslado, no es igual a la suma de los importes de las bases registrados en los documentos relacionados donde el impuesto del documento relacionado sea igual al campo ImpuestoP de este elemento y la TasaOCuotaDR del documento relacionado sea igual al campo TasaOCuotaP de este elemento.
This occurs because the precision set in
e642e4d6d35c79d02c799d12451f3e2d92ab96e9 is too high and can lead to failed verification due to rounding issues
opw-4750981