Daily updates from Odoo
Navigate
Branch
Monday, February 2, 2026
185 changes
32 changes
New functionality added to Odoo
This update adds support for processing payments through Mollie payment terminals directly in the Point of Sale (POS) system. Users can link their Mollie account and the system will initiate payments via the Mollie API, with automatic notifications upon completion. Refunds are also supported without requiring customers to re-enter their card details.
Original PR description
This commit adds the `pos_mollie` module which implements payments via Mollie payment terminals in the POS. Since Mollie was already supported for online payments via the `payment_mollie` module, this module depends on it so they can share the same API credentials. The user links their Mollie account via an API key, and provides the ID of their payment terminal in the payment method. The Odoo DB can then initiate payments on the terminal via the Mollie API. When the payment completes, Mollie calls a webhook endpoint on the Odoo DB which then notifies the POS of the outcome. Refunds are also supported, they do not require the client to present their card again, the payment is simply reversed. task-5474076 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242836
Enhancements to existing features
This update ensures the TDS XLSX report for Russian tax compliance is now aligned with official utility formats. By integrating partner data from AML records, the report now accurately handles miscellaneous entries, resolving previous formatting issues and improving data reliability for tax reporting.
Original PR description
This commit aligns the TDS XLSX report with the official TDS utility format. Additionally, We now fetch the partner from AML record, so even miscellaneous entries generate a correctly formatted XLSX sheet. task-5237518 Forward-Port-Of: odoo/enterprise#104753
This update allows you to easily update all your Odoo modules using a single command. Previously, updating modules was limited and could cause unexpected issues. Now, the `odoo-bin` command can update all installed modules with the latest versions, streamlining the update process.
Original PR description
Before this commit: Using the CLI, there is no practical way to update any modules with an updated version. Running: `$ odoo-bin module upgrade base --outdated` would not work as intended as it would…
Before this commit: Using the CLI, there is no practical way to update any modules with an updated version. Running: `$ odoo-bin module upgrade base --outdated` would not work as intended as it would check version change only on the `base` module. Even if it worked, this would update every module. This is not the point here as it could cause side effects if not used properly After this commit: Enhanced module update logic to support updating all installed modules when `all` is passed in the argument. Running: `$ odoo-bin module upgrade all --outdated` will update all modules for which the version has been updated Note: `all` keyword as been used to be coherent with `--update all` CLI command, see: https://www.odoo.com/documentation/19.0/developer/reference/cli.html#cmdoption-odoo-bin-u Documentation PR: odoo/documentation#15513 Extension from: https://github.com/odoo/odoo/pull/202571 Feature proposed on: https://github.com/odoo/odoo/pull/202571#discussion_r2128993414 Task [link](https://www.odoo.com/odoo/project.task/4585261) task-4585261 Forward-Port-Of: odoo/odoo#237780
This update simplifies the setup of salary rules within Odoo by improving the display of options in the list view and streamlining the selection process. The changes enhance readability and ensure that salary rules are configured more efficiently, reducing potential errors.
Original PR description
This commit refactors the way input default values are handled in the Salary Rule configuration to support dynamic data types and improves the readability of the rule selector list view. Changes: 1. List View Improvements: - Added a computed field `list_display_default_value` to `hr.salary.rule`. - This field dynamically returns the correct default value string based onnthe `input_unit` (Text, Selection, or Checkbox), ensuring the List View displays a single, populated column instead of multiple sparse columns. 2. Dynamic Selection Options: - Replaced the `input_default_selection` dropdown on the parent record with an `is_default` boolean flag on the child options line. - Added a Python constraint to ensure only one option can be flagged as default per rule. 3. Views: - Updated `hr.salary.rule` form view to include the new One2many options list. - Updated `hr.salary.rule.selector.list` to use the new smart display field.
This update simplifies the mention plugin in Odoo by removing unnecessary protections around mention nodes. This change improves performance and reduces complexity within the composer interface. Additionally, redundant code related to mentions has been removed.
Original PR description
Currently, mention nodes are protected using the ProtectedNode plugin to avoid issues when editing the content of the composer. Considering we don't nessecarily need to protect mention nodes with no mutation allowed on them, we can remove the protection on mention nodes. Also, remove reduntant MENTION_SELECTORS task-5264818 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237351
Resolved issues and error corrections
This update fixes an issue where users couldn't edit the 'Email From' and 'Reply To' fields in marketing email templates. Previously, these fields were automatically set to 'done', preventing customization. Now, these fields are fully editable, allowing for greater flexibility in campaign design and communication.
Original PR description
Currently when a user creates a new template from a marketing campaign, they can’t edit the `email_from` and `reply_to` fields, even though these should be editable in the template. **Steps to…
Currently when a user creates a new template from a marketing campaign, they can’t edit the `email_from` and `reply_to` fields, even though these should be editable in the template. **Steps to replicate:** * Install `marketing_automation` * marketing automation > Create a New campaign > Add a new activity * Mail template > Create a new template > Settings **Observed Behavior:** The fields `Send From` and `Reply To` are not editable which should be editable. **Root cause:** * After commit [1], the form view `mailing_mailing_view_form_marketing_activity` [2] was removed, so `email_from` and `reply_to` now come from the view [3]. Because that view inherits the `mass-mailing form`, its `readonly` rules apply (see [4]), and with `default_state` set to “done” (see [5]), those fields become `readonly` when creating a new mail template. **Solution:** Modify the readonly conditions to match how they were handled in earlier versions (see [6]). **Before:** <img width="1182" height="591" alt="image" src="https://github.com/user-attachments/assets/72006a7f-1ee5-40dd-8899-4eb932f503b7" /> **After:** <img width="1182" height="591" alt="image" src="https://github.com/user-attachments/assets/d5d6bdf2-1fb6-4e7b-9527-412c44986050" /> [1]: https://github.com/odoo/enterprise/commit/a469218b32943ddaa83271565e73311cfd188f84 [2]: https://github.com/odoo/enterprise/blob/97f6f87cca3939e48d3488672aba0df68acd8f9b/marketing_automation/views/mailing_mailing_views.xml#L75-L143 [3]: https://github.com/odoo/enterprise/blob/307b23b0f6b377c43463a04aabf0b2f03c256072/marketing_automation/views/mailing_mailing_views.xml#L107 [4]: https://github.com/odoo/odoo/blob/9e04aadb83d482d05fc2fa66fa3c3bebb6ac1528/addons/mass_mailing/views/mailing_mailing_views.xml#L328-L337 [5]: https://github.com/odoo/enterprise/blob/97f6f87cca3939e48d3488672aba0df68acd8f9b/marketing_automation/views/marketing_activity_views.xml#L23 [6]: https://github.com/odoo/enterprise/blob/97f6f87cca3939e48d3488672aba0df68acd8f9b/marketing_automation/views/mailing_mailing_views.xml#L96 opw-5401422,5449345,5369836 Forward-Port-Of: odoo/enterprise#101807
This update fixes an issue where users wouldn't receive a warning when entering invalid email addresses during shared sign request declines. Now, the system validates email formats and displays a clear warning message, preventing incorrect data entry and improving the user experience. This ensures data integrity for shared agreements.
Original PR description
Version: - saas-18.4 Steps to reproduce: - Create a shared sign request. - Try to decline the sign request. - Enter an email address in an invalid format. Issue: - No warning is shown to the user for an invalid email and An RPC_ERROR appears in the console. - This happens because the _check_signer_email_validity constraint fails when signer_email is not valid. Solution: - Validate the email format when the user submits the refusal request. - Show a warning message if the email format is invalid. task-5454929 Forward-Port-Of: odoo/enterprise#103146
This update fixes an issue where the UrbanPiper store identifier field was visually overflowing its container. The changes include wrapping the field and button in a container with flexible width and overflow-hidden styling, resulting in a cleaner and more user-friendly display of this key information.
Original PR description
Before this commit: --- - The UrbanPiper store identifier field could overflow its container. After this commit: --- - Wrap the store identifier field and action button in a container. - Apply `overflow-hidden` and flexible width to the store identifier field. task-5472992 Forward-Port-Of: odoo/enterprise#103464
This update resolves an issue in the report editor where Chrome browsers incorrectly handled selections within t-if/t-else structures. This fix ensures that editor commands like adding fields work reliably across Chrome, improving the user experience for PDF quote report editing. The change was triggered by a bug in Chrome's selection API.
Original PR description
This happens only on Chrome, when switching between two identical t-if/else structures. In Odoo's t-if/t-else structures, Chromium may fail to properly update the selection when switching between two…
This happens only on Chrome, when switching between two identical t-if/else structures. In Odoo's t-if/t-else structures, Chromium may fail to properly update the selection when switching between two structurally identical elements via the group switcher. This happens because Chrome's implementation of the [Selection API](https://www.w3.org/TR/selection-api/#selectionchange-event) contains an optimization that suppresses the 'selectionchange' event if the new Range has the same logical coordinates (Node type and Offset) as the previous one, even if the underlying DOM node reference has changed. This can break editor commands such as `/table` or `/field` like in the following steps: Steps: - Install `sale_management` and `web_studio` - Open report editor on PDF Quote - Add a new column to the left in the table - Click on the table body - Select `t-else` in the group switcher - Click again at the same place - (Here the selection is not correctly set by chromium) - Try to use `/field` to add a field - It will not work as field selector doesn't have the right selection You can use this [video](https://drive.google.com/file/d/1ua7nlla7km1_l-wqgL8zeHaM-tFLA9jJ/view) to reproduce it easily or you reproduce it [here](https://stackblitz.com/edit/javascript-v65edaq5?file=index.html,index.js) If you click after the “1” and then after the “2,” you will see that Chromium does not fire the selectionchange event, whereas Firefox does. This commit fixes this by adding a "removeAllRanges()" to force Chrome to "forget" the old range. This ensures that the next selection is correctly treated. opw-5219989 Forward-Port-Of: odoo/odoo#244743
This update resolves an issue that previously prevented users from duplicating journal entries containing outdated accounts. Now, users can successfully duplicate entries with deprecated accounts, correct the accounts in the draft, and post the entry. The system validates only during the posting stage, ensuring flexibility in using historical entries as templates.
Original PR description
Before this commit, duplicating a journal entry that contained a deprecated account raised a validation error immediately. This blocked the duplication process entirely, preventing users from using historical entries as templates. This commit changes the validation to be done in write function and post. Now, users can duplicate an entry with a deprecated account, correct the account in the draft, and post successfully. Validation only blocks the user if they attempt to post the entry without fixing the deprecated account. or if the user inserted a deprecating account while editing the move. task-5417810 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#243782 Forward-Port-Of: odoo/odoo#240230
This change clarifies how product settings are managed by preventing users from editing the 'Packagings' field directly within the product view. Previously, editing was possible from both the product and product template views, causing confusion. This fix ensures 'Packagings' settings are consistently managed on the product template, aligning with user expectations.
Original PR description
## Short functional explanation of the error When creating a variant, we can click on it and it will show the field "packagings" on the product view, which is editable. However, packagings are…
## Short functional explanation of the error When creating a variant, we can click on it and it will show the field "packagings" on the product view, which is editable. However, packagings are managed on the product template view, where the field is also editable. This creates confusion for the users, as it doesn't align with the sentence on the view "All general settings about this product are managed on the product template". ## Reproduction Steps 1. Create a product. In the Attributes & Variants tab, create a variant. 2. The smart button Variants should appear. Click on it. 3. In the list view, click on the variant you just created. 4. Under Sales, modify the Packagings field. 5. Click on 'the product template' blue text. The product template popup appears. 6. Go to Sales tab and modify the Packagings Field. ### Expected behavior The packagings should be editable only on the product template view. ### Unexpected behavior The packagings is also editable on the product.product view. ## Origin of the issue Missing a readonly="1" in the xml of product.product view __ opw-5065419 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A recent update caused a crash when uploading images with URLs, specifically when the URL was provided as a 'bytearray'. This fix ensures that bytearrays are correctly converted to standard 'bytes' before URL detection, resolving the error and restoring reliable image uploads. This prevents disruptions to the import process.
Original PR description
The recent mimetype refactor reintroduced a crash where `python-magic` fails on `bytearray` inputs with a `TypeError` (ctypes buffer mismatch). Steps to reproduce: - Have python-magic library installed - Products > Import records - Upload a file containing an URL as image_1920 - Test upload The upload fails with error: `Could not retrieve URL: <img-url> [image_1920: L1]: argument 2: TypeError: wrong type` This restores the fix from 7f36e380c0b175d0046a19f49e572944a5b307d9 by ensuring `bytearray` inputs are converted to `bytes` before detection. opw-5893097
This update fixes a technical error in the attendance and overtime system, preventing a system crash when approving overtime. The issue stemmed from a misconfigured link between attendances and overtime records. This ensures the system functions correctly when managing overtime approvals.
Original PR description
…vertime
STEP TO REPRODUCE: (hr_Work_entry need to be installed to be tested fromt he frontend) ------------------
1- Create an overtime rule with this configuration :
quantity rule differs from hours defined in the contract
2- Create two attendances on the same day (should be a worked day and should not be today)
one from 1AM-2PM
second from 2PM-undefined
3- Approve the overtime of the first attendance
REASON:
------
If hr_work_entry is installed a traceback will be raised because the link between overtime to attendance is not correctly done Attendance -> overtime (only the first attendance have a link with overtime) overtime, attendance -> the two will be returned
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#246478This update resolves an issue where overtime approvals weren't consistently linked to employee attendance records. Previously, only one attendance was associated with overtime, leading to inaccurate reporting. This fix ensures all relevant attendance records are correctly linked to overtime, improving the reliability of time tracking data.
Original PR description
…dance and overtime
STEP TO REPRODUCE:
------------------
1- Create an overtime rule with this configuration :
quantity rule differs from hours defined in the contract
2- Create two attendances on the same day (should be a worked day and should not be today)
one from 1AM-2PM
second from 2PM-undefined
3- Approve the overtime of the first attendance
REASON:
------
The link between overtime to attendance is not correctly done Attendance -> overtime (only the first attendance have a link with overtime) overtime, attendance -> the two will be returned
Forward-Port-Of: odoo/enterprise#105988This update corrects a bug that caused duplicate default appointment slots to be created when scheduling appointments. The fix ensures that slots are only added once, preventing scheduling conflicts and improving appointment booking accuracy. This resolves a user-reported issue impacting appointment scheduling functionality.
Original PR description
Steps to reproduce: - Install website_appointment - Go to the frontend and create a new appointment from there - The appointment created has its default slots duplicated When creating an appointment type, it's possible that we end up creating the default slots two times by passing in the compute of the category and then the onchange linked to category_slot_scheduling. Technically, when we were in the onchange after the compute, slot_ids was populated by NewId records. So when assigning and creating a second time the default slots, the NewId would at the end become real records and the new one were added on top. Now we add a check on the previous category to create the default slot only when we came from a custom appointment and reset them if it is now a custom one. task-5499200 Forward-Port-Of: odoo/enterprise#104482
This update resolves an issue where users couldn't see all available Starshipit delivery services. The fix ensures Odoo sends complete shipment details to Starshipit, allowing users to select the correct service based on their order information, leading to a smoother and more accurate delivery setup process.
Original PR description
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this…
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this data to determine availability, it returns an incomplete list during setup. Expected behaviour: Users should be able to view and select from the complete list of valid delivery services based on the actual Sales Order details (address, weight, and volume). Steps to reproduce: 1. Create new delivery method 2. Configure Starshipit API credentials. 3. Attempt to select a service. 4. Observe that not all service is shown from the available options. Cause of the issue: Starshipit filters services based on sender, receiver, and package info. Odoo requests the service list during initial configuration without this context, resulting in an incomplete list of methods. Fix: Introduce a mechanism in the Sales Order flow to add delivery methods. Send the complete shipment details (addresses, weight) to Starshipit to retrieve the accurate list of services and allow the user to select them. Forward-Port-Of: odoo/enterprise#103316
This update resolves an issue where the UBL export incorrectly interpreted VAT indicators (specifically the '/' symbol). It ensures that VAT information is accurately represented in UBL documents, complying with PEPPOL standards. This fix is important for accurate invoice processing and compliance with international regulations.
Original PR description
To signify that you know a partner does not have vat, we advise using '/'. But we should take care of that in the UBL export, to not consider it a real vat Also, in the cases where we don't have the vat, the CompanyID is supposed to be mandatory. https://docs.peppol.eu/poacc/billing/3.0/syntax/ubl-invoice/cac-TaxRepresentativeParty/cac-PartyTaxScheme/ So, remove the whole PartyTaxScheme if vat is not present. Zatca does not override that rule (except enforcing that seller must have vat, which raises a constraint), so we modify the tests for the simplified documents. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245627 Forward-Port-Of: odoo/odoo#238499
This update resolves a problem that occurred during Odoo upgrades where the system incorrectly processed partner information. Specifically, the system expected only one record per partner when calculating document counts, but multiple records were found. This fix ensures accurate document counts during upgrades and normal operation.
Original PR description
When trying to compute the document count during the upgrade, we encountered a ValueError because multiple records were found for a partner. The system expected a singleton ``` File…
When trying to compute the document count
during the upgrade, we encountered a ValueError
because multiple records were found for a partner. The system expected a singleton
```
File "/home/odoo/src/enterprise/19.0/documents_hr/models/hr_employee.py", line 34, in _compute_document_count
('partner_id', '=', self.work_contact_id.id)
File "/home/odoo/src/odoo/19.0/odoo/orm/fields_misc.py", line 112, in __get__
raise ValueError("Expected singleton: %s" % record)
ValueError: Expected singleton: res.partner(11393, 11612, 13026, 13085, 13066, 11674, 13007, 11240, 11420, 13086, 2687, 8998, 10309, 8195, 8468, 6439, 8151, 6580, 7928, 10301, 11058, 10515, 5274, 9243, 8141, 8435, 8889, 7761, 7733, 8443, 8545, 9252, 8457, 9980, 5495, 11424, 6458, 10558, 11070, 8924, 11731, 11528, 11615, 11766, 13021, 13080, 11758, 11742, 9306, 8826, 11004, 9393, 8879, 9317, 11652, 13075, 11744, 11160, 11644, 11763, 11416, 11618, 11732, 7931, 3846, 8442, 10299, 7916, 8429, 8057, 11061, 9342, 6435, 6553, 6512)
```
Forward-Port-Of: odoo/enterprise#101902This update resolves a technical issue preventing "Access Rights" users from accessing the documents application. The change restricts access to certain features and visibility within the application, ensuring only administrators can utilize advanced functionalities. This improves the user experience for a broader range of users.
Original PR description
Internal Users with the "Access Rights" access right were not able to open the documents application, which raised an access error traceback on the `ai_sort_prompt` field - which has restricted access to only admins. The access error was raised because the `ai_sort_prompt` field was added to the search_panel_fields for users with Access Rights access rights. We changed it so it is only added when users have the document system adminstrator role. We also changed the document_service's start method to also define the documentSystem user which is the system adminstrator user. With that we could limit visibility of the System Prompt item in the cog menu to those users. task-5375110 Forward-Port-Of: odoo/enterprise#105741
This fix ensures that Swiss payroll payslips generated from payruns display the employee's full name instead of a generic 'new payslip' title. The change corrects a technical issue where the system wasn't properly formatting the payslip name, leading to an inconsistent user experience. This improves clarity and professionalism for Swiss clients.
Original PR description
_ ## Short functional explanation of the error When generating a payslip from a payrun for an employee on the swiss localization, the name of the PDF payslip is simply "new payslip" instead of…
_ ## Short functional explanation of the error When generating a payslip from a payrun for an employee on the swiss localization, the name of the PDF payslip is simply "new payslip" instead of "Salary Slip - <name of employee> - <time period of the slip>" ## Reproduction Steps 1. Install the app l10n_ch_hr_payroll. 2. Make sure you use a Swiss company. 3. Go to Payroll and click on the Payslips tab > payslips. 4. Click on Pay Run. Select Switzerland: ELM salaries and click Continue. 5. Select an employee for which you'd like to generate the payslip. 6. Click on the employee row in the list view. 7. Click Compute sheet > Print. ## Expected behavior A PDF with name "Salary Slip - <employee name> - <time period>" is generated. ## Unexpected Behavior A PDF with name "new Payslip" is generated. ## Origin of the issue When printing the slip with this flow, we don't call the method ```_compute_name()``` used to compute the name of the current slip. Therefore, it stays at 'New Slip', which is the default name. Henceforth, we have to call this method manually when printing the slip. _ opw-5253811 Forward-Port-Of: odoo/enterprise#103471
This update resolves an issue where service products were missing a default packaging type. The previous XML ID was incorrect and no longer functional. This ensures service products are properly configured for EDI reporting in Kenya.
Original PR description
Update the xmlid for the default packaging type for service products, the previous one `l10n_ke_edi_oscu.packaging_type_ou` seems to have never existed. opw-5220129 Forward-Port-Of: odoo/enterprise#105905
This update resolves an issue where actions in the Documents app would fail when switching between languages. The system now filters actions to only include those associated with the currently active languages, ensuring a smoother user experience and preventing errors during language transitions. This improves stability and usability.
Original PR description
Filter Embedded Actions Based on Active Languages ### Impacted versions: 18.0 and later ### Steps to reproduce: - Install at least 2 languages - Install documents and accounting or other app to have actions on select - Uninstall one language - You will get an error when trying to activate again actions on select (also appears on network interface) ### Current behavior: When a language is deactivated, its corresponding translations may still appear in server actions, leading to errors when trying to add them to the context. This issue is now resolved by filtering actions to only include those linked to active languages. Task: [5420820](https://www.odoo.com/odoo/project/49/tasks/5420820) Forward-Port-Of: odoo/enterprise#102938
This update prevents visitors from seeing or attempting to use live chat commands like `/help` or `/leave`. Previously, these commands were visible, even though they weren't functional for non-users. This change improves the user experience and security by removing potentially confusing and unusable options.
Original PR description
**Current behavior before PR:** channel commands like `/help ` or `/leave` are visible to visitors even it is not functional for them. **Desired behavior after PR is merged:** commands are now hidden from visitors. task-4552209 related: [PR](https://github.com/odoo/enterprise/pull/82963) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246120 Forward-Port-Of: odoo/odoo#196737
This update hides live chat commands (like `/help`) from website visitors and guests. Previously, these commands were visible, creating a potential security risk and a confusing experience for non-users. This change enhances website security and provides a cleaner, more intuitive interface for legitimate users.
Original PR description
**Before PR:** channel commands like `/help ` or `/leave` and more are visible to visitors or guest even it is not functional for them. **After PR:** all commands are now hidden from visitors/guests. task-4548666 Forward-Port-Of: odoo/enterprise#105777 Forward-Port-Of: odoo/enterprise#82963
This update corrects a bug that caused incorrect overtime calculations when multiple overtime lines were assigned to consecutive time periods. The fix ensures that each overtime line is properly tracked and allocated, preventing errors in overtime reporting. This improves the accuracy of time tracking for employees.
Original PR description
To reproduce: ============= 1. Create an new Overtime Ruleset using these options: - The rule is based on: Timing - With tolerance in favor of the employer of: 00:00 - If the employer works: Outside…
To reproduce: ============= 1. Create an new Overtime Ruleset using these options: - The rule is based on: Timing - With tolerance in favor of the employer of: 00:00 - If the employer works: Outside of a specific schedule - Schedule: 40/hour work week - Pay extra hours: with rate of 100% - Work entry type to use: Overtime Hours - Give back as time off 2. Create an employee or edit an existing employee to use the overtime ruleset in the settings of the form view of the employee. 3. Navigate to attendance and create a new entry for that employee. 4. Make clock in time and clock out time run through a Friday. For example: Clock in: 12/22/2025 12:00:00 AM Clock out: 12/26/2025 6:30:00 AM 5. Then edit the entry to run through the Saturday or Sunday. For example: Clock out: 12/27/2025 6:30:00 AM 6. Navigate to Work Entries and navigate to the month or week that that entry was made at. 7. There should be a traceback error for more than one overtime line related to that specific entry. Problem: ======== When allocating multiple overtime lines to consecutive time periods, the `_set_real_overtime_intervals` method was merging them into single intervals with recordsets of overtime lines (e.g., hr.attendance.overtime.line(102, 106, 103, 104)) instead of keeping each overtime line in its own separate interval. This happened because the allocation logic incorrectly calculated the position within intervals and subtracted the wrong duration from remaining overtime, causing the `|=` merge operator to combine adjacent allocations into recordsets. Solution: ========= Refactored the overtime allocation loop to maintain singletons opw-[5468598](https://www.odoo.com/web#id=5468598&view_type=form&model=project.task) Forward-Port-Of: odoo/enterprise#105555
This update fixes an issue where attendee information wasn't correctly populated during event registration in the POS system. The change ensures that the first valid answer to identification questions (name, email, etc.) is used, prioritizing it over subsequent answers. This improves data accuracy and consistency for event attendee records.
Original PR description
When pos_event was added, a difference in behavior with the existing registration flow in website_event was missed. When answering an 'identification question' (name, email, phone, company_type) with…
When pos_event was added, a difference in behavior with the existing registration flow in website_event was missed. When answering an 'identification question' (name, email, phone, company_type) with the 'once per order' enabled, the values should be used and propagated directly on the created event.registration records, with precedence over other answers given to individual questions (not once per order) STEPS ===== 1. Create a new event with name, email questions, once per order ticked. 2. Go to POS (reload data if needed) 3. Register and answer both questions 4. Continue the pos flow until both registrations are created 5. Go to backend > your event > registrations 6. You can see that even if the answers are propagated in the o2m field registration_answer_ids, which is expected, the attendee's name and attendee's email fields are empty. They should contain the values of step 3. FIX === Align the website_event flow and precedence of OPO questions over individual answers in pos_event. Now, the first non-null answer of an OPO question will be used for each of the question_type values listed above, if any, over answers to individual questions. Also align the fact that after OPO answers, precedence should be given to the first non-null answer to a given question type for identification questions, and not the last as it is currently. Task-4919080 Forward-Port-Of: odoo/odoo#231502
This update addresses a potential source of instability in Odoo by ensuring SQL queries only access tables within the current database schema. Previously, Odoo was unintentionally using older schema data, leading to unexpected bugs and inconsistent behavior during startup and add-on installations. This change improves overall Odoo stability and reliability.
Original PR description
Description of the issue/feature this PR addresses: This is an addition to: - [x] #243833 - [x] #243967 Current behavior before PR (use case): - in database `odoodb` there's 2 PG schema `odoo_data` and `data_backup` - schema `data_backup` contains tables from an old version of Odoo - search_path is set to `odoo_data, "$user", public` (seen with `SHOW search_path;`) - so the `data_backup` schema should be ignored Then when you start Odoo, or install add-ons: - you experience inconsistent behavior, and strange bugs - this is due to SQL queries having access to the tables, and indexes in the other schema `data_backup` Desired behavior after PR is merged: - Odoo should ignore tables, indexes and objects which are not in the `current_schema`. @kmagusiak --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246440
This update enhances the performance of account reporting by optimizing the way data is filtered within key tables. The change ensures more efficient report generation, leading to faster processing times and improved user experience. This resolves a technical issue impacting report loading speed.
Original PR description
In addition to: - [x] #104936 And other PRs in Odoo core: - [x] odoo/odoo#243833 - [x] odoo/odoo#243967 - [ ] odoo/odoo#246440 Forward-Port-Of: odoo/enterprise#105960
This update fixes an issue where product names weren't consistently displayed in the correct language based on the user's current language setting. Previously, accessing a product name twice with different language contexts would result in the incorrect language being used. Now, the system always uses the specified language context when calculating and displaying product names, ensuring accurate translations for all users.
Original PR description
Description of the issue/feature this PR addresses: Compute of display_name in different languages that can be returned incorrect Current behavior before PR: When accessing two times in the same method the display_name of a configured product but the second time having a .with_context(lang=lang) other than the previous language, the returned display name will not be in the specified language as the cached value will be returned. Desired behavior after PR is merged: _compute_display_name should always take into account a change of language in context when the value is accessed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246489 Forward-Port-Of: odoo/odoo#242829
This update ensures that delivery carriers set on pickings are consistently applied to subsequent transfers, even when not initially defined in the sales order. This change addresses a previous limitation where carrier settings weren't automatically propagated, particularly in multi-step delivery flows managed by logistics teams. It improves delivery accuracy and streamlines the carrier selection process.
Original PR description
Issue Before This Commit: ================================ Previously, the delivery carrier was only propagated between pickings when it was set from the sale order. If the carrier was manually set…
Issue Before This Commit: ================================ Previously, the delivery carrier was only propagated between pickings when it was set from the sale order. If the carrier was manually set on a picking (e.g., during the packing step in a multi-step delivery flow), it was not propagated to the consequent pickings, even when the stock rules had `Propagation of carrier` enabled. Steps to reproduce: ================================ 1. Activate Multi-Step Routes and Delivery Methods. 2. Configure a 3-step delivery route in the warehouse and enable Propagate Carrier on all rules. 3. Create a sale order with a product but without setting a delivery carrier. 4. Confirm the sale order to generate picking. 5. On the first picking (i.e., pick), manually set a delivery carrier (e.g., Local Delivery) and validate. 6. On the next transfer (i.e., pack), observe that the delivery carrier is not propagated. After this commit: ================================ The delivery carrier set on any picking is propagated to subsequent transfers when the corresponding stock rule has `Propagation of carrier` enabled and no carrier is already configured on the next picking. This ensures consistent carrier propagation across all routing configurations (all pull rules, all push rules, and mixed push/pull flows), even when the carrier is configured at the picking level rather than on the sale order. This behavior is required because, in many business scenarios, carrier selection is managed by the logistics team rather than the sales team. task-4454313 Forward-Port-Of: odoo/odoo#243597 Forward-Port-Of: odoo/odoo#202700
This update prevents the eCommerce reporting menu from appearing to users without the necessary permissions. Previously, users were redirected to the website without a clear error message. The fix ensures a more user-friendly experience by displaying an access error when the menu is unavailable.
Original PR description
__Steps to reproduce on runbot:__ 1. Login with Mitchell Admin 2. Remove Marc Demo from the `sales_team.group_sale_salesman` access group (User: Own Documents Only) 3. Login with Marc Demo 4. Open…
__Steps to reproduce on runbot:__ 1. Login with Mitchell Admin 2. Remove Marc Demo from the `sales_team.group_sale_salesman` access group (User: Own Documents Only) 3. Login with Marc Demo 4. Open the Website app and go to Reporting > eCommerce => You are redirected to the website in frontend mode __Reason:__ Clicking on the eCommerce reporting menu calls `action_dashboard_redirect`, which redirects to the website if the user is not in `base.group_system`, `website.group_website_designer`, or `sales_team.group_sale_salesman`. Since Marc Demo is not in any of these groups, he is redirected to the website without any message, which is not very user friendly. __Fix:__ - Add the groups to the menu to prevent showing it if the user does not have access to it anyway. - Raise an access error instead of redirecting to the website to make it clear to the user that they cannot open the dashboard even if they could see it. This also fixes [`TestMenusDemo`] by preventing this menu from being tested with the demo user in case he doesn't have access to it. [`TestMenusDemo`]: https://github.com/odoo/odoo/blob/736b71202db840ba6a7ed7e7f014b5b7c493d589/addons/web/tests/test_click_everywhere.py#L41C9-L41C41 runbot-234747 Forward-Port-Of: odoo/odoo#244963
Features or functions removed from Odoo
This update streamlines the demo data for the Indian payroll module (l10n_in_hr_payroll) by removing redundant working schedules. The change consolidates the demo data to use a standard 40-hour work week, improving data consistency and reducing complexity. This simplifies the demo experience for users.
Original PR description
### Aim - In the demo data, there is no need to create multiple working schedules for Indian locations. - We can use a single working schedule of 40 hours per week. Task: 5899739
5 changes
Resolved issues and error corrections
This update fixes an issue where the UrbanPiper store identifier field was visually overflowing its container. The changes include wrapping the field and button in a container with a flexible width, ensuring a cleaner and more professional appearance for users interacting with the UrbanPiper integration.
Original PR description
Before this commit: --- - The UrbanPiper store identifier field could overflow its container. After this commit: --- - Wrap the store identifier field and action button in a container. - Apply `overflow-hidden` and flexible width to the store identifier field. task-5472992 Forward-Port-Of: odoo/enterprise#103464
This update resolves an issue where users couldn't see all available Starshipit delivery services. The fix ensures Odoo sends complete order details (address, weight) to Starshipit, allowing users to select the correct service based on their specific shipment information. This improves the user experience and accuracy of delivery options.
Original PR description
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this…
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this data to determine availability, it returns an incomplete list during setup. Expected behaviour: Users should be able to view and select from the complete list of valid delivery services based on the actual Sales Order details (address, weight, and volume). Steps to reproduce: 1. Create new delivery method 2. Configure Starshipit API credentials. 3. Attempt to select a service. 4. Observe that not all service is shown from the available options. Cause of the issue: Starshipit filters services based on sender, receiver, and package info. Odoo requests the service list during initial configuration without this context, resulting in an incomplete list of methods. Fix: Introduce a mechanism in the Sales Order flow to add delivery methods. Send the complete shipment details (addresses, weight) to Starshipit to retrieve the accurate list of services and allow the user to select them. Forward-Port-Of: odoo/enterprise#103316
This update fixes an issue where the rental report was displaying only the start date instead of the correct date range for each rental order. The fix ensures the report accurately reflects the start and return dates, providing more reliable rental reporting.
Original PR description
The rental report is a daily report with x rows by rental order, with x the days between the start and return dates. With generate_series inside the select, the query was creating x rows with the same id, resulting in the date field not being correctly displayed (one unique date, the start date). This fix corrects the generation of the report to display the real date on each row. opw-5266525 Forward-Port-Of: odoo/enterprise#104764
This update resolves an issue preventing the correct default packaging type from being applied to service products in the Kenyan EDI (OSCU) version of Odoo. The previous XML ID was invalid, and this change ensures service products are packaged appropriately for EDI reporting, improving compliance.
Original PR description
Update the xmlid for the default packaging type for service products, the previous one `l10n_ke_edi_oscu.packaging_type_ou` seems to have never existed. opw-5220129 Forward-Port-Of: odoo/enterprise#105905
This update resolves an issue where documents actions were incorrectly displayed and triggered when a language was disabled. The system now filters actions to only include those associated with the currently active languages, ensuring a smoother user experience and preventing errors.
Original PR description
Filter Embedded Actions Based on Active Languages ### Impacted versions: 18.0 and later ### Steps to reproduce: - Install at least 2 languages - Install documents and accounting or other app to have actions on select - Uninstall one language - You will get an error when trying to activate again actions on select (also appears on network interface) ### Current behavior: When a language is deactivated, its corresponding translations may still appear in server actions, leading to errors when trying to add them to the context. This issue is now resolved by filtering actions to only include those linked to active languages. Task: [5420820](https://www.odoo.com/odoo/project/49/tasks/5420820) Forward-Port-Of: odoo/enterprise#102938
14 changes
Resolved issues and error corrections
This update fixes an issue where the UrbanPiper store identifier field was visually overflowing its container. The changes include wrapping the field and button in a container with a flexible width, ensuring a cleaner and more professional appearance for users.
Original PR description
Before this commit: --- - The UrbanPiper store identifier field could overflow its container. After this commit: --- - Wrap the store identifier field and action button in a container. - Apply `overflow-hidden` and flexible width to the store identifier field. task-5472992 Forward-Port-Of: odoo/enterprise#103464
This update fixes a bug related to how the system handles responses from Zatca when obtaining CCSID or PCSID information. Previously, invalid responses went unnoticed, leading to user tracebacks. Now, the system checks for CSR field length and displays a helpful message to the user, ensuring smoother Zatca onboarding.
Original PR description
Previously, it was assumed that if no 'error' or 'errors' key was present that means we've received a valid response for obtaining CCSID or PCSID. But sometimes the error is not sent with those keys, and the binarySecurityToken is missing, therefore a traceback is shown to the user because the invalid requests passes through the validation unnoticed. This kind of response is the result of a new change introduced by zatca requiring csr fields to be at most 64 characters long. This commit improves the error handling mechanism of CSID responses, to show the user an informative message, and handles the length check for csr fields on the client side before sending to zatca. task-5347269 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246343 Forward-Port-Of: odoo/odoo#244507
This update resolves an error that occurred when employees had multiple commission plans linked to the same payslip input. The fix ensures accurate currency conversion for each commission, preventing a system failure and guaranteeing correct pay calculations for employees with complex commission structures. The issue was identified and corrected through a code change.
Original PR description
Currently, an error occurs while generating a payslip for an employee who is linked to more than one commission plan using the same payslip input. **Steps to Reproduce:** 1. Install the…
Currently, an error occurs while generating a payslip for an employee who is linked to more than one commission plan using the same payslip input. **Steps to Reproduce:** 1. Install the `hr_payroll_sale_commission` module. 2. Create a user and link to an employee. Set a contract for the employee. 3. Create two commission plans for the same user: - Use the same Payslip Input in both plans. - Set the Target Frequency to "Monthly" for both. 4. Generate a payslip for the employee. Ref: [Video](https://drive.google.com/file/d/1HhtUL2xznS_Aoi9ePL0OJLdGaXU8ZFZR/view?usp=sharing) **Error:** `ValueError - Expected singleton: sale.commission.report(30026010100009, 40026010100009)` **Cause:** When multiple commission records belong to the same payslip input, it tries to convert the commission amount using `coms.commission`, where coms has multiple recordsets. This leads to a singleton error during currency conversion. **Fix:** This commit ensures the currency conversion is applied per commission and prevents the singleton error. sentry-7187854690 Forward-Port-Of: odoo/enterprise#104464
This update resolves an issue that previously prevented users from duplicating journal entries containing outdated accounts. Now, users can successfully duplicate entries with deprecated accounts, correct the accounts in the draft, and post the entry. The system only flags the issue during the posting stage if the user doesn't address the deprecated account.
Original PR description
Before this commit, duplicating a journal entry that contained a deprecated account raised a validation error immediately. This blocked the duplication process entirely, preventing users from using historical entries as templates. This commit changes the validation to be done in write function and post. Now, users can duplicate an entry with a deprecated account, correct the account in the draft, and post successfully. Validation only blocks the user if they attempt to post the entry without fixing the deprecated account. or if the user inserted a deprecating account while editing the move. task-5417810 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#243782 Forward-Port-Of: odoo/odoo#240230
This update resolves an issue where users couldn't see all available Starshipit delivery services. The fix ensures Odoo sends complete sales order details (address, weight) to Starshipit, allowing users to select the correct and full list of services during setup. This improves the user experience and accuracy of delivery options.
Original PR description
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this…
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this data to determine availability, it returns an incomplete list during setup. Expected behaviour: Users should be able to view and select from the complete list of valid delivery services based on the actual Sales Order details (address, weight, and volume). Steps to reproduce: 1. Create new delivery method 2. Configure Starshipit API credentials. 3. Attempt to select a service. 4. Observe that not all service is shown from the available options. Cause of the issue: Starshipit filters services based on sender, receiver, and package info. Odoo requests the service list during initial configuration without this context, resulting in an incomplete list of methods. Fix: Introduce a mechanism in the Sales Order flow to add delivery methods. Send the complete shipment details (addresses, weight) to Starshipit to retrieve the accurate list of services and allow the user to select them. Forward-Port-Of: odoo/enterprise#103316
This update fixes an issue where the rental report was displaying incorrect dates. The fix ensures that each row in the report accurately reflects the start and return dates of a rental order, providing more reliable reporting data. This improves the accuracy of rental revenue tracking.
Original PR description
The rental report is a daily report with x rows by rental order, with x the days between the start and return dates. With generate_series inside the select, the query was creating x rows with the same id, resulting in the date field not being correctly displayed (one unique date, the start date). This fix corrects the generation of the report to display the real date on each row. opw-5266525 Forward-Port-Of: odoo/enterprise#104764
This update resolves an issue preventing service products from correctly applying their default packaging type in the Keňa (Kenya) localization. The previous XML ID was invalid, and this change ensures service products now utilize the appropriate packaging type as defined for Keňa EDI transactions.
Original PR description
Update the xmlid for the default packaging type for service products, the previous one `l10n_ke_edi_oscu.packaging_type_ou` seems to have never existed. opw-5220129 Forward-Port-Of: odoo/enterprise#105905
This update resolves an issue where documents actions would sometimes fail when multiple languages were enabled. The fix ensures that actions are only displayed and used for languages currently selected by the user, improving stability and preventing errors.
Original PR description
Filter Embedded Actions Based on Active Languages ### Impacted versions: 18.0 and later ### Steps to reproduce: - Install at least 2 languages - Install documents and accounting or other app to have actions on select - Uninstall one language - You will get an error when trying to activate again actions on select (also appears on network interface) ### Current behavior: When a language is deactivated, its corresponding translations may still appear in server actions, leading to errors when trying to add them to the context. This issue is now resolved by filtering actions to only include those linked to active languages. Task: [5420820](https://www.odoo.com/odoo/project/49/tasks/5420820) Forward-Port-Of: odoo/enterprise#102938
This update fixes an issue where EPD discounts weren't being accurately reflected for certain partner types. The change ensures that each partner with EPD discounts receives the correct discount loss line when reconciling payments and transactions. This improves the accuracy of financial reporting.
Original PR description
Steps: - create two invoices with a different partner (epd + no tax on the lines) - register for each a payment (payment method with no outstanding account) - select the two payments and create a batch - create a transaction with an amount equal to two payments (discounted amount) - reconcile it with the batch payment Issue There is only one epd discount loss line for one partner Cause: in https://github.com/odoo/odoo/blob/ecb4de3fea463d6524bb2aab8d2388c679dc2ed7/addons/account/models/account_move.py#L4638 The two lines share a common grouping dict key with the same `account_id`. `setdefault` returns the value if the key is existing. opw-5057109 Forward-Port-Of: odoo/odoo#226287
This update includes a new test case within the account_accountant_batch_payment module to ensure the reliability of batch payment processing. The test was created to address a potential issue identified in a related Community PR, improving the overall stability and quality of the Enterprise version. This ensures accurate and consistent payment handling.
Original PR description
Add test for PR opw-5057109 Forward-Port-Of: odoo/enterprise#94304
A recent test failure related to the restaurant appointment tour was resolved. The fix ensures the test environment uses a consistent, simulated time, preventing inconsistencies and making the test reliable. This improves the quality and predictability of our automated testing process.
Original PR description
The `RestaurantAppointmentTour` was failing inconsistently because the browser used the real system clock during the initial Point of Sale load, while the test data was created for a specific mock date (Jan 28). Because the PoS logic filters appointments based on the current time, the test data was being misinterpreted or "normalized" by the application before the tour had a chance to freeze the clock. Moving `Chrome.freezeDateTime` to the absolute first step of the tour ensures the simulated time is applied as early as possible, making the test deterministic. runbot-232601
This update ensures that when an upsell is confirmed on a subscription, all remaining alternative upsells are automatically cancelled. Previously, confirming one upsell would leave others in a pending state. This improves the subscription management process and prevents unnecessary order activity.
Original PR description
Currently, when creating multiple upsells for a specific subscription, confirming one of them leaves the others in the sent state instead of cancelling them. This fix ensures that all other upsells for the same subscription are cancelled once one upsell is confirmed. task-5270139 Forward-Port-Of: odoo/enterprise#105694 Forward-Port-Of: odoo/enterprise#100058
This update corrects a discrepancy in how event registration data is captured in the POS system. Previously, attendee information wasn't consistently populated, but now the system prioritizes the first valid answer to identification questions (like name and email) when 'once per order' is enabled, ensuring accurate attendee records. This improves data reliability for event management.
Original PR description
When pos_event was added, a difference in behavior with the existing registration flow in website_event was missed. When answering an 'identification question' (name, email, phone, company_type) with…
When pos_event was added, a difference in behavior with the existing registration flow in website_event was missed. When answering an 'identification question' (name, email, phone, company_type) with the 'once per order' enabled, the values should be used and propagated directly on the created event.registration records, with precedence over other answers given to individual questions (not once per order) STEPS ===== 1. Create a new event with name, email questions, once per order ticked. 2. Go to POS (reload data if needed) 3. Register and answer both questions 4. Continue the pos flow until both registrations are created 5. Go to backend > your event > registrations 6. You can see that even if the answers are propagated in the o2m field registration_answer_ids, which is expected, the attendee's name and attendee's email fields are empty. They should contain the values of step 3. FIX === Align the website_event flow and precedence of OPO questions over individual answers in pos_event. Now, the first non-null answer of an OPO question will be used for each of the question_type values listed above, if any, over answers to individual questions. Also align the fact that after OPO answers, precedence should be given to the first non-null answer to a given question type for identification questions, and not the last as it is currently. Task-4919080 Forward-Port-Of: odoo/odoo#231502
This update resolves a technical issue preventing tax calculations from processing correctly when product item codes exceeded 50 characters. The system now automatically truncates item codes to 50 characters before sending them to the AvaTax API, ensuring accurate tax calculations and preventing errors. This improves the reliability of our integration with AvaTax.
Original PR description
Link to Avalara (Avatax) documentation: https://developer.avalara.com/api-reference/avatax/rest/v2/models/LineItemModel/ Expected Behaviour: The itemCode sent to the AvaTax API should be 50…
Link to Avalara (Avatax) documentation: https://developer.avalara.com/api-reference/avatax/rest/v2/models/LineItemModel/ Expected Behaviour: The itemCode sent to the AvaTax API should be 50 characters or fewer to comply with Avalara's field length constraints. Actual Behaviour before the Fix: When an itemCode exceeded 50 characters, the system attempted to send the request as-is. This resulted in the AvaTax API returning an error, causing the transaction or tax calculation to fail. Behaviour with the Fix: The system now ensures that the itemCode adheres to the 50-character limit before the API call is made, by trancating the code to the first 50 characters if it exceeds 50 characters. This prevents API rejection and ensures successful tax processing for items with long identifiers. Steps to reproduce: 1. Create or select a product/item with a reference (or barcode if using UPC) longer than 50 characters. 2. Trigger an action that calculates tax via the AvaTax integration (e.g., creating an invoice or updating a line item). 3. Observe the API response. - Before fix: API returns a validation error regarding the itemCode length. - After fix: Request is successful as the itemCode is properly handled/validated. opw-5406451 Forward-Port-Of: odoo/enterprise#105017
7 changes
Resolved issues and error corrections
This update fixes an issue where the UrbanPiper store identifier field was visually overflowing its container. The changes include wrapping the field and button in a container with a flexible width, ensuring a cleaner and more professional appearance for users.
Original PR description
Before this commit: --- - The UrbanPiper store identifier field could overflow its container. After this commit: --- - Wrap the store identifier field and action button in a container. - Apply `overflow-hidden` and flexible width to the store identifier field. task-5472992 Forward-Port-Of: odoo/enterprise#103464
This update resolves an issue where users couldn't see all available Starshipit delivery services. The fix ensures Odoo sends complete sales order details (address, weight) to Starshipit, allowing users to select the correct and full list of services during setup.
Original PR description
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this…
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this data to determine availability, it returns an incomplete list during setup. Expected behaviour: Users should be able to view and select from the complete list of valid delivery services based on the actual Sales Order details (address, weight, and volume). Steps to reproduce: 1. Create new delivery method 2. Configure Starshipit API credentials. 3. Attempt to select a service. 4. Observe that not all service is shown from the available options. Cause of the issue: Starshipit filters services based on sender, receiver, and package info. Odoo requests the service list during initial configuration without this context, resulting in an incomplete list of methods. Fix: Introduce a mechanism in the Sales Order flow to add delivery methods. Send the complete shipment details (addresses, weight) to Starshipit to retrieve the accurate list of services and allow the user to select them. Forward-Port-Of: odoo/enterprise#103316
This update fixes an issue where the rental report was displaying incorrect dates. The fix ensures that each row in the report accurately reflects the start and return dates of each rental order, providing more reliable reporting data. This improves the accuracy of rental tracking and analysis.
Original PR description
The rental report is a daily report with x rows by rental order, with x the days between the start and return dates. With generate_series inside the select, the query was creating x rows with the same id, resulting in the date field not being correctly displayed (one unique date, the start date). This fix corrects the generation of the report to display the real date on each row. opw-5266525 Forward-Port-Of: odoo/enterprise#104764
This update resolves an issue where service products were not correctly assigned a default packaging type. The previous XML ID was invalid, and this change ensures service products now utilize the appropriate packaging type as required for accurate EDI reporting in Kenya.
Original PR description
Update the xmlid for the default packaging type for service products, the previous one `l10n_ke_edi_oscu.packaging_type_ou` seems to have never existed. opw-5220129 Forward-Port-Of: odoo/enterprise#105905
This update resolves an issue where document actions would fail after a language was deactivated. The fix ensures that actions are now filtered to only include those linked to currently active languages, preventing errors and improving stability. This enhances the user experience when managing multiple language versions of documents.
Original PR description
Filter Embedded Actions Based on Active Languages ### Impacted versions: 18.0 and later ### Steps to reproduce: - Install at least 2 languages - Install documents and accounting or other app to have actions on select - Uninstall one language - You will get an error when trying to activate again actions on select (also appears on network interface) ### Current behavior: When a language is deactivated, its corresponding translations may still appear in server actions, leading to errors when trying to add them to the context. This issue is now resolved by filtering actions to only include those linked to active languages. Task: [5420820](https://www.odoo.com/odoo/project/49/tasks/5420820) Forward-Port-Of: odoo/enterprise#102938
This update corrects a bug where canceled refunds were incorrectly included in global invoices generated from Point of Sale (PoS) orders. The fix filters out canceled refund lines, ensuring that only valid refunds are reflected in the invoice. This improves invoice accuracy and reporting for Mexican VAT compliance.
Original PR description
When generating global invoices for orders in the PoS, refund of those orders are also included in the global invoice. However, if the refund has been canceled, it should not be included in the global invoice. Steps to reproduce: ------------------- * Create a PoS order and validate it. * Go to the backend and create a refund for that order. * Cancel the refund. * Go to the PoS order list and select the original order * Click on "Generate Global Invoice" > Observation: The canceled refund is included in the global invoice. Why the fix: ------------ We simply filter out the canceled orders when searching for refunded order lines. opw-5492576 Forward-Port-Of: odoo/enterprise#105868
This update resolves a problem where long item codes were causing errors in the AvaTax integration. The system now automatically limits item codes to 50 characters, ensuring successful tax calculations and preventing transaction failures. This improves the reliability of our tax processing.
Original PR description
Link to Avalara (Avatax) documentation: https://developer.avalara.com/api-reference/avatax/rest/v2/models/LineItemModel/ Expected Behaviour: The itemCode sent to the AvaTax API should be 50…
Link to Avalara (Avatax) documentation: https://developer.avalara.com/api-reference/avatax/rest/v2/models/LineItemModel/ Expected Behaviour: The itemCode sent to the AvaTax API should be 50 characters or fewer to comply with Avalara's field length constraints. Actual Behaviour before the Fix: When an itemCode exceeded 50 characters, the system attempted to send the request as-is. This resulted in the AvaTax API returning an error, causing the transaction or tax calculation to fail. Behaviour with the Fix: The system now ensures that the itemCode adheres to the 50-character limit before the API call is made, by trancating the code to the first 50 characters if it exceeds 50 characters. This prevents API rejection and ensures successful tax processing for items with long identifiers. Steps to reproduce: 1. Create or select a product/item with a reference (or barcode if using UPC) longer than 50 characters. 2. Trigger an action that calculates tax via the AvaTax integration (e.g., creating an invoice or updating a line item). 3. Observe the API response. - Before fix: API returns a validation error regarding the itemCode length. - After fix: Request is successful as the itemCode is properly handled/validated. opw-5406451 Forward-Port-Of: odoo/enterprise#105017
11 changes
New functionality added to Odoo
This update adds the ability for customers to create wishlists and compare products directly within the website's sales pages. This improves the user experience by allowing customers to easily save and evaluate products they're interested in, streamlining the purchasing process.
Original PR description
Merge the website_sale_comparison and website_sale_wishlist modules, as well as the related submodules, into website_sale **Task:** 5089613
This update prepares Odoo for the UK Companies House's shift to digital iXBRL filings starting in 2027. It integrates with the Companies House API to automate the submission and monitoring of company accounts, ensuring compliance with new regulations. Users will now be able to manage these filings through the existing tax return menu.
Original PR description
The UK Companies House is moving to a software-only, digital filing system for company accounts starting 1 April 2027. All filings must be submitted in iXBRL format via approved commercial software. This addition integrates the companies house api, create the html submission file, submits and polls for the companies house response. The menu for the companies house is within the tax return.
Enhancements to existing features
This pull request ensures that all strings within the HR Referral module are properly translated, improving the user experience for international users. The change addresses a previously missed translation, enhancing the module's localization capabilities. This update supports Odoo's commitment to global accessibility.
Original PR description
Added translation missed in the PR: https://github.com/odoo/enterprise/pull/95399
This update modernizes the way subscription pricing is handled within Odoo Enterprise. The system now utilizes Product Pricelist Items instead of the previous Sale Subscription Pricing, increasing flexibility and reusability for recurring revenue models. This change streamlines pricing and simplifies future updates.
Original PR description
Removing Sale Subscription Pricing and using Product Pricelist Item instead for reusability purposes **Affected Version:** master **Task**:3830130
This update refactors the core logic for subscription pricing within Odoo Enterprise, streamlining the process and improving accuracy. The changes enhance how prices are calculated and applied, leading to more reliable subscription billing and a better user experience for customers. This work also includes security enhancements and bug fixes related to discount features.
Original PR description
Affected version: master Task-3830130
This update ensures that renaming a WhatsApp channel now applies to all users within the Odoo system, rather than just the individual who made the change. This improves team collaboration by maintaining consistent and recognizable conversation names across the organization. This change was driven by a task to improve channel management.
Original PR description
Before this commit, renaming a WhatsApp channel only affected the current user. After this commit, the channel name change is shared with all users, ensuring consistent conversation names across the team. Task-[5475084](https://www.odoo.com/odoo/project/1519/tasks/5475084) Related community PR: https://github.com/odoo/odoo/pull/243270
Resolved issues and error corrections
This update fixes an issue where users wouldn't receive a warning when entering invalid email addresses during shared sign request declines. Now, the system validates email formats and displays a clear warning message, preventing incorrect data entry and improving the overall user experience. This ensures data integrity and reduces potential errors.
Original PR description
Version: - saas-18.4 Steps to reproduce: - Create a shared sign request. - Try to decline the sign request. - Enter an email address in an invalid format. Issue: - No warning is shown to the user for an invalid email and An RPC_ERROR appears in the console. - This happens because the _check_signer_email_validity constraint fails when signer_email is not valid. Solution: - Validate the email format when the user submits the refusal request. - Show a warning message if the email format is invalid. task-5454929 Forward-Port-Of: odoo/enterprise#103146
This update clarifies WhatsApp channel access restrictions for users. Now, a message displays below the invitation link, indicating which groups are allowed to join. This prevents confusion and ensures users understand who can participate in the conversation.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ Users had no clear indication when a WhatsApp channel was restricted to a specific access group. This could lead to confusion about who was allowed to join the conversation through the invitation link. **Current behavior before PR:** --------------------------------- - The WhatsApp channel does not display any information about access restrictions. - Users cannot easily understand why some people cannot join the conversation. **Desired behavior after PR is merged:** ----------------------------------------- - An explicit message “Access restricted to group ‘Role / User’” is displayed below the WhatsApp channel invitation link. - Users can immediately understand that only members of the specified access group are allowed to join. **Task:** 5135950 **Related Community PR:** https://github.com/odoo/odoo/pull/236226
This update fixes an issue where users couldn't edit the 'Email From' and 'Reply To' fields when creating new email templates within marketing campaigns. The change restores the ability to modify these fields, ensuring users have full control over their email communications. This improves the flexibility and usability of the marketing automation features.
Original PR description
Currently when a user creates a new template from a marketing campaign, they can’t edit the `email_from` and `reply_to` fields, even though these should be editable in the template. **Steps to…
Currently when a user creates a new template from a marketing campaign, they can’t edit the `email_from` and `reply_to` fields, even though these should be editable in the template. **Steps to replicate:** * Install `marketing_automation` * marketing automation > Create a New campaign > Add a new activity * Mail template > Create a new template > Settings **Observed Behavior:** The fields `Send From` and `Reply To` are not editable which should be editable. **Root cause:** * After commit [1], the form view `mailing_mailing_view_form_marketing_activity` [2] was removed, so `email_from` and `reply_to` now come from the view [3]. Because that view inherits the `mass-mailing form`, its `readonly` rules apply (see [4]), and with `default_state` set to “done” (see [5]), those fields become `readonly` when creating a new mail template. **Solution:** Modify the readonly conditions to match how they were handled in earlier versions (see [6]). **Before:** <img width="1182" height="591" alt="image" src="https://github.com/user-attachments/assets/72006a7f-1ee5-40dd-8899-4eb932f503b7" /> **After:** <img width="1182" height="591" alt="image" src="https://github.com/user-attachments/assets/d5d6bdf2-1fb6-4e7b-9527-412c44986050" /> [1]: https://github.com/odoo/enterprise/commit/a469218b32943ddaa83271565e73311cfd188f84 [2]: https://github.com/odoo/enterprise/blob/97f6f87cca3939e48d3488672aba0df68acd8f9b/marketing_automation/views/mailing_mailing_views.xml#L75-L143 [3]: https://github.com/odoo/enterprise/blob/307b23b0f6b377c43463a04aabf0b2f03c256072/marketing_automation/views/mailing_mailing_views.xml#L107 [4]: https://github.com/odoo/odoo/blob/9e04aadb83d482d05fc2fa66fa3c3bebb6ac1528/addons/mass_mailing/views/mailing_mailing_views.xml#L328-L337 [5]: https://github.com/odoo/enterprise/blob/97f6f87cca3939e48d3488672aba0df68acd8f9b/marketing_automation/views/marketing_activity_views.xml#L23 [6]: https://github.com/odoo/enterprise/blob/97f6f87cca3939e48d3488672aba0df68acd8f9b/marketing_automation/views/mailing_mailing_views.xml#L96 opw-5401422,5449345,5369836 Forward-Port-Of: odoo/enterprise#101807
This update resolves an issue where new appointments were sometimes created with duplicate default time slots. The fix ensures that default slots are only created once, preventing confusion and ensuring accurate appointment scheduling. This improves the user experience and data integrity.
Original PR description
Steps to reproduce: - Install website_appointment - Go to the frontend and create a new appointment from there - The appointment created has its default slots duplicated When creating an appointment type, it's possible that we end up creating the default slots two times by passing in the compute of the category and then the onchange linked to category_slot_scheduling. Technically, when we were in the onchange after the compute, slot_ids was populated by NewId records. So when assigning and creating a second time the default slots, the NewId would at the end become real records and the new one were added on top. Now we add a check on the previous category to create the default slot only when we came from a custom appointment and reset them if it is now a custom one. task-5499200 Forward-Port-Of: odoo/enterprise#104482
This update resolves an issue where users couldn't see all available Starshipit delivery services. The fix ensures Odoo sends complete order details to Starshipit, allowing users to accurately select the correct service based on their shipment information. This improves the user experience and ensures accurate delivery options.
Original PR description
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this…
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this data to determine availability, it returns an incomplete list during setup. Expected behaviour: Users should be able to view and select from the complete list of valid delivery services based on the actual Sales Order details (address, weight, and volume). Steps to reproduce: 1. Create new delivery method 2. Configure Starshipit API credentials. 3. Attempt to select a service. 4. Observe that not all service is shown from the available options. Cause of the issue: Starshipit filters services based on sender, receiver, and package info. Odoo requests the service list during initial configuration without this context, resulting in an incomplete list of methods. Fix: Introduce a mechanism in the Sales Order flow to add delivery methods. Send the complete shipment details (addresses, weight) to Starshipit to retrieve the accurate list of services and allow the user to select them. Forward-Port-Of: odoo/enterprise#103316
9 changes
Resolved issues and error corrections
This update fixes an issue where users wouldn't receive a warning when entering invalid email addresses during shared sign request declines. Now, the system validates email formats and displays a clear warning message, preventing incorrect data entry and improving the overall user experience. This ensures data integrity and reduces potential errors.
Original PR description
Version: - saas-18.4 Steps to reproduce: - Create a shared sign request. - Try to decline the sign request. - Enter an email address in an invalid format. Issue: - No warning is shown to the user for an invalid email and An RPC_ERROR appears in the console. - This happens because the _check_signer_email_validity constraint fails when signer_email is not valid. Solution: - Validate the email format when the user submits the refusal request. - Show a warning message if the email format is invalid. task-5454929 Forward-Port-Of: odoo/enterprise#103146
This update fixes an issue where the UrbanPiper store identifier field was visually overflowing its container. The changes include wrapping the field and button in a container with a flexible width, ensuring a cleaner and more professional appearance for users.
Original PR description
Before this commit: --- - The UrbanPiper store identifier field could overflow its container. After this commit: --- - Wrap the store identifier field and action button in a container. - Apply `overflow-hidden` and flexible width to the store identifier field. task-5472992 Forward-Port-Of: odoo/enterprise#103464
This update resolves a problem where creating new contract templates in California within Odoo Enterprise 19.0 and later was blocked. The fix corrects a validation error that incorrectly checked the state filing status in the wrong module, ensuring proper contract template creation functionality. This improves the payroll process for US companies operating in California.
Original PR description
### Impacted versions: 19.0 and later ### Steps to reproduce: - Install l10n_us_payroll - Select California (CA) as the address for US company - Try to create new contract template ### Current behavior: state_filing_status should be validated in hr.employee instead of hr.version Task: [5458566](https://www.odoo.com/odoo/project/49/tasks/5458566)
This update resolves a bug preventing users from validating stock pickings after an invalid operation. The previous fix incorrectly blocked validation, now the system relies on the existing Mutex mechanism for sequential processing, ensuring accurate validation and preventing duplicate attempts.
Original PR description
### Steps to reproduce: - In the settings enable: Multi-Steps route - Create a product tracked by SN - In the barcode app > Operations > Internal transfers > New - Scan you tracked product - Click on…
### Steps to reproduce: - In the settings enable: Multi-Steps route - Create a product tracked by SN - In the barcode app > Operations > Internal transfers > New - Scan you tracked product - Click on Validate > Invalid operation - Scan a Serial number #### > You can not click on validate anymore ### Cause of the issue: The issue has been introduced in 41c6e7a90fd4f0cf84e74cf0ed036f4da0ec6112 in a try to avoid concurrency issue when calling the barcode validation too quickly. To be more precise, this commit added a `isValidating` property to the barcode model that is set prior to the rpc call and suppose to remove after in order tobypass subsequence calls of the `validate` method when a call is already in progress: https://github.com/odoo/enterprise/blob/099c7b94ad08f83873c05ec528e16fbf806f47f2/stock_barcode/static/src/models/barcode_model.js#L477-L494 However, in the present case and since orm call returns an error the the call the validate method is interupted at this orm call and the line https://github.com/odoo/enterprise/blob/099c7b94ad08f83873c05ec528e16fbf806f47f2/stock_barcode/static/src/models/barcode_model.js#L494 is not executed so that the this.Validating stays true and the button can not be clicked nor executed anymore: https://github.com/odoo/enterprise/blob/099c7b94ad08f83873c05ec528e16fbf806f47f2/stock_barcode/static/src/models/barcode_model.js#L131-L133 ### Fix: We revert the incorrect fix: 42d77e751cb5e049ea1e81b44fca0d07e8f45b32 and we rather rely on the Mutex class of the JS framework just as done in the `_processBarcode`: https://github.com/odoo/enterprise/blob/099c7b94ad08f83873c05ec528e16fbf806f47f2/stock_barcode/static/src/models/barcode_model.js#L505-L507 This will ensure that the validation calls will be processed sequentially and since the `button_validate` of stock pickings is ignored on done pickings because of the first soft fix https://github.com/odoo/odoo/pull/204790 : https://github.com/odoo/odoo/blob/1664daf894ec878b64af8ab75c0d10f05e00df80/addons/stock/models/stock_picking.py#L1134-L1135 we have the guarantee that the records will not be validated twice. opw-5388297 Forward-Port-Of: odoo/enterprise#104963 Forward-Port-Of: odoo/enterprise#103835
This update resolves a technical issue where the demo data for the Mexican payroll modules incorrectly set the company and partner names during installation. This prevented proper CFDI stamping of invoices and payment complements within the demo databases, ensuring accurate demonstration functionality.
Original PR description
The demo data of the Mexican payroll modules was overriding the company and partner name during installation, which can break the CFDI stamping flow for invoices and payment complements in demo databases. Forward-Port-Of: odoo/enterprise#105367 Forward-Port-Of: odoo/enterprise#102558
This update resolves a bug that caused incorrect schedule calculations when using planning slots linked to material-type resources. The fix restricts schedule computations to only include attendance records for the employee creating the record, ensuring accurate time tracking and preventing scheduling discrepancies.
Original PR description
Steps to reproduce: - Set the work entry source to planning for an employee. - Create an attendance for that employee. Issue: - Errors occurred when planning slots linked to material-type resources were included in schedule computation. Fix: - Restrict planning slots used for schedule computation to records whose employee_id belongs to self.ids. task-5476771
This update fixes an issue where users couldn't see all available Starshipit delivery services. The fix ensures Odoo sends complete order details to Starshipit, allowing users to select the correct service based on their shipment information. This improves the user experience and ensures accurate delivery options.
Original PR description
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this…
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this data to determine availability, it returns an incomplete list during setup. Expected behaviour: Users should be able to view and select from the complete list of valid delivery services based on the actual Sales Order details (address, weight, and volume). Steps to reproduce: 1. Create new delivery method 2. Configure Starshipit API credentials. 3. Attempt to select a service. 4. Observe that not all service is shown from the available options. Cause of the issue: Starshipit filters services based on sender, receiver, and package info. Odoo requests the service list during initial configuration without this context, resulting in an incomplete list of methods. Fix: Introduce a mechanism in the Sales Order flow to add delivery methods. Send the complete shipment details (addresses, weight) to Starshipit to retrieve the accurate list of services and allow the user to select them. Forward-Port-Of: odoo/enterprise#103316
This update resolves an issue where the default packaging type for service products in the l10n_ke_edi_oscu module was incorrectly configured. The previous XML ID no longer existed, leading to a potential error. This change ensures service products are correctly packaged for EDI reporting in Kenya.
Original PR description
Update the xmlid for the default packaging type for service products, the previous one `l10n_ke_edi_oscu.packaging_type_ou` seems to have never existed. opw-5220129 Forward-Port-Of: odoo/enterprise#105905
This update resolves an issue where documents actions would fail after a language was deactivated. The system now filters actions to only include those linked to the currently active languages, ensuring a smoother user experience and preventing errors when switching languages. This improves stability and usability for users working with multiple languages.
Original PR description
Filter Embedded Actions Based on Active Languages ### Impacted versions: 18.0 and later ### Steps to reproduce: - Install at least 2 languages - Install documents and accounting or other app to have actions on select - Uninstall one language - You will get an error when trying to activate again actions on select (also appears on network interface) ### Current behavior: When a language is deactivated, its corresponding translations may still appear in server actions, leading to errors when trying to add them to the context. This issue is now resolved by filtering actions to only include those linked to active languages. Task: [5420820](https://www.odoo.com/odoo/project/49/tasks/5420820) Forward-Port-Of: odoo/enterprise#102938
16 changes
Resolved issues and error corrections
This update resolves a crash that occurred when users selected taxes within journal item dialogs on mobile. The fix replaces a problematic widget with a standard one, ensuring tax changes are saved correctly and preventing the web client from freezing. This improves stability for users entering accounting data.
Original PR description
**Steps to reproduce:** * Install the **Accounting** module. * Open a **Journal Entry** in mobile view. * Add a **Journal Item**, opening it in a form dialog. * Select a tax in the **Taxes Applied**…
**Steps to reproduce:** * Install the **Accounting** module. * Open a **Journal Entry** in mobile view. * Add a **Journal Item**, opening it in a form dialog. * Select a tax in the **Taxes Applied** field. * Click on the **Save and close** button. **Observed behavior:** * The web client crashes with `TypeError: Cannot read properties of undefined (reading 'resId')`. **Cause:** * The `autosave_many2many_tags` widget triggers `model.root.save()` immediately when a tag is selected. * When executing this save from within a transient dialog (common in mobile views), the client fails to correctly handle the record reload/synchronization leading to a crash when accessing `resId`. **Fix:** * Replace the autosave widget with the standard `many2many_tags` widget for **Journal Items** for form. * Tax changes are now kept locally in the dialog and saved only when the user explicitly saves and closes it. **Note:** * The crash happens when `autosave_many2many_tags` calls `model.root.save()` on a **new** `account.move` from within a dialog. * In QUnit tests, the mock server (`mockWebSave`) [1](https://github.com/odoo/odoo/blob/ca4d74c2a5d749ff8d41cd2fff80a73ba550a843/addons/web/static/tests/helpers/mock_server.js#L627). which creates records [2.](https://github.com/odoo/odoo/blob/ca4d74c2a5d749ff8d41cd2fff80a73ba550a843/addons/web/static/tests/helpers/mock_server.js#L1936) in-memory and does not trigger form reloads or component destruction. * As a result, the crash cannot be reproduced in tests. opw-5497342 Forward-Port-Of: odoo/odoo#246084
This update resolves a warning in the Irish tax module (l10n_ie) by moving the update of the Chart of Accounts to an 'end-script'. This ensures the update runs after all Odoo modules have loaded, preventing the warning and maintaining proper system functionality. This change improves stability and avoids potential issues with module loading.
Original PR description
We faced a warning because this update doing a try_loading is called in `post-` scripts (after the module is loaded) and not in `end-` scripts (when all modules are loaded). All l10n_* modules were changed in this PR: https://github.com/odoo/odoo/pull/183359 Regarding the changes in this PR related to Registry: https://github.com/odoo/odoo/pull/186467 see: https://github.com/odoo/odoo/pull/222186 upg-3828301 **Reference Image** <img width="1769" height="39" alt="2026-01-28_18-44" src="https://github.com/user-attachments/assets/8aa5f213-b150-403b-b2a1-0bc9ed4a4ccc" /> 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 resolves an issue where a Sales Order Item was unexpectedly removed from a timesheet after adding a timesheet line to a helpdesk ticket. Previously, the system incorrectly cleared the Sales Order Item field. Now, the Sales Order Item from the quotation is correctly retained within the timesheet, ensuring accurate billing for timesheeted services.
Original PR description
_ ## Short functional explanation of the error Let's say a customer has made 2 sales order of 2 different serives: one service is prepaid, the other one is billed based on timesheets. When we create…
_ ## Short functional explanation of the error Let's say a customer has made 2 sales order of 2 different serives: one service is prepaid, the other one is billed based on timesheets. When we create a ticket related to this customer in the helpdesk app, the ticket automatically fills the Sales Order Item field with the prepaid service. If we remove this Sales Order Item, create a timesheet in which we set the Sales Order Item to be the timesheeted service, and press save, the Sales Order Item of the timesheet will disappear. ## Reproduction Steps 1. Create 2 products: one service based on timesheets and one service prepaid. Make sure that they create an empty project on order. 2. Create 2 quotations for the same partner: one that contains the first product you created and a second one containing the second product. Click on confirm. 3. Go to Helpdesk > Configuration > Helpdesk teams. Click on one team and under Track and Bill time, enable both Timesheets and Time Billing. 4. Create a Helpdesk ticket for the team you setup. Under customer, enter the name of the partner in the quotations. 5. Click on the ticket. The quotation related to the prepaid service should appear as the field Sales Order item on the ticket. Remove it, click on the Timesheet tab, and add a line in which, for the Sales Order Item field of the timesheet, you'd enter the quotation for the timesheeted service. 6. Hit save. ## Expected behavior The quotation entered as Sales Order Item field in the timesheet persists, while the Sales Order Item field of the ticket stays empty. ## Unexpected Behavior the Sales Order Item field in the timesheet tab disappears. ## Origin of the issue The field is_so_line_edited was kept at false as the widget used to update its value wasn't used in the view. _ opw-5384256
This update resolves an issue where users couldn't see all available Starshipit delivery services. The fix ensures Odoo sends complete order details (address, weight) to Starshipit, allowing users to select the correct and full list of services during setup. This improves the user experience and accuracy of delivery options.
Original PR description
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this…
Current behaviour: Users are unable to select certain Starshipit delivery services. Delivery methods are configured in Odoo before address or package data is available. Since Starshipit requires this data to determine availability, it returns an incomplete list during setup. Expected behaviour: Users should be able to view and select from the complete list of valid delivery services based on the actual Sales Order details (address, weight, and volume). Steps to reproduce: 1. Create new delivery method 2. Configure Starshipit API credentials. 3. Attempt to select a service. 4. Observe that not all service is shown from the available options. Cause of the issue: Starshipit filters services based on sender, receiver, and package info. Odoo requests the service list during initial configuration without this context, resulting in an incomplete list of methods. Fix: Introduce a mechanism in the Sales Order flow to add delivery methods. Send the complete shipment details (addresses, weight) to Starshipit to retrieve the accurate list of services and allow the user to select them.
This update resolves a payment error occurring when using the Avatax integration with Point of Sale. The issue stemmed from an outdated method that no longer existed, causing a crash during order settlement. The fix permanently removes this unused method, ensuring stable payment processing.
Original PR description
Step to reproduce: - configure pos for Avatax from settings - open pos and settle a order - notice a error message on payment page Cause: - error is due to usage of `replaceDataByKey` which is removed in [1] [1] https://github.com/odoo/odoo/commit/3e94fe90ded58d498f0098cd9ed8679cbe500b8f Fix: - we removed the method as now we do not rely on it. opw-5089351 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a problem with how service products are packaged for EDI reporting in Kenya. The previous packaging type reference was incorrect and causing errors. This fix ensures service products are properly packaged according to local regulations, preventing potential reporting issues.
Original PR description
Update the xmlid for the default packaging type for service products, the previous one `l10n_ke_edi_oscu.packaging_type_ou` seems to have never existed. opw-5220129 Forward-Port-Of: odoo/enterprise#105905
This update resolves a minor rounding error (0.01 cent) that occurred when processing POS downpayments with tax. The fix ensures accurate invoice creation by adjusting how calculations are handled, specifically using higher precision and a single rounding step. This prevents potential discrepancies in financial reporting.
Original PR description
When applying a downpayment in POS with tax-included prices, a rounding error of 0.01 cent could occur, preventing invoice creation. For example, with an 8% tax and a downpayment of exactly 2,117.00:…
When applying a downpayment in POS with tax-included prices, a rounding error of 0.01 cent could occur, preventing invoice creation. For example, with an 8% tax and a downpayment of exactly 2,117.00: - Calculation: 2117 ÷ 1.08 = 1960.185 → rounds to 1960.19 - Recalculation: 1960.19 × 1.08 = 2117.005 → rounds to 2117.01 - Result: 0.01 cent discrepancy Root Cause: ----------- The issue stems from cascading rounding errors when using 'round_per_line' method with standard product price precision (typically 2 decimals). Each intermediate calculation introduces a small rounding error that accumulates. Solution: --------- Apply two specific fixes for downpayment products only: 1. Use higher precision (6 decimals) instead of standard product price precision to maintain accuracy through the calculation chain 2. Force 'round_globally' rounding method instead of 'round_per_line' to ensure rounding happens only once at the final step, not at each intermediate calculation 3. Use raw (unrounded) amounts in tax calculations to preserve full precision until final rounding opw-5040722
This update fixes an issue where the 'Send As Message' button in Knowledge Clipboards was inserting text after the user's signature in emails. The change ensures the clipboard text is inserted correctly before the signature, streamlining the email composition process for users. This improves usability and reduces manual adjustments.
Original PR description
When a user is viewing a page, clicks on the Knowledge Book icon, opens an article, and selects the "Send As Message" button in a Knowledge Clipboard block, the macro system performs several actions:…
When a user is viewing a page, clicks on the Knowledge Book icon, opens an article, and selects the "Send As Message" button in a Knowledge Clipboard block, the macro system performs several actions: it restores the initial view, opens the full mail composer, and inserts the clipboard block's text at the very end of the editor. Recent updates introduced automatic inclusion of the user's signature in the email body when the full mail composer is opened. As a result, the clipboard text is inserted after the user signature, which is undesirable because users must manually adjust the message to position the signature correctly. To insert text before the user signature but after the user text, the clipboard macro will now trigger a "click" event on the button opening the full mail composer and set on that event the text to insert. The chatter will then read that value and insert the text at the right place. Task-4428445 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a bug that occurred when users copied and then undid planning slots. Specifically, an error would appear if a copied slot was subsequently deleted. The fix ensures the system verifies a record exists before attempting to delete it, preventing the error and improving stability.
Original PR description
### Steps to reproduce: - Install Planning - Navigate to the gantt view for planning slots - Copy previous week's slots - Delete one of the newly copied records - Undo the copying action - Notice an Error is raised that a record doesn't exist ### Cause: When undoing the copy process we unlink all the newly created records but if the user has already deleted one of them it will trigger an error that this record doesn't exist and it has already been deleted ### Fix: We check the existence of the records before deleting them. opw-5490327
This update addresses an issue related to how Odoo handles negative lines in EDI transactions. It backports essential functions from a recent release to ensure accurate processing of these lines, preventing potential errors and disruptions in financial reporting. This improves the reliability of our EDI integrations.
Original PR description
This PR backport helpers functions from 18.3 used to dispatch negatives lines (for EDI refusing negative lines). It also backport a fix on _split_base_line(). opw-5382423
This update resolves rounding issues that were causing Mexican EDI invoices to be rejected. The changes include adjustments to how discounts and taxes are calculated, particularly when combining multiple invoices, and using more precise numerical values to avoid discrepancies. This ensures invoices comply with Mexican regulations and can be successfully processed.
Original PR description
l10n_mx_edi* = l10n_mx_edi, l10n_mx_edi_pos, l10n_mx_edi_extended **STEP TO REPRODUCE** 1. Create a invoice with: - product price = 72.89 - discount = 10% - tax = 16% 2. Duplicate the invoice until…
l10n_mx_edi* = l10n_mx_edi, l10n_mx_edi_pos, l10n_mx_edi_extended
**STEP TO REPRODUCE**
1. Create a invoice with:
- product price = 72.89
- discount = 10%
- tax = 16%
2. Duplicate the invoice until you have 5 of them.
3. Create a global invoice with the 5 invoices, and send it.
4. The invoice will be refused by the EDI due to rounding issue.
This PR is a backport of multiples fixes done in 18.3 in which all rounding errors are fixed.
Each of them iterate upon the previous one, so they are all needed. The most important changes in thoses fixes are:
- for global invoices, deduce the discount on the base line instead of creating a 'descuento' (to avoid any problem with rounding when combining multiples invoices).
- changes in how the negative lines are dispatched.
- using raw values for 'conceptos' and 'impuestos' (5 digit precision) and changing how we compute things to solve rounding issue.
Tests files are modified accordingly, you can launch the tests with the external flag (need to be set in tests/common.py).
Backported PR (non-exhaustive):
https://github.com/odoo/enterprise/pull/92727
https://github.com/odoo/enterprise/pull/99395
https://github.com/odoo/enterprise/pull/90434
opw-5382423This update corrects a bug in the task scheduling feature where tasks were incorrectly planned with shorter durations. Specifically, when a task started on November 25, 2025, it was only scheduled for November 25-26 instead of extending into December. The fix removes previously used scheduling intervals to ensure accurate hour allocation.
Original PR description
Steps to Reproduce: 1- Auto-plan a task starting on 25 November 2025 with 40 allocated hours. 2- The computed end date becomes 26 November, instead of extending into early December. => As a result, the allocated period is shorter than the required hours. Source: When selecting 25/11/2025 as the start date, the system tries to schedule the task within the remaining days of November (25–28). However, these four days are not enough to cover 40 hours. The system then searches for available intervals in the next month. But the intervals from November are still kept in the list, so when the algorithm iterates again, it reuses the previously consumed intervals (25 and 26). This causes the scheduler to allocate the remaining hours to those same days, leading to an incorrect result where the task spans only 25–26 November, instead of continuing from 1 December. Solution: Remove already-used intervals before recomputing the schedule. opw-5364327
This update resolves a visual inconsistency where the background color of nested columns within tabs was being incorrectly overridden. The fix specifically targets a CSS rule that was too broad, now ensuring that background colors are applied correctly to the intended columns. This improves the overall appearance and usability of the tab interface.
Original PR description
Steps to reproduce: =================== 1- Drop the block tab snippet 2- Inside one of the tab panes, drop a Columns snippet. 3- Select background_color for one of the columns 4- Change tab style to…
Steps to reproduce: =================== 1- Drop the block tab snippet 2- Inside one of the tab panes, drop a Columns snippet. 3- Select background_color for one of the columns 4- Change tab style to tab -> The background color of the inner column is overridden. Cause: ====== When the "Tabs" snippet style is set, a `.card` class is added to its container (See [1]) A generic CSS rule, intended to style these tabs, was targeting any `.card` element with a `.card-body` child. (See [2]) However, the Columns snippet also uses a `.card > .card-body` structure (distinguished by a `data-vxml` attribute). This caused the overly broad tab-styling rule to incorrectly cascade and override the background color of the nested column. Solution ======== The SCSS selector has been made more specific so that works if `card-body` class doesn't have any parent class with class `card` and has attribute `data-vxml` [1]: https://github.com/odoo/odoo/blob/4cb3ffc09507fdfdb1aeabb70b2c93105f992700/addons/website/static/src/snippets/s_tabs/options.js#L149 [2]: https://github.com/odoo/odoo/blob/4cb3ffc09507fdfdb1aeabb70b2c93105f992700/addons/web/static/src/scss/bootstrap_review_frontend.scss#L55 opw-5394480 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a technical issue identified by our code quality tools. A method was defined twice within the Odoo accounting system, which caused a potential error. This change ensures the system functions correctly and efficiently, preventing future problems.
Original PR description
This commit removes the duplicated method definition for `_get_l10n_hr_fiscal_user_id_domain()` in the account_move model. Reported by pylint 4. 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
A recent code update caused automated test builds to fail due to a logging warning. This fix addresses the issue by creating a helper method to manage test data, preventing the repeated triggering of the warning. This ensures the test environment remains stable.
Original PR description
The runbot builds are currently failing after the recent merge of commit [1] due to a triggered documents logger warning. In commit [1], `cls.attachment_txt` is created with invalid `datas` in…
The runbot builds are currently failing after the recent merge of commit [1] due to a triggered documents logger warning. In commit [1], `cls.attachment_txt` is created with invalid `datas` in `setUpClass`, which triggers an error and raises a log warning at code line [2]. We already added `mute_logger` to suppress this log, but it does not work due to caching behavior in setUpClass. The `setUp` method of the `TransactionCase` test class attempts to flush all pending data (see code reference [3]). During this flush, it recomputes the values of `cls.attachment_txt`, which triggers the same logger warning again. Since this occurs outside the mute_logger context, the log is not suppressed, resulting in the runbot failure. This commit fixes the issue by introducing a helper method to create and return `attachment_txt` for use in the test methods. [1]: https://github.com/odoo/enterprise/commit/d4ecf6c75bff3fc29a95c40f86528c6b10870e12 [2]: https://github.com/odoo/enterprise/blob/f3e2de6bae7573ad61429a55ff3769ba7fab58ea/documents/models/documents_document.py#L1355-L1356 [3]: https://github.com/odoo/odoo/blob/8e60084924d390632934b5a9bd82a6954d6484de/odoo/tests/common.py#L1038 runbot-238369
This update fixes a translation issue where warnings on Swiss payroll slips didn't display translated field names. The change ensures that all warning messages are correctly translated into French (CH), improving the user experience for French-speaking Swiss users. This resolves a reported bug impacting data accuracy and usability.
Original PR description
The warnings that appear on a payslip when the employee's form misses information are not fully translated Steps to reproduce: 1. Install module l10n_ch_hr_payroll 2. Switch to "My Swiss Company" and change language to French (CH) 3. Open app "Paie" and create a new employee (only add a name) 4. Click on "Contrats" in the stat button and create a new contract for the employee (only add a name), save it and set it as "En cours" in the status bar 5. Go to "Fiches de paie" > "Toutes les fiches de paie" and create a new payslip 6. Add the newly created employee to the payslip 7. The warnings in the form displaying the missing fields from the employee form do not translate the name of the missing fields Solution: Use `get_description` to get the translated name of the missing fields opw-5403634 Forward-Port-Of: odoo/enterprise#104499
6 changes
Resolved issues and error corrections
This update resolves an error that prevented users from opening a POS session when the 'Simplified Invoice Partner (ES)' customer record was missing. The fix automatically creates this customer record if it's not already present, ensuring a smooth POS session experience. This improves usability for Spanish POS operations.
Original PR description
Currently, an error occurs while opening a POS session, when the external ID 'l10n_es.partner_simplified' is not available Step to produce: - Install the 'l10n_es_pos' module. - open a customer, And delete the 'Simplified Invoice Partner (ES)' record. - And try to open a POS session. ```ValueError: External ID not found in the system: l10n_es.partner_simplified``` An error occurs when the system tries to retrieve an external ID of the customer 'Simplified Invoice Partner (ES)' at [1], and it is not available. Link [1]: https://github.com/odoo/odoo/blob/4ac6722aec4a638882c41f1df563da6f051849ad/addons/l10n_es_pos/models/pos_config.py#L39 To handle this issue, create a demo customer 'Simplified Invoice Partner (ES)' if it is not available. sentry-5503568768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a technical issue that caused a duplicate payment method to appear when setting up SEPA Direct Debit payments. Activating the SEPA Payment Provider and enabling SEPA within settings was triggering this duplication. This fix ensures SEPA payments function correctly and avoids potential errors.
Original PR description
When activating SEPA Payment Provider and checking SEPA in your settings, it results with a kind of duplicaiton of this Payment Method. task-5875979 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a technical issue that caused confusing traceback errors during the ZATCA onboarding process. Previously, users received unhelpful technical messages when errors occurred. Now, users will see a clear, user-friendly alert message with the actual error returned by ZATCA, improving the onboarding experience and ensuring compliance.
Original PR description
This PR is essentially a backport of https://github.com/odoo/odoo/pull/242810. Original comment: Whenever an error occurs during the ZATCA onboarding steps—such as providing a company name that…
This PR is essentially a backport of https://github.com/odoo/odoo/pull/242810. Original comment: Whenever an error occurs during the ZATCA onboarding steps—such as providing a company name that exceeds 127 bytes in binary representation (for example, 64 Arabic characters without whitespace result in exactly 127 bytes; see refs [1] and [2])—the system returns a traceback to the user instead of a clear and user-friendly error message. Error: `TypeError: argument should be a bytes-like object or ASCII string, not 'NoneType' This is due to the check-in `_l10n_sa_get_production_CSID` for an 'error' key, not present in the response when an OTP is invalid because in these cases, the `_l10n_sa_call_api` returns the response_data directly. This fix improves the behaviour by displaying a user-friendly alert message with the error returned by ZATCA, instead of a traceback. This ensures a better experience and compliance with CCSID onboarding flows. [1]: https://zatca1.discourse.group/t/organization-name-is-too-long-issue-csr/7571 [2]: https://zatca1.discourse.group/t/organisation-name-with-restriction-of-64-characters/960 opw-5228665
This update fixes a translation issue where warnings on Swiss payroll payslips didn't display translated field names. The change ensures that all missing information fields are correctly translated into French (CH), improving the user experience for French-speaking Swiss users. This resolves a minor usability problem.
Original PR description
The warnings that appear on a payslip when the employee's form misses information are not fully translated Steps to reproduce: 1. Install module l10n_ch_hr_payroll 2. Switch to "My Swiss Company" and change language to French (CH) 3. Open app "Paie" and create a new employee (only add a name) 4. Click on "Contrats" in the stat button and create a new contract for the employee (only add a name), save it and set it as "En cours" in the status bar 5. Go to "Fiches de paie" > "Toutes les fiches de paie" and create a new payslip 6. Add the newly created employee to the payslip 7. The warnings in the form displaying the missing fields from the employee form do not translate the name of the missing fields Solution: Use `get_description` to get the translated name of the missing fields opw-5403634
This update fixes an issue where the 'Next Booking Start' field in the room list view was blank when rooms had upcoming bookings. The fix removes a filter that excluded occupied rooms from availability calculations, ensuring the field accurately reflects the next available time for all rooms. This improves the user experience and provides more accurate booking information.
Original PR description
Steps to reproduce:
1. Install `room`
2. Create a room.
3. Create a booking for the current time (so the room becomes occupied).
4. Create another booking for tomorrow.
5. Open the list view of rooms.
Current Behavior:
- The `Next Booking Start` field is empty for the created room, despite Having future bookings.
Cause:
- The method `_compute_next_booking_start` filters the rooms using `self.filtered('is_available')`. Since the room is currently occupied (due to the active booking), the room is excluded from the query entirely.
Solution:
- Remove the `is_available` filter from the search domain. The next booking start time is now calculated for all rooms, regardless of whether they are currently available or occupied.
opw-5360101Documentation and clarification updates
This pull request updates documentation related to Moduon, ensuring compliance with legal and licensing agreements. The changes are a standard legal update to maintain proper relationships with our partners. This update does not impact Odoo functionality.
Original PR description
@moduon MT-13567