Monday, September 7, 2026
24 changes · saas-19.3
Resolved issues and error corrections
Non-admin accounting users can now view and choose email templates when sending payment reminders. This prevents an access error during the reminder workflow, helping accounting teams complete follow-ups without administrator intervention.
Original PR description
**Steps to reproduce:**
1. Log in as demo user
2. Go to Accounting > Customers > Invoices
3. Select at least one invoice and click on "Send Reminder"
4. Attempt to change or view the available choices in the "Email Template" field.
**Issue:**
An AccessError is raised:
`You are not allowed to access 'Model' (ir.model) records.`
**Cause:**
The view domain on `template_id` was set to `[('model_id.model', '=', 'res.partner')]`. Traversing `model_id.model` forces the ORM to evaluate security permissions on the `ir.model` relation, which fails for non-admin users.
opw-6452738This fix prevents users from saving public holidays without the payroll information needed to calculate payslips. It avoids a payroll crash when generating payslips for months that include those holidays, making the process more reliable.
Original PR description
**Steps to reproduce:** 1. Install Payroll and Time Off modules on v19.2. 2. Create a public holiday via the form view (Time Off -> Configuration -> Public Holidays). Do not enter a work entry type…
**Steps to reproduce:**
1. Install Payroll and Time Off modules on v19.2.
2. Create a public holiday via the form view (Time Off -> Configuration -> Public Holidays). Do not enter a work entry type and save.
3. Open Payroll and try to create a payslip for any employee in the same month as the public holiday you will face below traceback.
**Issue:**
The `work_entry_type_id` is required for payroll calculations. If it is null the `_round_days` calculation evaluates an empty recordset, producing a [ValueError](https://github.com/odoo/enterprise/blob/39095789c2b6a7e558d11f479a249871b3b800b6/hr_payroll/models/hr_payslip.py#L1021
).
While in this [PR](https://github.com/odoo/odoo/pull/254666/changes) made this field was made required in the
list view, it was missed in the form view. This allows users to save a holiday without a work entry type, crashing payslip generation later.
**Solution:**
Make the `work_entry_type_id` field required in the form view as well to prevent the creation of inconsistent public holiday records.
**Traceback:**
```.py
File "/home/odoo/src/enterprise/saas-19.2/hr_payroll/models/hr_payslip.py",
line 1021, in _round_days
day_rounded = float_round(days, precision_rounding=precision_rounding,
rounding_method=work_entry_type.round_days_type)
File "/home/odoo/src/odoo/saas-19.2/odoo/tools/float_utils.py", line 152, in
float_round
raise ValueError(msg)
ValueError: unknown rounding method: False
```
opw-6477587
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#283762French point-of-sale invoices for customers using the UBL 2.1 e-invoicing format now download as regular invoices instead of incorrectly falling back to pro-forma PDFs when customer data prevents external submission. This lets the sale continue and gives the customer the expected invoice, while avoiding unintended transmission to external services.
Original PR description
## Steps to reproduce: - Create a customer with France E-Invoicing (UBL2.1) as eInvoice format in a French company - Go to the PoS, select that partner - Make a sale and ask for an invoice - The…
## Steps to reproduce: - Create a customer with France E-Invoicing (UBL2.1) as eInvoice format in a French company - Go to the PoS, select that partner - Make a sale and ask for an invoice - The downloaded invoice will be a pro-forma invoice ## Why the fix: The pro-forma should not be used here, it is because it is used as a fallback when we get an error while trying to print the invoice. https://github.com/odoo/odoo/blob/4a508586970e44367bbdbbb3cbe88ffb5a1eadb7/addons/account/models/account_move.py#L6187-L6204 As we get an error while trying to send the data with this setup, it goes to the fallback and prints a pro-forma invoice, even though this should not be the case, a regular invoice would do. This happens because when an error is found, we do not populate invoice_pdf_report_id, so it goes to the fallback. We now check if there are any errors in the order, and if there are and the customer requests an ubl_21_fr invoice, we just print the invoice as it is, without going to the pro-forma fallback, as this is not the intended flow. With this fix, we now have the same flow as we do in the sales module, that allows the sale even if the customer has missing data. It will just print the invoice and allow the sale but won't send anything to external entities. opw-6428369 Forward-Port-Of: odoo/odoo#281420
Fixed an issue where selling and invoicing a shared product in Point of Sale could fail when another company's vendor and replenishment data was cached. The change ensures only vendor information relevant to the active company is considered, allowing multi-company POS sales to proceed without access errors.
Original PR description
**Steps to reproduce:** - Install PoS and Purchase - Make 2 companies, A and B - On product "Office Lamp" that is accessed by both companies, put Partner A in the vendor tab for company B - Company A…
**Steps to reproduce:**
- Install PoS and Purchase
- Make 2 companies, A and B
- On product "Office Lamp" that is accessed by both companies, put Partner A in the vendor tab for company B
- Company A should have a Partner A and Partner B in this tab
- In the stock, set a replenishment for company A, with Partner A on Office Lamp
- Go to company B and open the PoS
- Try to buy Office Lamp while requesting an invoice
- An access error appears
**Why the fix:**
When requesting an invoice in the PoS, we try to create the stock picking. Doing so will trigger the replenishment rules linked to the product to be recomputed.
Those are executed when we **flush_all()**, processing Company A's replenishments as sudo(), meaning all of Company A's **seller_id** are fetched and cached. This means the product's **seller_ids** now contains Company A's **seller_id**, even though we are currently in Company B.
While trying to get the product's code, we iterate over **product.seller_ids**, but we do not have access to every record in that product.
https://github.com/odoo/odoo/blob/b8e5291d103d9f43bd8db6d2dfe708076a57ea37/addons/product/models/product_product.py#L337-L343
As we don't have access to those, we get an access error when we stumble upon it.
To avoid those errors, we now filter the sellers to only have the ones compatible with our current Company in the given product we are currently buying.
Another solution would be to do **product.invalidate_recordset(['seller_ids'])** before looping over it, but feels more like a band-aid than the current fix IMO.
We could also write **self.lines.product_id.mapped('code')** in **_create_order_picking(self)** to have the solution be in PoS directly, but the error might arise from somewhere else at some point, and this just hides the issue by adding the code to the cache so that we don't have to fetch it again later.
opw-6308182
Forward-Port-Of: odoo/odoo#275354This fix corrects how the Belgian employment bonus is calculated when payroll corrections are made. It helps ensure affected payslips and payroll accounting reflect the right amounts, reducing the risk of incorrect employee pay or reporting.
Original PR description
In case of correction, the employment bonus was wrongly computed. This commit fixes the issues with a more generic approach.
FedEx shipments can now use a phone number from either the main customer contact or the selected delivery address. This prevents delivery validation failures when one of the related contacts is missing a phone number but the other has it.
Original PR description
Issue ----- Users cannot deliver to a contact's delivery address if the contact address itself doesn't have a phone number. Steps to reproduce ----- - Setup Fedex - Create a contact with no phone number - Create a delivery address for the contact (with phone number) - Create a SO with the contact using Fedex & confirm - Change the partner on the picking to use the delivery address - Validate the picking > Error: missing phone number Cause ----- To populate the `soldTo` part of thepayload, we call `_get_contact_from_partner` with the contact specified on the SO https://github.com/odoo/enterprise/blob/8e60f910a52e3b836e997e54a0b704e5786a28f2/delivery_fedex_rest/models/delivery_fedex.py#L171 https://github.com/odoo/enterprise/blob/8e60f910a52e3b836e997e54a0b704e5786a28f2/delivery_fedex_rest/models/fedex_request.py#L447-L452 The phone number is then taken directly from the contact. ----- Ticket: opw-6427962 Forward-Port-Of: odoo/enterprise#127434
The Belgian payroll eco voucher wizard can now be opened from any payroll batch that includes eco vouchers. It also only shows employees who actually have eco vouchers in that selected batch, reducing payroll processing mistakes.
Original PR description
Allow to open the eco vouchers wizard from any payrun that contains eco vouchers. Also, this commit limits the wizard to the employees that have a payslip with eco vouchers in that specific batch.
Weekly overtime in My Timesheets now uses the employee schedule's Total hours instead of the Full Time Equivalent value. This makes overtime calculations consistent for flexible schedules and aligns My Timesheets with Planning and All Timesheets.
Original PR description
# How to reproduce - Set the current employee's schedule to one with : - Schedule Type : Flexible - Total : a different amount than "Full Time Equivalent" - Go to My Timesheets - Add a new line with…
# How to reproduce
- Set the current employee's schedule to one with :
- Schedule Type : Flexible
- Total : a different amount than "Full Time Equivalent"
- Go to My Timesheets
- Add a new line with some Time Spent > 0
- Hover the bottom right cell of the grid (this is the total overtime for the week)
# The issue
The computation of the overtime for the week is based on "Full Time Equivalent" instead of "Total". This is inconsistent with the Planning app and the All Timesheets view.
# Cause
This [PR] introduced the usage of `full_time_required_hours` to compute the total overtime. This field was used because `hours_per_week` ("Total") was thought to be computed using `resource.calendar.attendance`. However, that is not the case when the schedule is flexible : https://github.com/odoo/odoo/blob/46d3fee5812b8406aac2244baa76b0daeef358c2/addons/resource/models/resource_calendar.py#L220 https://github.com/odoo/odoo/blob/46d3fee5812b8406aac2244baa76b0daeef358c2/addons/resource/models/resource_calendar.py#L163-L166
[PR]: https://github.com/odoo/enterprise/pull/81057
opw-6303520
Forward-Port-Of: odoo/enterprise#130087
Forward-Port-Of: odoo/enterprise#125510Belgian CodaBox SODA imports now use the actual last SODA import date when checking for new statements. This prevents payroll statements generated during the same accounting period from being skipped, helping companies keep salary accounting complete and up to date.
Original PR description
Before v19.1, we used to set the date on the journal entry based on the generation date of the SODA statement during the import. So it was possible to use the last date found in the salary journal as a `date_from` filter when fetching new SODA statements. Starting from v19.1, we now set the date on the journal entry as the last day of the accounting period referenced in the SODA file. However, we didn't change the fetching logic accordingly. If a SODA statement is generated on July 7 for the accounting period of July, the date on the journal entry would be July 31 and, consequently, any other SODA statement generated in-between those dates would be filtered out during the fetch. Ticket: opw-6214589 Forward-Port-Of: odoo/enterprise#130183
Employee availability is now shown consistently across Time Off and Attendance, including days outside a contract and flexible work schedules. This prevents misleading calendar displays by greying out unavailable periods and ensures employees without contracts are treated the same across apps.
Original PR description
purpose: 1- We should have a consistent way to compute `_gantt_unavailability` of employees in time off and attendance. Currently, some cases have inconsistent behavior such as out of contract days,…
purpose:
1- We should have a consistent way to compute `_gantt_unavailability` of employees in time off and attendance. Currently, some cases have inconsistent behavior such as out of contract days, flexible and fully flexibe employees. 2- In time off calendar view, if the employee does not have a contract at all, the current working schedule will appear in the calendar and it will not be greyed out. This is inconsistent with the behavior of the attendance application.
Fix:
1:
- implemented `_get_employee_unavailable_intervals` in employee model to be used in both time off and attendance.
- more optimized than the old implementation in time off as it calls `_work_intervals_batch` once per calendar instead of calling it for each contract in `_unavailable_intervals_batch`
- greys out "out of contract" periods
- for flexible and fully flexible employees, the whole period is considered available except leave periods
- for duration based calendars, morning and afternoon map to 12 hours of availability and full day maps to 24 hours of availability
- made `_get_calendar_periods` use version date start instead of contract date start and corrected a bug in tz conversion 2:
- made `_get_unusual_days` return True for all the days outside of contracts for the employee instead of not returning anything for them or getting values from the working schedule of the employee (means that they will be greyed out in the callendar view) and added a test for it
task-id: 5473055
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#258604Employee availability is now shown consistently across Attendance and Time Off planning views. Days outside an employee's contract are correctly greyed out, and flexible work schedules are handled more accurately, reducing confusion for managers reviewing calendars.
Original PR description
purpose: 1- We should have a consistent way to compute `_gantt_unavailability` of employees in time off and attendance. Currently, some cases have inconsistent behavior such as out of contract days,…
purpose:
1- We should have a consistent way to compute `_gantt_unavailability` of employees in time off and attendance. Currently, some cases have inconsistent behavior such as out of contract days, flexible and fully flexibe employees. 2- In time off calendar view, if the employee does not have a contract at all, the current working schedule will appear in the calendar and it will not be greyed out. This is inconsistent with the behavior of the attendance application.
Fix:
1:
- implemented `_get_employee_unavailable_intervals` in employee model to be used in both time off and attendance.
- more optimized than the old implementation in time off as it calls `_work_intervals_batch` once per calendar instead of calling it for each contract in `_unavailable_intervals_batch`
- greys out "out of contract" periods
- for flexible and fully flexible employees, the whole period is considered available except leave periods
- for duration based calendars, morning and afternoon map to 12 hours of availability and full day maps to 24 hours of availability
- made `_get_calendar_periods` use version date start instead of contract date start and corrected a bug in tz conversion 2:
- made `_get_unusual_days` return True for all the days outside of contracts for the employee instead of not returning anything for them or getting values from the working schedule of the employee (means that they will be greyed out in the callendar view) and added a test for it
task-id: 5473055
Forward-Port-Of: odoo/enterprise#113498Users can now see the correct reconciliation models when managing models from bank statement lines tied to foreign currency journals. This prevents confusion and saves time by ensuring models created for journals such as EUR bank journals appear as expected.
Original PR description
### Issue before this commit: When clicking "Manage Models" from a bank statement line, the associated reconciliation models are not displayed when belonging to a foreign currency journal. ### Steps…
### Issue before this commit: When clicking "Manage Models" from a bank statement line, the associated reconciliation models are not displayed when belonging to a foreign currency journal. ### Steps to reproduce the issue: 1. Download Accounting 2. Go to Currencies and activate another currency like EUR 3. Go to Journals and create a new one with bank type and curency EUR 4. Go to dashboard > new test bank journal created > 3 dots in the upper-right corner > Models > create a new one (ex Tester) setting the new test bank created as journal 5. Go to test bank journal and create a new bank matching 6. After the line is created click the 3 dots and go to Manage Models 7. See that the new model Tester created does not appear ### Cause of the issue: Foreign currency journals append their currency to the display_name (e.g., "Bank (EUR)"). The JS search framework passes this full decorated string into the search domain. The backend then attempts to match "Bank (EUR)" exactly in the database name and code fields, which fails because the database name is "Bank" without the currency added. https://github.com/odoo/odoo/blob/9c67949be529eb86886b3d5bde08e81e048ecfe7/addons/account/models/account_journal.py#L1095-L1100 ### Reason to introduce the fix: The filter is not working correctly. In this case it's better to change it to a domain instead of a default filter. opw-6481970 Forward-Port-Of: odoo/enterprise#129992
A cleanup job no longer removes valid embedded document actions when users are working under a different company. This prevents saved journal entry shortcuts in Documents from disappearing unexpectedly in multi-company setups.
Original PR description
Step to reproduce: - You must have at least 2 companies with an account Journal - Create a New Journal Entry actions (child or parent) - Embed it to a folder - Set your company on a different one than the journal's one - Run the Garbage collector cron (Base: Auto-vacuum internal data) - The embed action has been removed The cause of this is that in the `_get_base_server_actions_domain` method in `documents_account` module there is a check on company to avoid using/running the actions when not in the right company. But the garbage collector don't need to have this check. Task-6147618 Forward-Port-Of: odoo/enterprise#122821
This fix ensures the translation test mode only changes translations for databases where that test module is installed. It prevents hidden test characters from leaking into translations on other databases hosted by the same server, reducing the risk of unexpected text changes for users.
Original PR description
The module introduced in [PR](https://github.com/odoo/odoo/pull/253629) has a side-effect when updating the translation, for whatever reason, the overridden __iter__ [file reader…
The module introduced in [PR](https://github.com/odoo/odoo/pull/253629) has a side-effect when updating the translation, for whatever reason, the overridden __iter__ [file reader classes](https://github.com/odoo/odoo/blob/0f905e81b1c69d6c5dd2a7facf2a772f86036450/addons/test_translation_mode/tools/translate.py#L80-L93) were being used eventhough a given DB hosted on the same server **had not** installed `test_translation_mode`. How to reproduce locally * locally, generate at least two distinct saas-19.3 DB * run odoo-bin with a db-filter that whitelists both * start it up * Go to DB-A, and install a new language and check the JSONB columns (e.g. "name" on ir.model) -> All good * Go to DB-B do the same -> all good * On DB-B, install `test_translation_mode` -> the PO files get reloaded and the strings will have the bitmap encodings * (Without shutting down the odoo-bin instance) Switch to DB-A. Reload a given language -> The PO files will be re-read and ALSO have the bitmap encodings * Uninstall `test_translation_mode` on DB-B and restart odoo-bin. Then reload languages -> Problem gone What is happening: The way the [module works](https://github.com/odoo/odoo/blob/saas-19.3/addons/test_translation_mode/tools/translate.py) is by overriding the base file reader classes used in the standard update translation code base. But as is, this means when the module get's initialized for any DB, it will override the class for the whole python runtime and inject `contextualize_entry()` into the __iter__ attribute of the Class, defacto modifying the file readers classes for all DBs on a given server and changing the behaviour of updating the language files and translations stored in SQL. Proposed stable fix: Make `contextualize_entry()` "context" specific, i.e. check if the DB that calls the file readers has the module installed, if not, return the unmodified value instead of the overridden value with the hidden unicode characters. OPW-6485935 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Colombian point-of-sale receipts now include the required DIAN tax authority information when generated in the frontend. This helps businesses provide compliant receipts to customers and avoids missing fiscal details at checkout.
Original PR description
Receipts are now generated in POS using the `generateReceiptData` function. This commit extends this function and adds all the data necessary to properly show the receipt in Colombian POS. opw-6414901 Forward-Port-Of: odoo/enterprise#112881
Fixes an issue where resending a rejected Saudi e-invoice to ZATCA could fail with an error. This helps businesses retry rejected submissions smoothly without technical intervention.
Original PR description
Sending an invoice to ZATCA again after it was rejected raises a traceback. Steps to reproduce the error: - Install the ``l10n_sa_edi`` module with demo data - Switch to the Saudi Arabian company. -…
Sending an invoice to ZATCA again after it was rejected raises a traceback.
Steps to reproduce the error:
- Install the ``l10n_sa_edi`` module with demo data
- Switch to the Saudi Arabian company.
- Create a new invoice:
- Customer: ``Your Company``
- Add two invoice lines:
- Line 1: Price = 1, Tax = 15% Sales
- Line 2: Price = -1, Tax = 0% EX G
- Confirm the invoice.
- Click Send, select To ZATCA, and click Send(Invoice will be rejected by ZATCA)
- In the ZATCA tab, click the Retry button on the record.
After [commit], ``l10n_sa_qr_code_str`` is set to False for rejected invoices at [1].
When the rejected invoice is sent again, the QR code is applied to ``signed_xml`` at [2].
However, ``l10n_sa_qr_code_str`` is False, causing a traceback when its value is assigned to ``qr_node.text``.
https://github.com/odoo/odoo/blob/7c5362afdff8a5bba8593087ce8fbb04ef3a0fb2/addons/l10n_sa_edi/models/l10n_sa_edi_document.py#L279-L281
[commit]:https://github.com/odoo/odoo/commit/71e43c97ba344202114ff283360ebc5edd796a61
[1]:https://github.com/odoo/odoo/blob/7c5362afdff8a5bba8593087ce8fbb04ef3a0fb2/addons/l10n_sa_edi/models/zatca_mixin.py#L22-L26
[2]:https://github.com/odoo/odoo/blob/7c5362afdff8a5bba8593087ce8fbb04ef3a0fb2/addons/l10n_sa_edi/models/l10n_sa_edi_document.py#L291
Solution:
Prevent the QR code from being applied when ``l10n_sa_qr_code_str`` is False.
sentry-7674776014
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prOdoo now warns users before sending Turkish Nilvera e-invoices that contain invoice lines Nilvera would reject, such as lines without taxes or missing required product classification details. This helps businesses catch problems earlier and avoids failed invoice submissions, while excluding note and section lines from unnecessary warnings.
Original PR description
Nilvera does not accept invoices with lines that do not have taxes, so we added a valiation check for sending the invoice to warn the user. Additionally, we raise a warning when a line does not have a product and has an empty CTSP. However, if the line is a note or section, this warning should not be triggered. task-6404409 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#284969 Forward-Port-Of: odoo/odoo#284377
Credit notes created from existing Turkish customer invoices now use the correct sales return account from the journal, matching manually entered credit notes. This helps keep sales and return accounting separated correctly for Turkish reporting, while cancellation reversals still mirror the original invoice as required.
Original PR description
The Turkish chart of accounts keeps sales and sales returns on separate accounts, and the sales journal carries the account to use for returns. A credit note typed in by hand already lands on it, but one created from an existing customer invoice did not. Reversing an invoice copies `account_id` over from the invoice line, and since that field is a stored compute without depends, nothing ever recomputes it, so the return kept the sales account. Set the journal account on the copied product lines instead. Reversals made to cancel an entry are left alone, as those have to mirror the original move exactly for the two to net out, and a plain duplicate is untouched. Task-6438412 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284808 Forward-Port-Of: odoo/odoo#282858
Fixes Colombian retention reports so partial vendor credit notes correctly reduce the taxable payment amount instead of increasing it. This helps businesses produce accurate withholding certificates and tax reporting figures.
Original PR description
**STEP TO REPRODUCE** 1. install l10n_co_reports and account_accountant 2. Create a bill, with a line with a retention tax (3.50% RteFte). 3. Create a partial credit note (unit price less than what's on the bill). 4. Goes to the report 'Certificado de Renteciòn en Fuente', and notice the Monto del Pago Sujeto Retenciòn is not correct. **CAUSE** The sql query multiply tax_base_amount by -1 if debit > 0, which means (because we are dealing with vendor bills) the line is from a credit note, but tax_base_amount is already a signed value so credit notes ends up contributing to the tax base amount while they should reduce it. opw-6235830 Forward-Port-Of: odoo/enterprise#130340 Forward-Port-Of: odoo/enterprise#119716
The French PDP reporting flow now checks and shortens report values before submission, reducing the risk that a whole report is rejected for invalid text, VAT, country, or address data. Problematic journal entries are marked as errors and left out of the report so valid entries can continue to be processed.
Original PR description
Some Flow 10 values are generated without applying the length and format constraints expected by the PPF. Long free-text values, oversized VAT numbers, and invalid address data can therefore cause an entire report to be rejected. Limit product names and invoice notes to their allowed lengths and normalize country codes. Validate the declarant SIREN, VAT number lengths, and address values before sending so affected journal entries are marked as errors and excluded from the report. No Task id Forward-Port-Of: odoo/odoo#286817 Forward-Port-Of: odoo/odoo#286536
This fix prevents Point of Sale sessions from failing to close when orders include both a lot-tracked product and kit products that use it as a component. The system now correctly totals quantities across multiple matching order lines, improving reliability for stores selling product kits.
Original PR description
**Step to reproduce :** 1. Create Product A and enable lot tracking for it. 2. Create a Kit product and add Product A as one of its components. 3. Go to PoS and create orders using: - Product A - The…
**Step to reproduce :** 1. Create Product A and enable lot tracking for it. 2. Create a Kit product and add Product A as one of its components. 3. Go to PoS and create orders using: - Product A - The Kit product - A combination of Product A and the Kit product 4. Create three different orders with these combinations. 5. Try to close the PoS session. **Issue :** An error occurs when attempting to close the PoS session. The issue is in the pos_mrp module, specifically in the _get_lot_line_qty method. When accessing the following line: `lines_data[move.bom_line_id.bom_id.product_tmpl_id.product_variant_id.id]['order_lines'].qty` we expect order_lines to contain a single record. However, in this scenario, multiple order lines can be returned for the same product. As a result, accessing .qty directly on order_lines raises a singleton error. **Solution :** With this fix, we first retrieve the quantity from each order line and thensum the quantities together. This ensures that multiple matching order lines are handled correctly and prevents the singleton error when closing the PoS session. opw-6442765 Forward-Port-Of: odoo/odoo#285612 Forward-Port-Of: odoo/odoo#281622
This fixes an error that blocked warehouse users from recording a partial failed quantity on manually created quality checks. Pickings can now continue correctly when only part of a checked quantity fails, reducing operational interruptions in quality control flows.
Original PR description
Version: -------- - 19.0+ Steps to reproduce: ------------------- - Install `quality_control` module - Create a picking order with a product - From the gear menu, create an on-demand Quality Check -…
Version:
--------
- 19.0+
Steps to reproduce:
-------------------
- Install `quality_control` module
- Create a picking order with a product
- From the gear menu, create an on-demand Quality Check
- Set the check to *Control per Quantity* and back to the picking
- Set the done quantity to 10
- Open the Quality Check wizard
- Try to fail 3 units
Issue:
------
Validating the partial failure raises a `ValidationError`:
- Missing required value for the field 'Team' (team_id)
The quality check split is not performed and the picking cannot be processed.
Cause:
--------
Quality checks created on-demand from the picking (via the gear menu) have
no associated `quality.point` or `stock.move.line` — only
`picking_id` is set at creation time.
https://github.com/odoo/enterprise/blob/7d40d6b787511bf2fcbf581859ed2cd38ba3f658/quality_control/models/quality.py#L457
In `_move_to_failure_location()`, the `move_line` branch assumes
`check.move_line_id` is populated. Since it is empty for on-demand
checks, the split logic operates on an empty recordset.
The new quality check for the split is then created via:
https://github.com/odoo/enterprise/blob/7d40d6b787511bf2fcbf581859ed2cd38ba3f658/quality_control/models/quality.py#L493
At this point both `failed_move_line` (a copy of the empty move line) and
`check.point_id` are empty. `_get_check_values(False)` cannot derive
fields normally sourced from the quality point (`team_id`, `company_id`,
`measure_on`, `test_type_id`, etc.), causing the `ValidationError` on record creation.
Fix:
----
- If the quality check is not linked to a move line, find the matching move line
from the picking before splitting the failed quantity.
https://github.com/odoo/enterprise/blob/7d40d6b787511bf2fcbf581859ed2cd38ba3f658/quality_control/models/stock_move_line.py#L94-L97
- `_get_check_values()` normally takes values from a Quality Point.
Since on-demand quality checks do not have one, fill the missing
values (`team_id`, `measure_on`) from the original quality check instead.
This allows manually created quantity-based quality checks to be
split correctly after a partial failure.
---
opw-6428749
Forward-Port-Of: odoo/enterprise#130275
Forward-Port-Of: odoo/enterprise#126505This fixes an issue where importing multiple Belgian SODA files at once could incorrectly copy accounting lines from the first file into the second. The change ensures each imported file is processed independently, improving accuracy for payroll/accounting data imports.
Original PR description
Due to this commit: https://github.com/odoo/enterprise/commit/93c05b380e3c939e3c0b44eafcd7a41e86042d2d When importing 2 sodas from drag and drop. Due to the placement of the line_ids variable, the second move would have the line of first. By placing the variable in the loop we don't have that problem anymore task-6528101 Forward-Port-Of: odoo/enterprise#130190
This fix restores the ability to drag and drop table cells on mobile devices when editing content. It prevents mobile browser touch behavior from interrupting the drag action, making table editing more reliable for users working on phones or tablets.
Original PR description
Steps to Reproduce - Insert a table inside a Todo item. - Long-press the table menu to open the drag-and-drop overlay. - Try to drag and drop table cells. Issue: - Table cells cannot be dragged and dropped on mobile devices. Cause: - On mobile devices, the browser fires `pointercancel`/`pointerleave` during a drag operation, which ends the drag operation prematurely. As a result, subsequent `pointermove` events are not triggered causing the drag-and-drop operation to fail. Solution: - Add `touch-action: none` to the table menu element. This prevents the browser default touch handling from interfering with the drag operation, allowing `pointermove` events to continue and drag-and-drop to work correctly on mobile devices. task-6201176 Forward-Port-Of: odoo/odoo#283866 Forward-Port-Of: odoo/odoo#267680