Daily updates from Odoo
Monday, March 30, 2026
36 changes · saas-19.2
Resolved issues and error corrections
This update fixes an issue where quality control failures weren't correctly splitting stock moves, leading to inaccurate demand calculations. The fix ensures that failed quantities are properly reflected in new stock moves, maintaining accurate inventory tracking. This improves the reliability of quality control processes and prevents overestimation of available stock.
Original PR description
**Steps to reproduce:** * Install the `quality_control` module. * Create a storable product. * Configure a Quality Control Point: * Set Control per : Quantity. * Set Operation Type to Receipts. * Set…
**Steps to reproduce:** * Install the `quality_control` module. * Create a storable product. * Configure a Quality Control Point: * Set Control per : Quantity. * Set Operation Type to Receipts. * Set Product to the created product. * Create a Receipt for the product with a demand of 5 units. * Confirm the receipt and mark it as To Do. * Click on the Quality Check button. * Click on Fail and set the failed quantity to 3. * Click on Confirm. **Observed behavior:** * A new stock move is created for the failed quantity. * The original move is split incorrectly: * First move: 2 `product_uom_qty` and 2 `quantity`. * Second move: 2 `product_uom_qty` and 3 `quantity`. * The failed move has a demand of **2** instead of **3**. **Cause:** * Clicking on *Quality Check* triggers `check_quality`, which opens the wizard `action_open_quality_check_wizard`: https://github.com/odoo/enterprise/blob/90567af2703a3928c35814a0c4862b4cd98b8432/quality_control/models/stock_picking.py#L79-L82 * Clicking on *Fail* triggers `do_fail`, opening the confirmation wizard: https://github.com/odoo/enterprise/blob/90567af2703a3928c35814a0c4862b4cd98b8432/quality_control/wizard/quality_check_wizard.py#L85-L88 * Clicking on *Confirm* triggers `confirm_fail`, which calls `_move_line_to_failure_location`: https://github.com/odoo/enterprise/blob/90567af2703a3928c35814a0c4862b4cd98b8432/quality_control/wizard/quality_check_wizard.py#L97 * In `_move_line_to_failure_location`, a new stock move is created for the failed quantity: https://github.com/odoo/enterprise/blob/90567af2703a3928c35814a0c4862b4cd98b8432/quality_control/models/quality.py#L480 * The demand quantity is computed using the minimum of the failed quantity and the move line quantity. * This leads to an incorrect demand of *2* instead of *3*. * However, the move line quantity was already reduced by the failed quantity: https://github.com/odoo/enterprise/blob/90567af2703a3928c35814a0c4862b4cd98b8432/quality_control/models/quality.py#L472 **Fix:** * Ensure that partial failures properly split stock moves with correct `product_uom_qty` and `quantity` values. --- opw-5492095 Forward-Port-Of: odoo/enterprise#112298 Forward-Port-Of: odoo/enterprise#107493
This update allows users to access and view canceled signature requests within the Odoo portal. Previously, canceled requests were hidden, preventing users from seeing important communication history and document details. The change simplifies the user experience by aligning the display for canceled requests with completed requests.
Original PR description
Previously, users were redirected to the home page if they tried to access a signature request in the 'canceled' state. This prevented them from viewing the communication history or the document metadata. This commit: - Removes the 'canceled' state restriction in the portal controller. - Updates the portal template to show "View Document" instead of "Sign" for canceled requests, similar to the completed state. Task: 6034621 Forward-Port-Of: odoo/enterprise#111534 Forward-Port-Of: odoo/enterprise#110974
A test used in the Odoo Enterprise payroll module failed due to an incorrect date calculation. This fix adjusted the test environment to ensure accurate results, preventing future disruptions to payroll processing. The change addresses a discrepancy in how date ranges were being evaluated during testing.
Original PR description
[FIX] l10n_ch_hr_payroll_elm_transmission: fix avs test for faketime build
Bug reproduction:
1 - v.17->run test_generic_avs_deductions test with faketime 2027-01-01 12:00 UTC->test fails
Bug cause:
1 - In the test, compute_sheet()->_get_payslip_lines->_compute_rule->_get_avs_rates is called
2 - There is a line like that if line.date_from <= target and (not line.date_to or target <= line.date_to)
3 - I looked to avs_line_ids = fields.One2many(default=_get_default_avs_line_ids)
4 - In _get_default_avs_line_ids -> 'date_from': fields.Date.today().replace(month=1, day=1) date_from is calculated like that -> when the year is 2027, the date_from is 2027-01-01 and it is bigger than the target in the test.
Bug solution:
1 - I used @freeze_time("2026-02-28") in my test to prevent this behavior.
Runbot Error Link: https://runbot.odoo.com/odoo/runbot.build.error/240992
task - 6018940
Forward-Port-Of: odoo/enterprise#109975This update fixes an issue in the l10n_pe_edi_pos module that prevented accurate consolidation of Point of Sale (POS) orders. The system now validates order groupings, preventing errors when attempting to combine invoices that don't meet necessary criteria and providing helpful error messages to the user.
Original PR description
Joining the values in the selection field with a coma, and then putting everything in another selection field was plain wrong. We now check a bit better what we're generating, and refrain the user with error messages when they try grouping on the same invoices orders that do not share the necessary key values. Forward-Port-Of: odoo/enterprise#111616
This update resolves a crash issue when opening tax reports in Odoo Enterprise. The fix ensures reports without a defined return type automatically use the company's tax periodicity, preventing errors and improving report stability. This enhances the reliability of financial reporting.
Original PR description
When a report uses 'previous_return_period' date_scope on one of its expressions, if there's no account.return.type linked to that report, the opening of the report crashes. This is a bit stupid,…
When a report uses 'previous_return_period' date_scope on one of its expressions, if there's no account.return.type linked to that report, the opening of the report crashes. This is a bit stupid, since a return type without periodicity will anyway fallback to the the company's tax periodicity field. When there's no return type, we should simply fallback in the same way. To reproduce: - Make a Belgian company, install the CoA and localization - Manually uninstall l10n_be_reports - Try opening the tax report Another message also checked that we couldn't compute this date_scope in case there was more than one return type linked to the report, arguing they have different periodicities, so we can't infer which one to use. However, it they actually shared the same periodicity, that check failed anyway. We refine it to authorize this case, and only raise if they truly have different periodicities. opw-6022150 Forward-Port-Of: odoo/enterprise#111872 Forward-Port-Of: odoo/enterprise#111796
This update fixes an issue where selected failure locations weren't being applied during product repairs. Now, when a quality check fails, the product is automatically moved to the user-specified failure location, ensuring accurate inventory and repair tracking. This improves the reliability of the repair process.
Original PR description
Before this commit: ------------------------- - In the Repair module, when a quality check for a product was marked as failed, Even after selecting a failure location, the failure location is not…
Before this commit: ------------------------- - In the Repair module, when a quality check for a product was marked as failed, Even after selecting a failure location, the failure location is not being set at the final product move. - Instead of showing the selected failure location, the system displayed another location as the move destination after completing the repair process. Steps to reproduce: ------------------------- 1. Install the quality_repair module. 2. In Quality, create a Control Point with: - Type = Pass-Fail - Control Per = Product or Operation - Set at least 1 Failure Location 3. Create a Repair Order for any product and start the repair process. 4. Perform a quality check, set it to Fail, and select a failure location. 5. Open the product moves, the destination location does not match the selected failure location. Cause of the issue: ------------------------- The failure location was not correctly assigned when a quality check failed during the repair process because _move_to_failure_location determines the destination location based on a stock picking (for receipts) or a production_id (for manufacturing). In the Repair module, however, quality checks are linked to a repair order, so the selected failure location was not set correctly. After this commit: ----------------------- - When a quality check fails in a repair order, the product’s destination location is correctly set to the failure location selected by the user. - This ensures that, upon completion of the repair, the product is moved to the selected failure location, maintaining accurate inventory tracking and management. Task ID:5254334 Forward-Port-Of: odoo/enterprise#99235
This update fixes an issue where quarterly VAT returns in the Italian module didn't automatically generate the required XML export files. The fix correctly uses the 'date_to' field for quarter detection, ensuring accurate XML generation. It also improves data accuracy for quarterly reports by simplifying calculations.
Original PR description
## Issue: When the tax return periodicity is set to quarterly and the return is validated, the XML file is not generated and downloaded ## Cause: The quarter detection logic was based on the `date_from` field of the return However, for quarterly returns, the correct reference should be `date_to` Using `date_to` also works correctly for monthly returns ## Steps to reproduce: - Install `l10n_it_xml_export` - Switch to the IT Company - Go in the Tax Report (Monthly VAT Report (IT)) to do a Tax Return (Opening Date: 01/01/2025, Periodicity: Quarterly) - If needed change the Tax Return Periodicity in Settings to Quaterly - Select the first report and ignore the error in Review Before the fix, it is only possible to close the return without generating the XML export opw-5707544 Forward-Port-Of: odoo/enterprise#111370 Forward-Port-Of: odoo/enterprise#108548
This update resolves an issue where searching for deliveries solely by zip code resulted in inaccurate location data being sent to Sendcloud. The system now correctly handles zip codes and includes the city information, ensuring accurate delivery point selection. This improves the reliability of our Sendcloud integration.
Original PR description
Issue ----- Searching for locations by only providing a zip code has unexpected results. Steps to reproduce ----- - Set up Sendcloud with Mondial Relay - Create a sale through the website - Get to the delivery part - Select sendcloud delivery - Search for a zip code only (11000) > Points are all in the 12200 area Cause ----- When searching through the wizard, a temporary address is created in https://github.com/odoo/odoo/blob/89e5038c224d58a2f6be8f3001fd0a2932733cbc/addons/delivery/models/sale_order.py#L108-L112 which always has its' city field set to `False`, as all of the wizard's info is interpreted as the zip code. This leads to the address field sent to Sendcloud being '11000 False' instead of the expected '11000', which Sendcloud fails to interpret correctly. ----- Ticket: opw-5999194 Forward-Port-Of: odoo/enterprise#110459
This update resolves a technical issue preventing invoices with discounts and decimal values (over 2 decimals) from successfully sending to ARCA for Arabic EDI processing. The fix utilizes a truncated unit price for discount calculations, ensuring accurate decimal alignment and preventing errors.
Original PR description
After changes made in Odoo of how the decimal precision works some of the code we use to prepare the data to create EDI invoices now fails. We already adapt the code to fix the data depending of the expected webserive format but we miss a case related to when invovice has discounts. The problem is that any invoice with lines that has more than 2 decimals and also have a discount will fail when trying send it to ARCA because the computed amount has differences in the decimals. Now we use the truncated unit price to compute the discount instead of the full amount with decimal of the `line.price_unit` value. Forward-Port-Of: odoo/enterprise#111518 Forward-Port-Of: odoo/enterprise#110706
This update clarifies the error message displayed when an upsell's start date is set after the next invoice date. This change ensures users receive clearer guidance, preventing confusion and potential issues with subscription billing. It's a simple fix to improve the user experience.
Original PR description
Update the error message when an upsell start date is on or after the next invoice date, so it be more clear for the users. task-5893032 Forward-Port-Of: odoo/enterprise#106757
This update resolves an issue where night shift slots (e.g., 20PM - 4AM) weren't visible in the weekly planning view. The fix adjusts how the system displays multi-day slots, ensuring all scheduled hours are accurately shown. This improves the planning experience for employees with flexible schedules.
Original PR description
**Steps to reproduce** 1. Have an employee using a flexible schedule 2. Create a slot from e.g. 20PM to 4AM for this employee. Make sure this is the only slot that week for the employee. 3. Publish…
**Steps to reproduce** 1. Have an employee using a flexible schedule 2. Create a slot from e.g. 20PM to 4AM for this employee. Make sure this is the only slot that week for the employee. 3. Publish the Schedule and send it to the employee. Open the outgoing mail to access the link to the planning view. Issue: the slot is not visible in the week view. **Cause** https://github.com/odoo/enterprise/blob/04a885dbb6eed96297cb5ce9a155ebf8e169427c/planning/controllers/main.py#L193-L194 The `event_hour_min` and `event_hour_max` returned by `planning_get` and used to control the min/max hours displayed in the week view, didn't account for slots over multiple days. For a slot between 20pm and 4am, the `event_hour_max` should be the end of the day, and the `event_hour_min` should be the start of the day. **Solution** - we change the `event_hour_min` and `event_hour_max` for multi-day slots to display the full days in the week view - the previous point has the drawback of displaying the full days for non-flexible employees even when not necessary. This is because `slots_start_datetime` and `slots_end_datetime` contained the `planning.slot` start and end. Instead, we can look at the actual slot values displayed (by `_get_slots_vals`). For example, a 5 day slot for a non-flexible employee may contain actual slot values corresponding to a typical 8-17 working day. opw-5245985 Forward-Port-Of: odoo/enterprise#111658 Forward-Port-Of: odoo/enterprise#99784
This update fixes an issue where payslips for UAE employees with attendance-based work entries were incorrectly calculating hourly wages. The change ensures accurate wage calculations by using the correct record object within the computation process, preventing data from other payslips from being incorrectly included.
Original PR description
### Steps to reproduce: - Install the l10n_ae_hr_payroll module. - Configure at least two employees, who'll use the UAE Monthly pay structure. - On at least one of the employees, set the work entry…
### Steps to reproduce: - Install the l10n_ae_hr_payroll module. - Configure at least two employees, who'll use the UAE Monthly pay structure. - On at least one of the employees, set the work entry source to attendance. - Register a paid leave time off entry, for the employee whose work entry source is set to attendance. - Compute a payslip batch using the UAE Monthly pay structure. - Go to the payslip of the employee with the work entry source set to attendance and compute the sheet again. - The 'Paid Leave' salary rule results, will change given that the computation of the field l10n_ae_hourly_wage is different when the computation is done for batches and individually. ### Cause: In 'Paid Leave' rule we use l10n_ae_hourly_wage to compute its result and while computing this field we use self.worked_days_line_ids instead of record inside the loop. This leads to an issue when self has more than one payslip it will take into account all the worked days for each payslip for different employees ### Fix: We use record instead of self to avoid taking other payslips into consideration while computing the hourly wage. opw-5979631 Forward-Port-Of: odoo/enterprise#112229 Forward-Port-Of: odoo/enterprise#111280
This update fixes an issue where tax returns were incorrectly including Italian pension fund taxes, leading to discrepancies between reports and the backend view. The change excludes these taxes from the tax return domain, ensuring accurate calculations and consistent reporting for Italian customers. This resolves a prior inconsistency.
Original PR description
The "amount to pay" incorrectly included the Pension Fund taxes, causing inconsistencies between the report and what the customer was able to see in the backend. Now we exclude them from the tax return domain. Steps to reproduce: - Create an Italian company with the Italian CoA - Install `l10n_it_edi_withholding` (not necessary in v19) - Create an invoice - Set the 4% INPS or 4% F.Pens taxes on a line, along with with a normal 22% VAT - Create a tax return Ticket [link](https://www.odoo.com/odoo/project.task/5909407) opw-5909407 Forward-Port-Of: odoo/enterprise#111311
This update resolves an issue where upgrading the `l10n_ae` module would fail if the user had renamed the "United Arab Emirates" country in Odoo's settings. The fix replaces references to country names in a key data file with a stable XMLID, ensuring consistent module upgrades regardless of user customizations.
Original PR description
### Steps to reproduce ------------------ - Install `l10n_ae` module. - Go to *Settings → Countries* and rename the country "United Arab Emirates" (e.g. change it to "UAE"). - Upgrade the `l10n_ae`…
### Steps to reproduce
------------------
- Install `l10n_ae` module.
- Go to *Settings → Countries* and rename the country "United Arab Emirates" (e.g. change it to "UAE").
- Upgrade the `l10n_ae` module.
### Issue
-----
The file `l10n_ae/data/res.bank.csv` references the country using its name ("United Arab Emirates"). During the module upgrade, the CSV import tries to resolve the country relation using the country name. If the country name has been modified by the user (for example to "UAE"), the lookup fails and the module upgrade crashes with:
```python3
No matching record found for name 'United Arab Emirates' in field 'Country'
```
### Root Cause
----------
Using translatable/display names in CSV data is unreliable, as these values can be customized or translated by users.
### Fix
---
Replace the country name reference with the stable XMLID `base.ae` in `res.bank.csv`.
Using XMLIDs ensures consistent resolution regardless of name changes or translations.
opw-6015302
upg-3950261
tbg-2492
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#255993This update corrects an issue where the Odoo module upgrade would fail if the country names in CSV data files (for Peru and Ecuador) were changed. By using stable XML IDs instead of names, the system now reliably resolves many-to-one relationships during module upgrades, preventing crashes.
Original PR description
### Steps to reproduce ------------------ - Install `l10n_pe` or `l10n_ec` module. - Go to *Settings → Countries* and rename the country (e.g. "Peru" → "PERÚ", "Ecuador" → "ECUADOR"). - Upgrade the…
### Steps to reproduce
------------------
- Install `l10n_pe` or `l10n_ec` module.
- Go to *Settings → Countries* and rename the country (e.g. "Peru" → "PERÚ",
"Ecuador" → "ECUADOR").
- Upgrade the module.
### Issue
-----
The files `l10n_pe/data/res.bank.csv` and `l10n_ec/data/res.bank.csv`
reference countries using their names (e.g. "Peru", "Ecuador").
During module upgrade, the CSV import resolves many2one relations using
the country name. If the country name has been modified by the user,
the lookup fails and the module upgrade crashes with:
```python3
2026-03-06 23:48:11,112 27 CRITICAL db_3950261 odoo.service.server: Failed to initialize database `db_3950261`.
Traceback (most recent call last):
File "/home/odoo/src/odoo/19.0/odoo/service/server.py", line 1510, in preload_registries
registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update'], reinit_modules=config['reinit'])
File "/home/odoo/src/odoo/19.0/odoo/tools/func.py", line 88, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/19.0/odoo/orm/registry.py", line 199, in new
load_modules(
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 456, in load_modules
load_module_graph(
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 216, in load_module_graph
load_data(env, idref, mode, kind='data', package=package)
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 59, in load_data
convert_file(env, package.name, filename, idref, mode, noupdate=kind == 'demo')
File "/home/odoo/src/odoo/19.0/odoo/tools/convert.py", line 689, in convert_file
convert_csv_import(env, module, pathname, fp.read(), idref, mode, noupdate)
File "/home/odoo/src/odoo/19.0/odoo/tools/convert.py", line 754, in convert_csv_import
raise Exception(env._(
Exception: Module loading l10n_pe failed: file l10n_pe/data/res.bank.csv could not be processed:
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
select id,name,code from res_country where code='PE'
+-----+----------------------------------------------------------------------+------+
| id | name | code |
|-----+----------------------------------------------------------------------+------|
| 173 | {"de_DE": "Peru", "en_US": "PERÚ", "es_ES": "PERÚ", "es_PE": "Perú"} | PE |
+-----+----------------------------------------------------------------------+------+
```
### Root Cause
----------
Using translatable/display names in CSV data is not reliable, as these
values can be customized or translated.
### Fix
---
Replace country name references with stable XMLIDs:
- `base.pe` for Peru
- `base.ec` for Ecuador
Using XMLIDs ensures consistent resolution regardless of name changes
or translations.
opw-6015302
upg-3950261
tbg-2492
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#256201
Forward-Port-Of: odoo/odoo#254096This update fixes an issue where code blocks within toggle lists would lose their formatting when the toggle was closed. The fix ensures that multiline code content is correctly preserved, regardless of the toggle's state, providing a consistent and functional experience for users. This improves the readability and usability of code snippets within the application.
Original PR description
### Steps to Reproduce: - Create a toggle list and add content. - Expand the toggle list and insert a code block (e.g.: /code). - Add multiple lines inside the code block using Enter. - Refresh the…
### Steps to Reproduce: - Create a toggle list and add content. - Expand the toggle list and insert a code block (e.g.: /code). - Add multiple lines inside the code block using Enter. - Refresh the page with the toggle open, content is preserved. - Close the toggle and refresh then content collapses into one line. ### Description of the issue/feature this PR addresses: - When the toggle list is closed, the code block is inside `display: none` container. In this state, `innerText` depends on rendered layout and does not preserve newline characters `\n`. As a result, multiline code content is extracted as single line. ### Desired behavior after PR is merged: - Read html and normalize it into plain text by: - Converting `<br>` tags into newline characters. - Stripping remaining HTML tags. - Decoding HTML entities back to their literal characters. - Removing the extra newline introduced by a trailing `<br>` - Cleaning up invisible zero-width characters. task-5909034 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248391
This update resolves an issue where project profitability calculations were inaccurate, leading to double-counting of costs. The fix ensures that the 'To Bill' and 'Billed' amounts correctly reflect the actual cost of a purchase order linked to a project, maintaining accurate accounting records. This improves the reliability of project cost tracking.
Original PR description
Steps to reproduce: ----------------------------------------- 1. Install `sale_purchase_project` and Accounting modules 2. From settings, enable Budget Management 3. Create a new product with type…
Steps to reproduce: ----------------------------------------- 1. Install `sale_purchase_project` and Accounting modules 2. From settings, enable Budget Management 3. Create a new product with type Service and enable Create a project on order. 4. Create and confirm the sale order with that product (note the name of created project) 5. Create and confirm purchase order as follows: > In other information page, select the created project in the Project field > Add the same product in POL, Set price unit price to 100 and remove any tax 6. Create and post a Vendor Bill for the same vendor as the PO as follows: > Add Bill line with label downpayment > Set the Analytic Distribution to the created project > Set amount to 30 7. Go to the created purchase order > Click on bill matching 8. Select the downpayment bill > Add to PO > Select created PO > Add Down Payment 9. Go to the created project and open dashboard Observation: ----------------------------------------- In the Costs section: Expected Cost: 130 To Bill: 100 Billed: 30 Expected values: ----------------------------------------- Expected Cost: 100 To Bill: 70 Billed: 30 Issue: ---------------------------------------- In the following code: https://github.com/odoo/odoo/blob/7e81c528ae350aab4432207f5655dcfadf6ec627/addons/project_purchase/models/project_project.py#L186-L190 When an invoice line was posted (billed), the code correctly subtracted the cost from `amount_invoiced` (making it negative, representing actual cost). But the billed amount was NOT removed from `amount_to_invoice`. This caused double counting the same cost appeared in both 'To Bill' and 'Billed' Solution: ----------------------------------------- Replaced the quantity-based calculation with a proper amount-based approach: - Introduced `total_invoiced_amount` to track the sum of all non-refund invoice line amounts (both posted and draft). - Modified the unbilled calculation to: `PO_amount - total_invoiced_amount`, ensuring that the unbilled portion accurately reflects what remains to be invoiced from the purchase order. - Excluded refunds from `total_invoiced_amount` calculation because credit notes represent reversals of previous invoices, not consumption of the purchase order. Refunds still correctly affect the "billed" and "to_bill" buckets through the normal invoice line processing. This ensures the accounting principle is maintained: Total Expected Cost = Billed + To Bill = Purchase Order Amount opw-5167734 Forward-Port-Of: odoo/odoo#245649
This update resolves an issue preventing barcode scanning of product packaging when a product doesn't have a barcode defined. The fix ensures the system searches for the product when a barcode is scanned on packaging, allowing for seamless barcode scanning functionality within the Point of Sale module. This improves the user experience and accuracy of sales transactions.
Original PR description
Step to reproduce - Create a product - Add two attributes: 1. One with Instantly creation mode 2. One with Never creation mode - Define packaging from the Sales tab - Add a barcode on the variant packaging ex: 111356,11357 - Scan the packaging barcode in POS Observation: - we get a traceback `TypeError: Cannot read properties of undefined (reading 'product_template_attribute_value_ids')` Cause: - when we do not have barcode on product, when opening `openConfigurator` - (as we have few varianst) product get undefined. https://github.com/odoo/odoo/blob/f229f23d7bf3d837ff5577c36145bf2ba410ea22/addons/point_of_sale/static/src/app/services/pos_store.js#L738 - Hence the traceback Fix: - For the case, when packaging has barcode but not the product, we search for product in that case too. opw-5886570 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253195 Forward-Port-Of: odoo/odoo#248838
This update ensures the HTML editor's tests consistently use the Roboto font, regardless of the user's computer. Previously, variations in fonts could cause test failures. This change improves the reliability of our testing process and ensures a more predictable user experience for HTML editing.
Original PR description
Purpose of this PR: - Explicitly load Roboto using FontFace in indent.test.js to avoid fallback fonts (e.g. Ubuntu) across environments. This ensures consistent rendering and prevents flaky failures caused by font-dependent computed values. task-5916115 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256070
This update fixes a bug in the website editor that prevented users from clicking links embedded within non-editable icons. Now, when you click on these icons, a popover appears, allowing you to access the linked destination. This ensures a smoother and more functional experience when building and managing website content.
Original PR description
Problem: When the website editor is enabled and icons inside links are marked as non-editable, it becomes impossible to open those links. Solution: Enable the link popover when clicking on non-editable icons inside links so the link can still be accessed. Steps to reproduce: - In the website editor, drop a "Social Media" inner snippet anywhere inside the header. - Click on one of the social media icons. - Observe that the link popover does not open, making it impossible to test the link. task-6009319 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a bug that prevented users from creating alias IDs within the recruitment application. The issue stemmed from a change in how recruitment source data was handled, specifically related to a dependency removal. The fix ensures that the system correctly identifies and utilizes the alias ID, improving the application's stability and usability.
Original PR description
Currently, an error occurs when a user creates an alias ID. **Steps to Reproduce:** - Install the `hr_recruitment` module. - Go to `your current company` and set the `Email Domain` value. - Go to…
Currently, an error occurs when a user creates an alias ID. **Steps to Reproduce:** - Install the `hr_recruitment` module. - Go to `your current company` and set the `Email Domain` value. - Go to `Recruitment` > `Applications` > `By Job Positions`. - In `list view`, create or open an existing `Job Position`. - In the `Trackers` tab, create a record through “Add a line”. - Click the `copy clipboard` button next to the `email` field. **Error:** `AttributeError: 'hr.recruitment.source' object has no attribute 'name'` After [this commit], the dependency of utm.source.mixin was removed, along with the source_id field referencing a source. The name field was provided by utm.source.mixin, and it is now being accessed in recruitment source, which raises the error [1]. This commit ensures that the system uses the name of source_id, as it has been replaced by _rec_name to "source_id". [this commit]: https://github.com/odoo/odoo/commit/927682ce8f5e6faea0da7216ac1163411f5e83bd [1]- https://github.com/odoo/odoo/blob/949d368eda3d6f2c9b5fb04ec3a41fa1b2cc90d4/addons/hr_recruitment/models/hr_recruitment_source.py#L42 sentry-7353030705 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where links within the Knowledge editor consistently opened in new tabs, regardless of user settings. The fix ensures that links open in the expected tab (current or new) based on the user's preference, improving the overall user experience and consistency within the editor.
Original PR description
Problem: Links configured to open in the current tab still open in a new tab when content is locked in Knowledge. Cause: When rendering content in `HtmlViewer`, we always force the link `target` to `_blank` and `rel` to `noreferrer`, even if different values were configured during editing. Solution: Preserve the values configured during editing instead of overriding them. Steps to reproduce: - Knowledge. - Add a link. - Disable the option to open the link in a new tab. - Lock the content. - Click on the link. - The link still opens in a new tab even though the option is disabled. opw-5991647 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256229 Forward-Port-Of: odoo/odoo#252492
This update resolves a bug where custom snippets using the 'Category' dynamic snippet didn't display correctly in the website preview. The fix ensures that the dynamic content from this snippet is now accurately reflected when viewing custom snippets within the website builder. This improves the functionality of the website builder for users creating custom content.
Original PR description
Commit 00cf9375b356b2316e24d97234474685e3fb7f94 added the new dynamic snippet for category of product, with a specific interaction. Commit 534a42029d757935788220549aabb8914302a4f3 shows dynamic content of dynamic snippet in snippets preview dialog, but `DynamicSnippetCategory` was missed (in forward port). This commit includes the interaction to load the dynamic content of "Category" dynamic snippet in the snippets preview dialog. Steps to reproduce: - Open website builder - Add a dynamic snippet `s_dynamic_snippet_category_list` - Save the snippet as a custom snippet - Click on "Custom" snippet category - Bug: The preview for the custom snippet does not have the dynamic part task-5427353 Forward-Port-Of: odoo/odoo#255850
This update fixes an issue where the shipping weight for deliveries wasn't correctly updated when changing the pack type after using the 'put in pack' action. Previously, updating the pack type didn't trigger the necessary calculation. Now, the system accurately reflects the base weight of the chosen pack type, ensuring accurate shipping cost calculations.
Original PR description
Issue ----- Doing `action_put_in_pack` then changing the pack type to one with a base weight doesn't correctly update the picking's `shipping_weight`. Steps to reproduce ----- - Enable packages - Create package types: - Big box with base weight of 5kg - Huge box with base weight of 15kg - Create a product AAA with weight of 10kg - Create a delivery for 1 unit of AAA - Confirm delivery - Put in pack - Update the pack type to "Big box" > shipping_weight is still 10kg instead of 15kg - Put in pack again - Update the pack type to "Huge box" > shipping_weight is still 10kg instead of 30kg Cause ----- Changing the package type doesn't change its' `shipping_weight`, so we don't trigger the picking's `_compute_shipping_weight`. ----- Ticket: opw-5975689 Forward-Port-Of: odoo/odoo#255764
This update replaces the old iDEAL logo with the new Wero logo for improved brand consistency. This change ensures users see the correct branding when selecting the iDEAL payment method, enhancing the overall customer experience.
Original PR description
Before the commit: The iDEAL payment method was using the existed legacy iDEAL logo. After the commit: - Updated the display name to "iDEAL / Wero". - Replaced the legacy iDEAL logo with the new Wero logo. - Introduced a separate "Wero" payment brand. task-5922938 Forward-Port-Of: odoo/odoo#254901 Forward-Port-Of: odoo/odoo#248506
This update corrects a technical issue where a blank default value was appearing in the Contact Form's radio button field. This prevented validation warnings even when the field was marked as required. The fix resolves this oversight in how default values are handled, ensuring proper form functionality and data integrity.
Original PR description
# How to reproduce - Go to the website editor - Add a Contact Form block - Add a new field with the type "Radio Buttons" - Do not set any value to default # The issue A default empty value appears in the form. This value can be selected by the user and will not trigger any validation warning even if the field is set to required # Cause Commit [1] changed the way the default value is added for the Selection field. It contains a small oversight as the type value for "Selection" is not "selection" but many2one. https://github.com/odoo/odoo/blob/f28c9f8dc5639ff8606b139ca9d384f115b003d3/addons/website/static/src/builder/plugins/form/form_option.xml#L96-L109 [1]: https://github.com/odoo/odoo/commit/34ddd5dd6a036792c44b865cb7a4671f4ca033cf opw-6062186 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255580
A technical issue causing a traceback when creating group allocations in the Time Off module has been resolved. This was due to a recent change in the underlying model name, which resulted in an outdated domain condition still referencing a removed field. The fix removes the incorrect domain reference, ensuring smooth allocation functionality.
Original PR description
Steps to reproduce: -------------------------------------- 1. Install Time off module 2. Navigate to Time off > Management > Allocations 3. Click on the 'New Group Allocation' button 4. Click on the…
Steps to reproduce:
--------------------------------------
1. Install Time off module
2. Navigate to Time off > Management > Allocations
3. Click on the 'New Group Allocation' button
4. Click on the Time Off Type field to open the selection dropdown.
Observation:
--------------------------------------
Traceback occurs:
```
File '/home/odoo/odoo/community/odoo/orm/domains.py', line 920, in _raise
raise error(message % (*args, self.field_expr, self.operator, self.value))
ValueError: Invalid field hr.work.entry.type.company_id in condition ('company_id', 'in', [1, False])
```
Issue:
--------------------------------------
In the commit https://github.com/odoo/odoo/pull/244436/changes/5b9570e4bd4cc0ae7d9a81e33f49dc538ae5acd3 model name changed from `hr.leave.type` to
`hr.work.entry.type`. With this change `company_id` field is removed too. However, the domain on the field still referenced `company_id`, leading to an invalid domain and traceback.
Solution:
--------------------------------------
Remove the company_id condition from the domain since the field no longer exists on `hr.work.entry.type`.
opw-6037286A small bug was causing the QR code on receipts generated for Spanish VAT invoices (l10n_es_edi_verifactu_pos) to have an incorrect URL format. This fix removes an extra slash, ensuring the QR code is properly generated and scannable, preventing issues with invoice processing. This ensures accurate invoice scanning and data retrieval.
Original PR description
Step to reproduce: - install "l10n_es_edi_verifactu_pos" - setup "ePOS printer" for a pos - open pos and settle a order below 400$ - notice we get l10n_es_edi_verifactu_qr_code in our receipt - click on "Print" Observation: - when you scan the qr code in invoice it contains `//` in it cause: - in recent commit [1] a typo is introduced which prepends `/` before barcode url, while barcode url starts with `/report/barcode` . https://github.com/odoo/odoo/blob/0d8eaeeb971f2f670aebb1b72ed03f4a2d5e0105/addons/l10n_es_edi_verifactu/models/verifactu_document.py#L293-L311 Fix: - remove extra `/` , which fixes the typo opw-6075474 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue preventing the Spanish SII demo environment from working correctly. We've successfully tested a new environment mirroring the AEAT (tax authority) system, ensuring it functions as expected. Importantly, this change maintains the demo company's VAT number, avoiding any unintended modifications.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255765 Forward-Port-Of: odoo/odoo#255377
This update corrects a bug where modifying a recurring event's start time caused duplicate meeting invitations to be sent to attendees via Outlook. The fix ensures Microsoft IDs are preserved, preventing these issues and improving the reliability of meeting synchronization.
Original PR description
When an attendee syncs a recurring event where the first occurrence (base event) was modified by the organizer, `_write_from_microsoft` falsely triggers the destructive recreation path. This happens because `_has_base_event_time_fields_changed` compares the exception's modified time against the seriesMaster's pattern time, detecting a "change" even though the master hasn't changed. This causes: - All non-base events lose their microsoft_id and ms_universal_event_id - The base event gets recreated without Microsoft IDs - A duplicate event is pushed to Outlook on the next odoo2microsoft sync - Spurious "join the meeting now" notifications are sent to attendees Add a `follow_recurrence` guard so that when the base event is an exception (follow_recurrence=False), the non-destructive else branch is taken instead, preserving all Microsoft IDs. Forward-Port-Of: odoo/odoo#256263 Forward-Port-Of: odoo/odoo#254414
This update fixes an issue where the system was incorrectly inflating monthly demand calculations for products using the 3-step warehouse delivery flow. The fix ensures that only the final shipment is considered when determining demand, leading to more accurate forecasting and inventory management. This improves the reliability of sales and purchasing projections.
Original PR description
**Steps to reproduce:** * Install *purchase_stock* and *sale_management* module. * Go to *Inventory > Configuration > Settings*. Enable *Multi-Step Routes*. * Go to *Inventory > Configuration >…
**Steps to reproduce:**
* Install *purchase_stock* and *sale_management* module.
* Go to *Inventory > Configuration > Settings*. Enable *Multi-Step Routes*.
* Go to *Inventory > Configuration > Warehouses*.
* Set the warehouse delivery flow to *Pick + Pack + Ship (3 steps)*.
* Create a new product. Under the *Purchase* tab, add a vendor.
* Create a sales order for this product with some quantity.
* Confirm the sales order. Validate all three generated transfers (*Pick*, *Pack*, *Ship*).
* Create a purchase order for the same vendor.
* In the purchase order line, click *Catalog* and search for the product.
**Observed behavior:**
* In the catalog view, the *Monthly Demand* is shown as *3x*
the original sales order quantity instead of the actual demand.
**Cause:**
* *Monthly Demand* is a computed field using `_compute_monthly_demand`,
which relies on `_get_monthly_demand_moves_location_domain()`.
* In a 3-step delivery flow, all related moves have a final location with usage set to *customer*.
* The domain condition: `('location_final_id.usage', 'in', ['customer', 'production'])`
counts all intermediate pickings.
* Additionally, the fallback condition: `[('location_final_id.warehouse_id', '!=', warehouse_id)]`
is always true because *customer* locations are not linked to a warehouse.
* As a result, all three pickings are counted, inflating the demand. See: https://github.com/odoo/odoo/blob/6bbaea728dbcba49776e813c70dff649d041bdc9/addons/purchase_stock/models/product.py#L144-L157
**Fix:**
* Prevent counting intermediate pickings in 3-step delivery by
restricting the domain to moves with `move_dest_ids = False`,
ensuring only the final move is considered for monthly demand computation.
---
opw-5453991
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#256228
Forward-Port-Of: odoo/odoo#244180This update fixes an issue where invoices generated from timesheets incorrectly displayed the total hours as the quantity instead of the correct number of days. The change ensures that timesheet hours are converted to the Sale Order Line's UoM (Days) before being applied to the invoice, resulting in accurate invoice quantities. This improves the reliability of invoicing based on timesheets.
Original PR description
Steps to reproduce: -------------------------- 1. Install sale_timesheet 2. Create a quotation with a timesheet-based product - Set quantity = 3 - Set UoM to Days (timesheet UoM is Hours) 3. Confirm…
Steps to reproduce: -------------------------- 1. Install sale_timesheet 2. Create a quotation with a timesheet-based product - Set quantity = 3 - Set UoM to Days (timesheet UoM is Hours) 3. Confirm the quotation and click on the smart button Recorded. 4. Record 16 hours of timesheets. 5. Create an invoice using a timesheet period (starting from SO date) 6. Check the invoice quantity Issue: ----------- The invoice quantity is incorrect. It assigns the hour value (e.g., 16) to the invoice line even though the SOL is configured in "Days" (expected 2 days for 16 hours). Cause: ----------- After this commit c3b6053, The `_recompute_qty_to_invoice` method sums timesheet `unit_amount` (in hours) and assigns it directly to `qty_to_invoice` without converting it to the sale order line UoM when a timesheet period is applied. Solution: --------------- Convert the aggregated timesheet hours into the SOL UoM before assigning it to qty_to_invoice. opw-6024804 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255790 Forward-Port-Of: odoo/odoo#254273
This update resolves a crash that occurred when closing the AI chat window in Odoo. The issue stemmed from an unintended sorting process within the system's record management, leading to incorrect data updates. The fix ensures the AI chat window can be closed without causing a system error.
Original PR description
Before this commit, closing an AI chat window could lead to the following crash: ```js TypeError: Cannot read properties of undefined (reading '_raw') ``` Steps to reproduce: - have no chat windows…
Before this commit, closing an AI chat window could lead to the following crash: ```js TypeError: Cannot read properties of undefined (reading '_raw') ``` Steps to reproduce: - have no chat windows open, cache cleared. - open DM with demo in chat window from messaging menu, in home menu. - open AI chat, from systray. - close the AI chat window. => crash This happens because when closing the AI chat window, it deletes the AI conversation. By deleting the AI conversation, it removes the conversation from `store.menuThreads`, which is the list of conversations to display in messaging menu. Removal of this conversation in `menuThreads` is done internally through ```js const index = recordList.indexOf(record); recordList.splice(index, 1); ``` This is done that way as to reuse custom methods of `RecordList`, especially the `splice()` that is used by many methods that mutate the record list. Internal code of the custom `splice` method does `slice()`, which is used to retrieve some records without mutating the record list. In practice, these `.slice()` were accidentally mutating the list, because they invoke the `Proxy.getter` of the `RecordList`, and when the list is flagged for `computeOnNeed` / `sortOnNeed`, invoking this `Proxy.getter` would mistakenly enable the `computeInNeed` / `sortInNeed` flags and thus mutate the list, e.g. with a sort, which may change the order of items and mess up the `index` computed in `indexOf()` step. This is what happens with the chat window. The `menuThreads` looked something like this: ```js menuThread = ["thread_1", "thread_2", "thread_3"]; ``` With the removal of `thread_2`, the `.indexOf()` is `1`, but due to `.slice()` triggering the sort, the list was changed to: ```js menuThread = ["thread_2", "thread_1", "thread_3"]; ``` ... And it instead removed `thread_1` but kept `thread_2` in list. This introduce 2 problems: - `thread_1` is mistakenly removed from relation when it shouldn't - `thread_2` is kept, but since this is a local id with no actual record in store, `recordList[index]` would return `undefined` as there's no existing record matching this local id. This commit fixes the issue by improving internal code of record list methods to avoid accidental triggering of lazy re-compute and re-sort. The accidental re-compute and re-sort come from invoking non-implemented array methods on the proxy of record, such as: - `recordProxy.at()` - `recordProxy.slice()` These methods were just used meant to retrieve records from the record list, and they did so by using accessing through `recordProxy`. This approach has the benefit to look good as this is exactly the same as the external API, but it has the unintended side-effect of the re-compute / re-sort of lazy fields. Instead of using these methods, records are retrieved with: - raw access to get local ids in relation - convert local ids to raw records through raw access in `store.recordByLocalId` This approach, while uglier, has the benefit to not accidentally trigger the re-compute / re-sort. opw-5761279 Forward-Port-Of: odoo/odoo#251769
The URL used to send e-invoices to the Serbian government has been updated. This update ensures that our Odoo system continues to correctly transmit invoices to the appropriate authorities, complying with Serbian regulations. This change was necessary due to a recent update from the Serbian government.
Original PR description
**PROBLEM** The url to send e-invoice to the serbian government has changed. opw-6055622 Forward-Port-Of: odoo/odoo#256095
This update fixes an issue where stock lot costs were incorrectly calculated across multiple companies. Previously, the system stored a single cost value, leading to inaccurate valuations when using FIFO lot valuation. Now, the cost calculation dynamically adjusts based on the specific company, ensuring accurate inventory accounting in multi-company setups.
Original PR description
Field avg_cost was set to store=True in 42d3e34, but the compute method _compute_avg_cost() is company-context-dependent (calls _run_fifo which filters by env.company). Storing a single value causes incorrect valuations in multi-company databases with FIFO + lot valuation. In multi-company setups with shared products (company_id=False), the lot's avg_cost would compute in one company's context and store that value globally, causing all other companies to see the wrong cost. Fix: Remove store=True to compute dynamically per company context. Cannot use company_dependent=True as it requires JSONB migration. opw-5446941 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253937 Forward-Port-Of: odoo/odoo#247278
This update fixes an issue where mixed POS orders (with both regular sales and settlement lines) weren't being properly validated. The change ensures that settlement lines are correctly identified, preventing incorrect validation and maintaining accurate financial reporting for Saudi POS transactions. This update aligns with newer Odoo versions and improves the reliability of the integration.
Original PR description
# Description of the issue/feature this PR addresses: From saas-18.3 onward, the pos_settle_due module introduced a new method to identify settlement lines. While the old method **isSettleDueLine()**…
# Description of the issue/feature this PR addresses: From saas-18.3 onward, the pos_settle_due module introduced a new method to identify settlement lines. While the old method **isSettleDueLine()** is still there, the new **isAnySettleLine()** covers both order settlement and invoice settlement. This change was not reflected in the Saudi POS EDI integration during forward-porting, which caused incorrect validation when processing POS orders containing both regular sale lines and settlement lines. # Current behavior before PR: - Orders containing a mix of new sale lines and settlement lines could bypass the intended validation. - The validation logic relied on the old isSettleDueLine() method # Desired behavior after PR is merged: - Update the validation flow to use isAnySettleLine() (when available) to correctly detect settlement lines. - Prevent validation of POS orders that contain both settlement lines and new sale lines. - Ensure compatibility with newer versions of the pos_settle_due module and restore the intended settlement validation behavior. - Test case to ensure no regression on this feature I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr) Forward-Port-Of: odoo/odoo#256177 Forward-Port-Of: odoo/odoo#254275