Daily updates from Odoo
Navigate
Branch
Tuesday, June 3, 2025
66 changes
21 changes
Enhancements to existing features
This update improves how several Odoo apps handle files by making sure opened files are properly closed after use. This helps reduce resource leaks and supports more stable performance, especially in systems processing many documents or integrations.
Original PR description
odoo/odoo#211823
Payroll administrators can now translate the names of payslip input types. This improves localization for companies operating in multiple languages, helping payroll screens and records appear in each user's preferred language.
Original PR description
In this PR, we enabled the translate setting for the name attribute within the hr_payslip_input_type model. Before:  After:    This work is related to the task: [4840358](https://www.odoo.com/odoo/project/1251/tasks/4840358).
Production analysis now keeps the cost of consumable components at the time they are used, even if product costs change later. This makes manufacturing cost reports more reliable by using the right cost source for both storable and consumable components.
Original PR description
The consumable product no longer create stock valuation layer when moved. Instead, their value are taken from the product cost. To make sure the cost value at the move validation is kept when changing the cost, it is saved in the stock move `price_unit` field. The Production Analysis report should be adapted to read the component cost on stock valuation layer (for storable components) and on stock moves (for consu components) Task: 4189728
Barcode-related tools now load a supporting barcode/reporting component only when it is actually needed. This reduces unnecessary startup work and helps keep barcode operations lighter without changing user-facing behavior.
Original PR description
Delay importing of reportlab until it is needed. Use the functions exposed in odoo.tools.barcode for rendering. odoo/odoo#212406
Resolved issues and error corrections
Belgian point-of-sale setups using a blackbox no longer trigger errors when opening a restaurant configuration. This improves reliability for affected restaurants by preventing startup interruptions related to navigation and clocking notifications.
Original PR description
This commit fixes two traceback that happen when someone opens a pos config with a belgian blackbox configured. The first traceback happens because of the call of navigate throught this.pos while the call is made inside of pos_store. The other traceback is cause by the _notify "CLOCKING" where the "_" fields are not sent.
The rental search page now sends selected product attributes using the expected filter name, so shoppers see results that match their chosen options. This fixes a mismatch that previously caused rental search filters to be ignored, improving the browsing experience.
Original PR description
When selecting an attribute value in the Rental Search snippet, the generated URL incorrectly uses the `attrib` parameter. However, the `/shop` route expects the parameter to be named `attribute_values`. As a result, the filter is not applied, and the search results are not correctly filtered. This fix ensures consistency between the snippet and the `/shop` route by replacing `attrib` with `attribute_values`, so the attribute filter works as expected. The change improves the user experience by ensuring that search filters behave consistently across the website. Steps to reproduce: - Add the "Rental Search" snippet to a website page. - Configure it by selecting an attribute value. - Observe the resulting URL using `attrib`, which fails to filter results on the `/shop` page.
The document unlock confirmation dialog now shows the name of the person who locked the document instead of displaying “undefined.” This makes the prompt clearer for users and helps them make informed decisions when unlocking documents.
Original PR description
Steps to reproduce =================== - Lock a document. - Attempt to unlock the document. - Notice that the name of the user who locked the document is missing in the confirmation dialog; instead, it shows `undefined`. Technical ========== Recently, here: https://github.com/odoo/odoo/pull/205486/commits/70224f3ae75b65516f87aa3a1c6f8c988926760a, We replaced the many2one value from an array to an object, so the properties at indices 0 and 1 are no longer available. This PR adapts the above changes by using the object keys instead of the array's index. Task-4821976
Code cleanup and technical improvements
The pull request simplifies automated test scripts by removing now-unnecessary waiting instructions. This keeps internal test maintenance lighter without changing product behavior for users.
Original PR description
From d69767c59cd9600, waitFor trigger is the natural behavior of trigger searching in tours. There is no longer a need to explicitly use waitFor in run functions if it is a condition for proceeding to the next step.
Miscellaneous changes
When selecting an attribute value in the Rental Search snippet, the generated URL incorrectly uses the `attrib` parameter. However, the `/shop` route expects the parameter to be named `attribute_value`. As a result, the filter is not applied, and the search results are not correctly filtered. This fix ensures consistency between the snippet and the `/shop` route by replacing `attrib` with `attribute_value`, so the attribute filter works as expected. The change improves the user experience
Original PR description
When selecting an attribute value in the Rental Search snippet, the generated URL incorrectly uses the `attrib` parameter. However, the `/shop` route expects the parameter to be named `attribute_value`. As a result, the filter is not applied, and the search results are not correctly filtered. This fix ensures consistency between the snippet and the `/shop` route by replacing `attrib` with `attribute_value`, so the attribute filter works as expected. The change improves the user experience by ensuring that search filters behave consistently across the website. Steps to reproduce: - Add the "Rental Search" snippet to a website page. - Configure it by selecting an attribute value. - Observe the resulting URL using `attrib`, which fails to filter results on the `/shop` page. Forward-Port-Of: odoo/enterprise#86792
Forward-Port-Of: odoo/enterprise#86749
Original PR description
Forward-Port-Of: odoo/enterprise#86749
Related to https://github.com/odoo/odoo/pull/211714 Forward-Port-Of: odoo/enterprise#86467 Forward-Port-Of: odoo/enterprise#86440
Original PR description
Related to https://github.com/odoo/odoo/pull/211714 Forward-Port-Of: odoo/enterprise#86467 Forward-Port-Of: odoo/enterprise#86440
Fix the possibility to enter an empty document name when editing a file or folder name from the side panel. If the name is empty, a danger notification should be displayed and the previous name should be restored. Task-4794447 Forward-Port-Of: odoo/enterprise#85500
Original PR description
Fix the possibility to enter an empty document name when editing a file or folder name from the side panel. If the name is empty, a danger notification should be displayed and the previous name should be restored. Task-4794447 Forward-Port-Of: odoo/enterprise#85500
Before this commit: - Select any document. - Click the SERVER ACTIONS cog menu. - You will find the menus --> `Export` and `Insert in spreadsheet` Issue: - These are not required here. Reason: - A recent PR (https://github.com/odoo/enterprise/pull/77329) changed how certain server actions are displayed when a document is selected. Fix: - We override the function returning the Dropdown Items to display and simply pop the ones we don't need. Task-4743029 Forward-Port-Of: odoo/en
Original PR description
Before this commit: - Select any document. - Click the SERVER ACTIONS cog menu. - You will find the menus --> `Export` and `Insert in spreadsheet` Issue: - These are not required here. Reason: - A recent PR (https://github.com/odoo/enterprise/pull/77329) changed how certain server actions are displayed when a document is selected. Fix: - We override the function returning the Dropdown Items to display and simply pop the ones we don't need. Task-4743029 Forward-Port-Of: odoo/enterprise#84519
…n values. A small error was been made in https://github.com/odoo/enterprise/pull/76079 (`_search_last_access_date_group`): the SQL string contains a %s without an argument, resulting in a "TypeError: not enough arguments for format string." Fix it. A test will be added later to the master branch in a later PR that found the issue https://github.com/odoo/odoo/pull/133224. https://github.com/odoo/odoo/pull/212115 Forward-Port-Of: odoo/enterprise#86626
Original PR description
…n values. A small error was been made in https://github.com/odoo/enterprise/pull/76079 (`_search_last_access_date_group`): the SQL string contains a %s without an argument, resulting in a "TypeError: not enough arguments for format string." Fix it. A test will be added later to the master branch in a later PR that found the issue https://github.com/odoo/odoo/pull/133224. https://github.com/odoo/odoo/pull/212115 Forward-Port-Of: odoo/enterprise#86626
Currently, An Error occurs on removing the **Date To** or **Date From** value from a payslip's period. **Steps to Reproduce** 1) Install **l10n_id_hr_payroll module**. 2) Create a new **Pay-Slip**. 3) Remove **Date** from **Period** **Error:** `AttributeError: 'bool' object has no attribute 'month'` **Root Cause:** The `_compute_l10n_id_include_pkp_ptkp` method at [1] assumes that `date_to` and `contract_id.date_end` are always set and valid. If either of them is missing (False), a
Original PR description
Currently, An Error occurs on removing the **Date To** or **Date From** value from a payslip's period. **Steps to Reproduce** 1) Install **l10n_id_hr_payroll module**. 2) Create a new **Pay-Slip**.…
Currently, An Error occurs on removing the **Date To** or **Date From** value from a payslip's period. **Steps to Reproduce** 1) Install **l10n_id_hr_payroll module**. 2) Create a new **Pay-Slip**. 3) Remove **Date** from **Period** **Error:** `AttributeError: 'bool' object has no attribute 'month'` **Root Cause:** The `_compute_l10n_id_include_pkp_ptkp` method at [1] assumes that `date_to` and `contract_id.date_end` are always set and valid. If either of them is missing (False), accessing `.month` or `.year` causes an error. [1] - https://github.com/odoo/enterprise/blob/34aa0ffb82c1bd7c90b4cb161ea515f2cad8e65f/l10n_id_hr_payroll/models/hr_payslip.py#L87 **Solution:** This commit prevents the computation from failing when `slip.date_to` and `slip.contract_id.date_end` fields are unset by adding a conditional check to ensure that both fields are valid date objects before accessing their `.month` and `.year` attributes. sentry-6608982173 Forward-Port-Of: odoo/enterprise#85701
## opw-4812933 feedback > When attachments were exported from Studio Export, they got exported in descending order by id (from highest id to lowest id). This caused a problem during import: if an attachment referred to an earlier one using a "Resource ID" (meaning it depended on a previously created attachment), the dependent attachment would try to import before the one it needed. This led to an error because the referenced attachment didn't exist yet. ## found issue The exported data
Original PR description
## opw-4812933 feedback > When attachments were exported from Studio Export, they got exported in descending order by id (from highest id to lowest id). This caused a problem during import: if an attachment referred to an earlier one using a "Resource ID" (meaning it depended on a previously created attachment), the dependent attachment would try to import before the one it needed. This led to an error because the referenced attachment didn't exist yet. ## found issue The exported data is sorted to ensure import order is correct, but for inter-record dependencies on a same model many2one_reference fields are not taken into account. This PR fixes that. Also while analyzing this issue another small issue was spotted regarding base.automation.url field. See commits. Forward-Port-Of: odoo/enterprise#86407 Forward-Port-Of: odoo/enterprise#86204
Before this commit, when the user creates more than one fsm project, the default fsm project selected once a fsm task is created if the one with the lowest sequence and lowest id which could be confusing for the user since the default order displayed in the list view of projects is `sequence, name, id`. This commit makes sure the default fsm project fetched is the first one displayed in the list view of projects. opw-4791468 Forward-Port-Of: odoo/enterprise#86554
Original PR description
Before this commit, when the user creates more than one fsm project, the default fsm project selected once a fsm task is created if the one with the lowest sequence and lowest id which could be confusing for the user since the default order displayed in the list view of projects is `sequence, name, id`. This commit makes sure the default fsm project fetched is the first one displayed in the list view of projects. opw-4791468 Forward-Port-Of: odoo/enterprise#86554
The current implementation to handle the rate for multi-currency entries in CAMT creates problems when fetching the source rate from the file: the source rate can be taken from the SrcCcy or the TrgtCcy node, which should be compared with the source currency and target currency respectively. It is not done that way and is too restrictive (when the SrcCcy is found, it is always compared to the target currency, which leads to an incorrect transaction amount). Moreover, when the currency convers
Original PR description
The current implementation to handle the rate for multi-currency entries in CAMT creates problems when fetching the source rate from the file: the source rate can be taken from the SrcCcy or the TrgtCcy node, which should be compared with the source currency and target currency respectively. It is not done that way and is too restrictive (when the SrcCcy is found, it is always compared to the target currency, which leads to an incorrect transaction amount). Moreover, when the currency conversion introduces a exchange loss/gain, it is put back on the largest transaction of the entry. Backport of https://github.com/odoo/enterprise/pull/76828 and https://github.com/odoo/enterprise/pull/42763 opw-4672283 Forward-Port-Of: odoo/enterprise#84775 Forward-Port-Of: odoo/enterprise#83131
In this commit: --------------- - Corrected the label from `Is Alchoholic` to `is Alcoholic`. task- 4826438 Forward-Port-Of: odoo/enterprise#86587
Original PR description
In this commit: --------------- - Corrected the label from `Is Alchoholic` to `is Alcoholic`. task- 4826438 Forward-Port-Of: odoo/enterprise#86587
Changed translations to use the legal term used in Mexico. This is done because "Cada dos semanas" and "Quincenal" don't have exactly the same meaning Forward-Port-Of: odoo/enterprise#86445 Forward-Port-Of: odoo/enterprise#83982
Original PR description
Changed translations to use the legal term used in Mexico. This is done because "Cada dos semanas" and "Quincenal" don't have exactly the same meaning Forward-Port-Of: odoo/enterprise#86445 Forward-Port-Of: odoo/enterprise#83982
…tion_reg_payslip_lines This argument causes several issues and do not make sense as there is already a default_partner_id. For example, you click on payslip lines from the contact Abigail Peterson, and it filters everything with a search on partner_id = 1, which doesn't make sense. It also causes issues if the partner with id 1 doesn't exists. opw-4516239 Forward-Port-Of: odoo/enterprise#78287
Original PR description
…tion_reg_payslip_lines This argument causes several issues and do not make sense as there is already a default_partner_id. For example, you click on payslip lines from the contact Abigail Peterson, and it filters everything with a search on partner_id = 1, which doesn't make sense. It also causes issues if the partner with id 1 doesn't exists. opw-4516239 Forward-Port-Of: odoo/enterprise#78287
45 changes
Enhancements to existing features
Adds a dedicated US tax report so companies operating in multiple countries can view only US taxes instead of mixing them with other countries' taxes. This makes reporting clearer and helps tax return processes apply the correct country-specific controls.
Original PR description
Before this PR, the Generic Tax Report had always been considered as the only report necessary to handle the US taxes. The problem is that, if a company needs to submit tax reports in multiple countries (because it has a VAT number in them; what we call multivat in the Odoo jargon), the Generic Tax Report would then show the taxes from every company, not only the US ones, hence becoming a bit messy. In 18.3+, this also causes issues with the tax returns, which need to know the country they belong to in order to properly set the tax lock date. We solve that by introducing a new US tax report. It does the same as the Generic Tax Report, but shows only the US taxes.
The Replenishment screen now uses clearer wording by renaming the confusing “Supplier” field to “Vendor Pricelist.” It also removes a duplicate grouping option, making custom filters and grouping easier for users to understand.
Original PR description
Task: 4642595 Description of the issue/feature this PR addresses: Custom filters in Replenishment display "Vendor" and "Supplier" fields separately. In some contexts, both of these words mean the same thing, which might be confusing for the users. Because of that, the "Supplier" field is being renamed to "Vendor Pricelist". Moreover, at the moment grouping by "Vendor" and "Vendor Pricelist" has the same effect. For that reason, "Vendor Pricelist" is being removed from "Add Custom Group" dropdown. 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 update improves repair order usability by showing the quotation action only when a customer is selected, simplifying the default view, and aligning stock move details with the standard layout. This should reduce confusion for service teams and make repair processing more consistent.
Original PR description
**Desired behavior after PR is merged:** - Only show create quotation button if customer is set on repair order - Move product quantity to debug mode: most of the time the quantity is 1 ! - Align move view with standard move layout --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A dedicated US tax report is now available for companies that file taxes in multiple countries. It keeps US tax data separate from other countries' taxes, making reports clearer and helping tax returns apply the correct country-specific lock dates.
Original PR description
Before this PR, the Generic Tax Report had always been considered as the only report necessary to handle the US taxes. The problem is that, if a company needs to submit tax reports in multiple countries (because it has a VAT number in them; what we call multivat in the Odoo jargon), the Generic Tax Report would then show the taxes from every company, not only the US ones, hence becoming a bit messy. In 18.3+, this also causes issues with the tax returns, which need to know the country they belong to in order to properly set the tax lock date. We solve that by introducing a new US tax report. It does the same as the Generic Tax Report, but shows only the US taxes.
Payslip input type names in Payroll can now be translated, making payroll configuration clearer for users working in different languages. This improves localization support and helps multilingual teams see payroll labels in their preferred language.
Original PR description
In this PR, I enabled the translate setting for the name attribute within the hr_payslip_input_type model. Before:  After:    This work is related to the task: [4840358](https://www.odoo.com/odoo/project/1251/tasks/4840358).
Resolved issues and error corrections
When creating a new partner, Odoo now correctly updates the default invoice EDI format after a country is selected. This prevents users from having to manually choose the right localized invoicing format and keeps partner setup smoother.
Original PR description
Before this **PR**: When creating a new partner for the first time, the compute method for the invoice EDI format is triggered as expected. However, if a country is set while creating the partner,…
Before this **PR**: When creating a new partner for the first time, the compute method for the invoice EDI format is triggered as expected. However, if a country is set while creating the partner, compute method is not triggered again. This breaks the intended flow where a default edi_format should be automatically set based on the country (using _get_suggested_invoice_edi_format). Since the compute method doesn’t re-trigger upon changing the country during record creation, the inverse method ends up setting invoice_edi_format_store to 'none'. This prevents subsequent calls to _get_suggested_invoice_edi_format from resolving the appropriate format, requiring users to manually set it — defeating the purpose of automatic localization-based assignment. After this **PR**: The dependency for the compute method has been changed from commercial_partner_id.country_code to country_code. This ensures the compute method reacts to changes in the country field during record creation. The logic still utilizes commercial_partner_id internally, so the intended behavior and correctness should be preserved, while ensuring the default format is set appropriately.
This fix allows businesses to safely link duplicate contacts to a main partner even when related accounting entries are locked or reconciled. It preserves accounting consistency by ensuring VAT details match, reducing blockers during contact cleanup for EC Sales List reporting.
Original PR description
A series of recent commits were aiming at allowing to change the partner of some journal entries in batch to allow de-duplicating the database, in the context of the EC Saleslist report[^1] There are…
A series of recent commits were aiming at allowing to change the partner of some journal entries in batch to allow de-duplicating the database, in the context of the EC Saleslist report[^1] There are a few residual issues: 1. the lock dates can prevent any change on the lines. However in this specific case, the partner is not really changing and we want to allow it. This issue is solved by adding a context key, using a sentinel to avoid any users bypassing it. 2. if the lines are reconciled, it was also impossible to update the lines. Since all the lines are changing the partner at the same time, there is no need to block changing it as the reconciliation keeps its meaning. 3. After the second commit, we were actually not checking that the VAT was indeed the same on the partner getting a `parent_id` assigned 4. We don't check that the user has a specific accounting group anymore to allow invoicing users to set the main partner. It should not be an issue since the accounting values stay the same (same VAT) [^1]: https://github.com/odoo/odoo/commit/38d43360781250415c63aba36eadcdce586fcbc0 https://github.com/odoo/odoo/commit/3941972dc7bba3e9a3d4497b312ff7f86a497157
Dropshipping delivery slips no longer show a product's internal note under the product name. This prevents company-only information from appearing on documents shared with customers or external delivery partners.
Original PR description
In a dropshipping context, the internal note of a product with displayed on the delivery slip of the operation. Steps to reproduce: ------------------- * Create (or use) a product with an internal note * Enable Buy and Dropship Routes, add a Vendor * Create and Confirn a Sale Order with that product * Click on Purchase smart button and Confirm Order * Click on Dropship smart button * Print the Delivery Slip > Observation: The internal note was displayed under the name of the product Why the fix: ------------ When used with picking_code == 'dropship', `_get_description()` returns the product's description (internal note). We don't want that description to be visible on a report that's used outside of the company. opw-4791064 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Flexible work schedules now create realistic daily working blocks instead of treating an entire period as one continuous shift. This improves the accuracy of overtime, time off, timesheets, and payroll-related work entries for employees with flexible calendars.
Original PR description
This PR addresses multiple issues related to flexible working hours across several Odoo modules, including attendance, overtime calculation, time off (leave) management, and work entry generation.…
This PR addresses multiple issues related to flexible working hours across several Odoo modules, including attendance, overtime calculation, time off (leave) management, and work entry generation. The primary change modifies the _attendance_intervals_batch method in the `resource` module to create daily attendance blocks for flexible calendars, using the average daily hours and the required weekly hours. Attendance Intervals for Flexible Hours: Old Behavior: For flexible employees, a single interval spanned the entire requested period, leading to inaccurate calculations. New Behavior: For flexible calendars (not fully flexible), daily attendance blocks are created, centered around 12:00 PM, with each block’s duration equal to the average daily hours (hours_per_day). Fully flexible employees (no calendar) retain a single interval covering the full period. A flexible employee’s attendance was one continuous block over the entire period. +---------------------------+ | Attendance | | (e.g., Mon to Fri) | +---------------------------+ New Behavior (Daily Blocks): For a flexible calendar with 8 hours/day, attendance is split into daily blocks centered at 12:00 PM (e.g., 8:00 AM - 4:00 PM). +-----+ +-----+ +-----+ | 8h | | 8h | | 8h | | Mon | | Tue | | Wed | +-----+ +-----+ +-----+ Overtime Calculation: Updated hr_attendance.py to skip overtime computation for fully flexible employees (is_fully_flexible). For flexible calendars, overtime is now based on the new daily attendance blocks. Time Off: In hr_leave.py, flexible calendars now center leave intervals around 12:00 PM for each day, matching the attendance blocks. For half-day leaves, the duration is halved. Single-day leaves use specified hours, while multi-day leaves align with the virtual schedule. Work Entry Generation: In hr_contract.py, work entries for flexible calendars distinguish between one-day and multi-day leaves. Multi-day leaves align with the daily attendance blocks, while one-day leaves use exact hours. Updated hr_work_entry.py to skip marking leaves outside the schedule for flexible hours, as their virtual schedule is dynamically generated. Timesheet: In hr_holidays.py, timesheet generation for flexible employees uses the new attendance intervals or exact hours for hourly/half-day leaves. task-4771288
Sales orders that include note or section lines before a serial-number tracked product can now be settled correctly in Point of Sale. This prevents an error during settlement and avoids incorrectly setting the amount to settle to zero.
Original PR description
Currently, when you try to settle a SO in POS which has sections/notes before the product line (producted tracked), a traceback will appear and the amount to settle will be set to 0. Steps to…
Currently, when you try to settle a SO in POS which has sections/notes before the product line (producted tracked), a traceback will appear and the amount to settle will be set to 0. Steps to reproduce: ------------------- * Crete a product tracked by SN * Create a SO, the first line should be a section line and the second the product newly created * Open pos session * Try to settle the SO > Observation: Traceback, when closing the traceback, the line on the pos order has an amount of 0. Why the fix: ------------ This commit https://github.com/odoo/odoo/commit/4c0fdfe23c6302929bf05f2223f41b7ac5587e66 didn't take into account that `read_converted` could potentially return less data than the number of sale order lines (sections and notes). Thus using a loop invariant to track the converted_line related to the SO line does not make sense. In our example above, `i=1` when reaching the product line but `converted_lines` only had one element. In this case, `sale_order.order_line[1]` is related to `converted_lines[0]`. opw-4800339
This fixes report footers so documents without a tagline no longer show a large empty space. It also improves detection of empty footer content, helping reports display the standard footer layout consistently across affected localization templates.
Original PR description
commit https://github.com/odoo/odoo/commit/695b429d09887debe1a58e92abfd7e738350061d reworked the footer style but on boxed and bold if there is no tag line, it uses a col-8 that let a big empty space. Also it uses a wrong t-if condition on an html field. It should use is_html_empty since the field could contains empty tags (<br>) Fallback on standard template for report without report_header We keep a duplicate of class and t-attf-class in order to have a valid override of the template Fix l10n template to reduce the xpath and match the fix. Keeping the o_footer_content in both class for override and t-attf-class since `ir_qweb.py:def _compile_directive_att` ignore class attribute when t-attf-class is set opw-4618652
Exchanges involving individual components of a kit now keep the sales order delivered quantity accurate. This prevents sales orders from incorrectly showing zero delivered quantity after returning and exchanging a kit component.
Original PR description
**Current behavior:** Using the return & exchange functionality when the product to exchange is a kit's component will not correctly update the SOL `qty_delivered` field upon validation of the…
**Current behavior:** Using the return & exchange functionality when the product to exchange is a kit's component will not correctly update the SOL `qty_delivered` field upon validation of the exchange (out) picking. **Expected behavior:** accurate `qty_delivered` **Steps to reproduce:** 1. Create a product w/ kit bom like: * 2 units componentA * 1 units componentB 2. Sell 1 unit of the kit product, validate delivery 3. Create a return for the 1 unit of componentB and select the exchange option on the wizard 4. Validate the return, then validate the exchange 5. Look at the sale order line `qty_delivered` -> it's 0 **Cause of the issue:** The exchange picking move doesn't get a `bom_line_id` and thus is not properly aggregated in the computation of qty_delivered when incoming and outgoing quantities are being calculated (wherein these quantities must offset, but can't in this situation). **Fix:** When the procurement occurs to create the exchanging move, find the `bom_line_id` by looking at the original sale line's moves' bom's bom lines. opw-4676609
This fixes an issue in the HTML editor where double-clicking at the end of a link could place new text outside the link instead of inside it. Users editing website or document content can now extend linked text more reliably, reducing formatting mistakes.
Original PR description
Correct the double click selection at the end of a link to allow the new text input to be inside the link. task-4801000 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix removes overly strict accounting checks that blocked changing a partner's commercial entity when accounting entries already existed. It makes the recently added process usable for regular workflows while relying on earlier safety checks to prevent risky changes.
Original PR description
commit 3941972dc7bba3e9a3d4497b312ff7f86a497157 restricted the change of commercial entity on a partner having existing accounting entries to accountants only. This has been debated and ruled as too restrictive. Also all the checks that could failed (fiscal lock date, existing reconciliation made) are now totally by-passed as it would just made the feature unusable and we've set up some checks prior to make sure it was safe 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 change updates a product import test so it uses the correct file type information for older Excel files. It prevents false test failures in environments with Excel-reading libraries installed, helping keep product import validation reliable.
Original PR description
### Description of the issue/feature this PR addresses: Given https://github.com/odoo/odoo/blob/c494ca48eecab80e7310bf1c4ca1381d61f37f86/addons/base_import/models/base_import.py#L84-L90 Then…
### Description of the issue/feature this PR addresses:
Given
https://github.com/odoo/odoo/blob/c494ca48eecab80e7310bf1c4ca1381d61f37f86/addons/base_import/models/base_import.py#L84-L90
Then `test_import_product_demo_xls` incorrectly pairs .xls file extension with mime type `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`
### Current behavior before PR:
Tests in the product module fail when openpyxl is installed.
```
2025-05-19 15:08:32,243 1 ERROR odoo odoo.addons.product.tests.test_import_files: FAIL: Subtest TestImportFiles.test_import_product_demo_xls [product.supplierinfo]
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/addons/product/tests/test_import_files.py", line 35, in test_import_product_demo_xls
self.assertIsNone(result.get("error"))
AssertionError: "Unable to read file '<unknown>' as 'xlsx' (decided from user-provided mimetype 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')." is not None
2025-05-19 15:08:32,268 1 WARNING odoo odoo.addons.base_import.models.base_import: Unable to read file '<unknown>' as 'xlsx' (decided from user-provided mimetype 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet').
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/addons/base_import/models/base_import.py", line 429, in _read_file
return getattr(self, '_read_' + file_extension)(options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/base_import/models/base_import.py", line 509, in _read_xlsx
book = load_workbook(io.BytesIO(self.file or b''), data_only=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/openpyxl/reader/excel.py", line 344, in load_workbook
reader = ExcelReader(filename, read_only, keep_vba,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/openpyxl/reader/excel.py", line 123, in __init__
self.archive = _validate_archive(fn)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/openpyxl/reader/excel.py", line 95, in _validate_archive
archive = ZipFile(filename, 'r')
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/zipfile/__init__.py", line 1349, in __init__
self._RealGetContents()
File "/usr/lib/python3.12/zipfile/__init__.py", line 1416, in _RealGetContents
raise BadZipFile("File is not a zip file")
zipfile.BadZipFile: File is not a zip file
2025-05-19 15:08:32,269 1 ERROR odoo odoo.addons.product.tests.test_import_files: FAIL: Subtest TestImportFiles.test_import_product_demo_xls [product.template]
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/addons/product/tests/test_import_files.py", line 35, in test_import_product_demo_xls
self.assertIsNone(result.get("error"))
AssertionError: "Unable to read file '<unknown>' as 'xlsx' (decided from user-provided mimetype 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')." is not None
```
### Desired behavior after PR is merged:
Tests pass even when openpyxl is installed.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fix improves how Odoo's web testing tools handle errors during page element searches. It ensures internal cleanup happens reliably, reducing confusing follow-up errors for developers maintaining web features.
Original PR description
Before this commit, 'queryX' functions in Hoot would supposedly cleanup internal global variables on error thrown by the helpers. However, this only took into account the errors explicitly thrown, and NOT those that were thrown by other methods/native code, such as invalid native query selectors. This commit introduces a new internal method to "guard" exposed 'queryX' helpers, to properly cleanup internal variables on any error. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes several issues that could disrupt everyday work, including crashes in accounting without purchasing installed, project sharing removing the manager from followers, manufacturing reservation mistakes across companies, and gamification errors from invalid goal setup. It also improves internal performance checks and makes small usability refinements such as clearer point-of-sale wording and better mail data modeling.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents the HTML editor from crashing in Firefox when users press Enter rapidly while editing a To-do. It improves reliability by handling fast content changes safely, so users no longer see an error traceback during normal editing.
Original PR description
### Browser: Firefox ### Steps to reproduce: - Create a To-do. - Press Enter repeatedly and quickly. - A traceback occurs. ### Description of the issue/feature this PR addresses: - Pressing Enter quickly remove elements before their hooks are updated, causing hookElement to be undefined and triggering a crash. ### Desired behavior after PR is merged: - Traceback no longer occurs. task-4766147 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a misleading warning that appeared when users created a delivery operation type even though a warehouse already existed. The change makes the dropshipping check use the current operation type, preventing unnecessary confusion during inventory configuration.
Original PR description
…compute **PROBLEM** When creating a new operation type, changing the type to Delivery throws a warning to create a warehouse first despite there already being one. **STEPS TO REPRODUCE** 1. On a…
…compute **PROBLEM** When creating a new operation type, changing the type to Delivery throws a warning to create a warehouse first despite there already being one. **STEPS TO REPRODUCE** 1. On a fresh database, install stock with drop shipping and storage locations enabled. 2. Create a new operation type and set the type to Delivery. 3. You will receive the following warning, despite an existing warehouse: ``` Please create a warehouse for company <company> ``` **CAUSE** https://github.com/odoo/odoo/blob/138983cc81cd1565c1582a1523efa8c0c4dcc434/addons/stock/models/stock_picking.py#L308-L316 https://github.com/odoo/odoo/blob/138983cc81cd1565c1582a1523efa8c0c4dcc434/addons/stock_dropshipping/models/stock.py#L70-L74 When the form is first loaded, the type is Receipt and the source location is consequently Vendors. After changing the type to Delivery, the source location is recomputed. Observe the above code snippets. Before the source location is done being computed, the warehouse is accessed and computed. When computing the warehouse (in the midst of the source location compute), the `default_location_src_id` is still Vendors and `default_location_dest_id` is Customers, thus `warehouse_id` is set to False. **FIX** In the conditional that checks if the picking type is drop shipping, check the `code` instead. The value in `code` is up-to-date at the conditional, unlike `default_location_src_id`. opw-4603495 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Uploading a vendor bill as an attachment after creating an empty bill now shows the banner prompting users to reload extracted data. This ensures users are notified when document data has been processed, regardless of the upload path used.
Original PR description
If one uploads a vendor bill from the list view using the "Upload" button, a banner is then shown on the form view of the created move to reload the data that were extracted via IAP. However, this…
If one uploads a vendor bill from the list view using the "Upload" button, a banner is then shown on the form view of the created move to reload the data that were extracted via IAP.
However, this banner is not shown if one creates an empty move, then uploads via the attachments, then the banner is never shown.
This is because when we arrive in the `onWillStart` of the `StatusHeader`, we subscribe to a channel using the `extract_document_uuid` which does not exist upon creating a new empty move. Then, when we upload our document, the move record is saved, and is sent to the backend. At this point, the move exists, and a `extract_document_uuid` is set. Then we get the OCR results (in `_check_ocr_status`) and we have a new status, we send this status on the bus but on a channel named `f"extract.mixin.status#{self.extract_document_uuid}"` where the `extract_document_uuid` is set. However, in the JS part, it was empty because it was created in the `onWillStart`.
To resolve this, we create a new channel to detect newly created documents. We send the new `extract_document_uuid` in this channel from the backend to the frontend. The JS can now subscribe to the correct channel using an existing `extract_document_uuid`.
Now, correctly the JS receives the updates of the Python via the bus, and can update the view accordingly.
opw-4566944Fixes an issue where editing the attendee invitation email template could cause appointment bookings to fail or prevent the template from being saved. This keeps appointment confirmation emails reliable and allows staff to customize the booking message without triggering errors.
Original PR description
In version 18.0, a traceback occurs when editing the 'Appointment: Attendee Invitation' email template and then signing up for an appointment. **Steps to reproduce:** 1. Go to **Appointments**. 2.…
In version 18.0, a traceback occurs when editing the 'Appointment:
Attendee Invitation' email template and then signing up for an
appointment.
**Steps to reproduce:**
1. Go to **Appointments**.
2. Click the **"Action"** gear icon next to an appointment, then select **Edit**.
3. Navigate to the **Options** tab.
4. Hover over the **Booking Email** template and click the **arrow icon** to open
it.
6. In the Content tab, add some text near "Hello", then click **Save**.
7. Return to the **Appointment form**
8. Click the "**Go to Website**" smart button at the top
9. Select a date and time.
10. Confirm the appointment.
This raises a traceback
**In saas-18.3**, editing the `Appointment: Attendee Invitation` email
template throws an error when saving, making the template uneditable.
**Issue:**
The issue originates from this [commit](https://github.com/odoo/enterprise/commit/8b9a1a4462453bf64e7bc1307ededd0d127a27fa), which introduced a
`<div>` inside a `<p>` — a structure that violates the HTML specification.
Editing anything near the word 'Hello' in the template causes the
`<p>` tag to close prematurely during rendering. This pushes the `<div>`
outside of the `<p>`, breaking the directive chain and resulting in
the following error:
> SyntaxError: t-elif directive must be preceded by t-if or t-elif directive
Previously, the `<div>` was also pushed outside the `<p>`, but only after
evaluating all `t-if, t-elif, and t-else` conditions. Hence, it worked
correctly without editing the template.
**Solution:**
Placed the `<span>` as a child of the `<p>` tag to resolve the issue.
This fix also resolves the issue of being unable to edit the template
"Appointment: Attendee Invitation" in the UI **on saas-18.3**.
[Task-4624645](https://www.odoo.com/odoo/project.task/project.task/4624645)This fix improves how flexible working hours are reflected in planning time off and attendance Gantt progress. It helps managers see more accurate schedule and attendance information, especially when half-day leave or flexible hours are involved.
Original PR description
In this PR, we : - Readapt the Gantt progress calculation for attendance Related Community PR : https://github.com/odoo/odoo/pull/209570 task-4771288
The Belgian Acerta payroll export now handles a missing Acerta Affiliation Number more gracefully instead of crashing when users generate an export file. This helps payroll teams understand or resolve missing setup information without encountering a technical error.
Original PR description
When Acerta Affiliation Number is unset and user tries to generate export file, A traceback will appear. Steps to reproduce the error: - Install ``l10n_be_hr_payroll_acerta`` module and switch to…
When Acerta Affiliation Number is unset and user tries to generate export file,
A traceback will appear.
Steps to reproduce the error:
- Install ``l10n_be_hr_payroll_acerta`` module and switch to belgian company
- Create an employee A > Create a contract(Status: Running) for that employee A >
Details > Set Acerta code > save
- Go to Payroll > Configuration > Settings > Unset Acerta Affiliation Number
- Go to Payroll > Reporting > Export Work Entries to Acerta > New > Populate > Click on Generate Export File button
Traceback:
```
File "/home/odoo/src/enterprise/l10n_be_hr_payroll_acerta/models/hr_payroll_export_acerta.py", line 45, in _generate_line
return 'KLX1' + self.company_id.acerta_code + contract.acerta_code.zfill(20) \
TypeError: can only concatenate str (not "bool") to str
```
https://github.com/odoo/enterprise/blob/a4f68967a9826fac981c1141ece1791a0baf647a/l10n_be_hr_payroll_acerta/models/hr_payroll_export_acerta.py#L45
When ``self.company_id.acerta_code`` is not set,
It will lead to the above traceback.
sentry-6620429585The shop floor now shows the correct demand ratio for serial number tracked components and by-products when highlighted consumption is used. This removes confusing red warning indicators and helps production users better understand what is needed during manufacturing.
Original PR description
Issue: ----------------------------- The demand for move lines and by-products was not displayed properly for a serial number tracked product when using the highlight consumption component on the shop floor. A confusing ratio was shown in a red box, which created confusion for the user. Steps to Reproduce: ----------------------------- - Create a manufacturing order with a serial number tracked product and a highlight consumption component. - Observe the ratio display for the component move and by-products. - Notice the red box showing inconsistent or confusing values. With This Commit: ----------------------------- The issue occurred because an incorrect quantity was passed. After correcting the quantity, the demand ratio is now displayed properly, eliminating any confusing indicators. This improves clarity for users during production operations. Task-id: 4414647
This fix prevents Indonesian payroll payslips from crashing when the period start or end date is cleared. Users can edit payslip periods more safely without triggering an unexpected error.
Original PR description
Currently, An Error occurs on removing the **Date To** or **Date From** value from a payslip's period. **Steps to Reproduce** 1) Install **l10n_id_hr_payroll module**. 2) Create a new **Pay-Slip**. 3) Remove **Date** from **Period** **Error:** `AttributeError: 'bool' object has no attribute 'month'` **Root Cause:** The `_compute_l10n_id_include_pkp_ptkp` method at [1] assumes that `date_to` and `contract_id.date_end` are always set and valid. If either of them is missing (False), accessing `.month` or `.year` causes an error. [1] - https://github.com/odoo/enterprise/blob/34aa0ffb82c1bd7c90b4cb161ea515f2cad8e65f/l10n_id_hr_payroll/models/hr_payslip.py#L87 **Solution:** This commit prevents the computation from failing when `slip.date_to` and `slip.contract_id.date_end` fields are unset by adding a conditional check to ensure that both fields are valid date objects before accessing their `.month` and `.year` attributes. sentry-6608982173
Miscellaneous changes
**Current behavior:** COGS dashboard items in a project's profitability report do not open any details when clicked on. **Expected behavior:** This should open a detailed view for an invoice linked via the analytic account on the project. **Steps to reproduce:** 1. Create a service product that generates a project on sale, on the project template set a specific analytic account 2. Create another product with real time valuation and assign the COGS account on the product category's ex
Original PR description
**Current behavior:** COGS dashboard items in a project's profitability report do not open any details when clicked on. **Expected behavior:** This should open a detailed view for an invoice linked…
**Current behavior:** COGS dashboard items in a project's profitability report do not open any details when clicked on. **Expected behavior:** This should open a detailed view for an invoice linked via the analytic account on the project. **Steps to reproduce:** 1. Create a service product that generates a project on sale, on the project template set a specific analytic account 2. Create another product with real time valuation and assign the COGS account on the product category's expense account 3. Sell some of the service product and the auto val product in the same order, deliver it -> generate invoice & post it 4. In the project's settings, open the profitability report and click on the `Cost of Goods Sold` dashboard item **Cause of the issue:** There is no action set up to return for this section, as it was just added in: 0fbc592 **Fix:** Add an action to return the account move line records with COGS display type for the invoice record in question (in the request's `res_id`). opw-4813885 Forward-Port-Of: odoo/odoo#212547
…followers **Description of the issue/feature this PR addresses:** Currently all followers without portal access are able to see the button, in the email notification, that redirects to the portal (to see the quotation or sale order). This may be confusing and misleading, as the button will redirect them to the login page of the portal, to which they do not have access. This PR leaves the followers group options as default (button access disabled for followers) which ensures that only port
Original PR description
…followers **Description of the issue/feature this PR addresses:** Currently all followers without portal access are able to see the button, in the email notification, that redirects to the portal…
…followers **Description of the issue/feature this PR addresses:** Currently all followers without portal access are able to see the button, in the email notification, that redirects to the portal (to see the quotation or sale order). This may be confusing and misleading, as the button will redirect them to the login page of the portal, to which they do not have access. This PR leaves the followers group options as default (button access disabled for followers) which ensures that only portal users have access. **Current behavior before PR:** The 'follower' group in _notify_get_recipients_groups is being explicitly marked with 'has_button_access': True. Therefore followers without portal access are having access to the button. **Steps to reproduce:** 1. Configure odoo to be able to send out emails. 2. Install sale_management. 3. Create a sale order for a customer and add as follower another partner that has no portal access. This follower needs to have an email you have access to. 4. Send a message to the follower. 5. Test in the received email that the "View Quotation/Order" button is shown and when clicked, the user is redirected to the login page. **Desired behavior after PR is merged:** Only followers with portal access will have access to the button. Note that followers with portal access are directly categorized as 'portal_customer', so that is why it would make sense to simply remove the code where the followers without portal access are given access to the button. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210343 Forward-Port-Of: odoo/odoo#208402
With two events having an calendar.alarm that is set for 1 hour before the event and a first event having attendees Partner1 and Partner2 and a second event has attendees Partner2 to Partner3. _do_sms_reminder will sent SMS once for each event to attendees from Partner1 to Partner3. Original issue introduced here: a1087e301122eea626ed30f34198de4666a81bdf Enabled by recent fix here ce574e5edf7bc848c867727d8c66a8e7802b029f that is batching events by alarm. opw-4812919 Forward-
Original PR description
With two events having an calendar.alarm that is set for 1 hour before the event and a first event having attendees Partner1 and Partner2 and a second event has attendees Partner2 to Partner3. _do_sms_reminder will sent SMS once for each event to attendees from Partner1 to Partner3. Original issue introduced here: a1087e301122eea626ed30f34198de4666a81bdf Enabled by recent fix here ce574e5edf7bc848c867727d8c66a8e7802b029f that is batching events by alarm. opw-4812919 Forward-Port-Of: odoo/odoo#212076 Forward-Port-Of: odoo/odoo#211948
Forward-Port-Of: odoo/odoo#212188
Original PR description
Forward-Port-Of: odoo/odoo#212188
Consider this situation: - Customer invoice. - All invoice lines use a tax type with l10n_es_type=no_sujeto_loc. - The sum of the invoice is 0€. - Sent to SII. Before this patch, the process would raise a wrong `UserError`. If the process was being executed by the cron, **no invoice would be sent**, even if there was only one failing. After this patch, the invoice will be notified nevertheless. If there's any kind of real validation problem, the SII servers will return an error that wi
Original PR description
Consider this situation: - Customer invoice. - All invoice lines use a tax type with l10n_es_type=no_sujeto_loc. - The sum of the invoice is 0€. - Sent to SII. Before this patch, the process would raise a wrong `UserError`. If the process was being executed by the cron, **no invoice would be sent**, even if there was only one failing. After this patch, the invoice will be notified nevertheless. If there's any kind of real validation problem, the SII servers will return an error that will get logged in the invoice. No exceptions raised in Odoo. The process can continue. Faulty invoices are marked; others work. Apart from that, there's also the fix to support the specific case outlined above. @moduon MT-7949 OPW-4344661 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#189529
Before this **PR**: Only HUF was allowed as valid currency on company for Hungarian EDI. After this **PR**: Now both HUF and EUR is allowed as valid currency for Hungarian EDI. **task**-4707271 Forward-Port-Of: odoo/odoo#211600
Original PR description
Before this **PR**: Only HUF was allowed as valid currency on company for Hungarian EDI. After this **PR**: Now both HUF and EUR is allowed as valid currency for Hungarian EDI. **task**-4707271 Forward-Port-Of: odoo/odoo#211600
When creating an invoice with a german customer, the domestic fiscal position is not applied. Instead, it's the european one which cause the invoice to have 0% taxes by default. opw-4448821 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211277 Forward-Port-Of: odoo/odoo#192512
Original PR description
When creating an invoice with a german customer, the domestic fiscal position is not applied. Instead, it's the european one which cause the invoice to have 0% taxes by default. opw-4448821 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211277 Forward-Port-Of: odoo/odoo#192512
*l10n_es_edi_sii,l10n_es_edi_tbai,l10n_es_edi_tbai_multi_refund Related to https://github.com/odoo/enterprise/pull/85966 Forward-Port-Of: odoo/odoo#210881 Forward-Port-Of: odoo/odoo#210804
Original PR description
*l10n_es_edi_sii,l10n_es_edi_tbai,l10n_es_edi_tbai_multi_refund Related to https://github.com/odoo/enterprise/pull/85966 Forward-Port-Of: odoo/odoo#210881 Forward-Port-Of: odoo/odoo#210804
When creating an inter-wh transfer, the replenish order was showing the product's supplier in the Received From (partner_id) field and not the correct wh. Steps to reproduce: ------------------- * In Inventory, activate Multi-step Routes * Create a new WH that can be Resupplied From another WH * On a product, in the Inventory tab, activate the Route 'ABC: Supply Product from XYZ' * On the forecast of that product, click on Replenish * Match fields: Warehouse = ABC, Preferred Route = 'AB
Original PR description
When creating an inter-wh transfer, the replenish order was showing the product's supplier in the Received From (partner_id) field and not the correct wh. Steps to reproduce: ------------------- * In…
When creating an inter-wh transfer, the replenish order was showing the product's supplier in the Received From (partner_id) field and not the correct wh. Steps to reproduce: ------------------- * In Inventory, activate Multi-step Routes * Create a new WH that can be Resupplied From another WH * On a product, in the Inventory tab, activate the Route 'ABC: Supply Product from XYZ' * On the forecast of that product, click on Replenish * Match fields: Warehouse = ABC, Preferred Route = 'ABC: Supply Product from XYZ' * Confirm * Open the generated order > Observation: > The field Receive From contains the supplier of the product instead of the supplying WH. Why the fix: ------------ The supplier_id was automatically set with the product's supplier_id. It's not correct for every routes. It's now updated accordingly to the route used and if we need the vendor. opw-4717654 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210336
[FIX] website: update sitemap lastmod on website page view changes Before this commit, since the introduction of the website page model at commit [1], the lastmod for pages indicated in the sitemap was not entirely accurate: it only considered *page record* changes, not their internal *view changes*. Steps to reproduce: - Create a new website page and publish it - Go to /sitemap.xml, see the page is mentioned with correct lastmod - Wait for one day ** - Update the page URL - Go to
Original PR description
[FIX] website: update sitemap lastmod on website page view changes Before this commit, since the introduction of the website page model at commit [1], the lastmod for pages indicated in the sitemap…
[FIX] website: update sitemap lastmod on website page view changes
Before this commit, since the introduction of the website page model at
commit [1], the lastmod for pages indicated in the sitemap was not
entirely accurate: it only considered *page record* changes, not their
internal *view changes*.
Steps to reproduce:
- Create a new website page and publish it
- Go to /sitemap.xml, see the page is mentioned with correct lastmod
- Wait for one day **
- Update the page URL
- Go to /sitemap.xml, see the lastmod was updated
- Wait for one day **
- Update the page content
- Go to /sitemap.xml
=> The lastmod was unchanged
**: the lastmod does not show the hours. You will need to update the
write_date manually in your database to test this. Also, when
visiting the sitemap, you need to first delete the cached version
in the backend (Debug -> Settings -> Technical -> Attachments).
[1]: https://github.com/odoo/odoo/commit/4ecbacaf59576a22ff45615a5aa5c67244e4fb93
Forward-Port-Of: odoo/odoo#212055
Forward-Port-Of: odoo/odoo#211749…ivery **Problem:** When a product is added to a sale order from the delivery the cost is not computed **Steps to reproduce:** - Activate the "Margins" Settings - Open Sales/Products and create a product - In the product Type field, choose consumable and set a postive cost - Do the same for a second product - Navigate to Sales/Order and create a new quotation - Add your first product and Confirm - Click on the Delivery smart button and then on the Detailed Operations smart bu
Original PR description
…ivery **Problem:** When a product is added to a sale order from the delivery the cost is not computed **Steps to reproduce:** - Activate the "Margins" Settings - Open Sales/Products and create a…
…ivery **Problem:** When a product is added to a sale order from the delivery the cost is not computed **Steps to reproduce:** - Activate the "Margins" Settings - Open Sales/Products and create a product - In the product Type field, choose consumable and set a postive cost - Do the same for a second product - Navigate to Sales/Order and create a new quotation - Add your first product and Confirm - Click on the Delivery smart button and then on the Detailed Operations smart button - Click on New, add your second product and set a quantity of 1 - Go back to the delivery and validate it - Go back to the sale order **Current behavior:** A line has been added with the product but the Cost is zero **Expected behavior:** The cost should be computed **Cause of the issue:** Because of the elif logic here https://github.com/odoo/odoo/blob/799761246820eee73492277ab18f327ba04b6b96/addons/sale_stock_margin/models/sale_order_line.py#L17-L22 the cost of products added on delivery with a standard price will be computed using _compute_average_price https://github.com/odoo/odoo/blob/799761246820eee73492277ab18f327ba04b6b96/addons/sale_stock_margin/models/sale_order_line.py#L23 We should instead add the line to "line_ids_to_pass" so they're computed with the super method **Fix:** Changing the elif logic to make sure that if a product is added in delivery and has a non standard cost method it's cost is computed here https://github.com/odoo/odoo/blob/799761246820eee73492277ab18f327ba04b6b96/addons/sale_stock_margin/models/sale_order_line.py#L23 but if it's added in delivery and has a standard cost method, we call the super method for this line opw-4581531 Forward-Port-Of: odoo/odoo#208176
Steps to Reproduce: ----------------- 1) Create an Accrual - Set carryover_date to other - Set carryover_month to April. - Set carryover_day to Last Day. 2) Add an Accrual Rule to the accrual. 3) Create a Leave Allocation - Set allocation_type to Accrual. - Assign the Employee. - Define the Validity Period (date_from, date_to). **Issue:** ------------------- On accrual creation when the user selects the "last day" option for carryover_day, we are currently assigning th
Original PR description
Steps to Reproduce: ----------------- 1) Create an Accrual - Set carryover_date to other - Set carryover_month to April. - Set carryover_day to Last Day. 2) Add an Accrual Rule to the accrual. 3)…
Steps to Reproduce: ----------------- 1) Create an Accrual - Set carryover_date to other - Set carryover_month to April. - Set carryover_day to Last Day. 2) Add an Accrual Rule to the accrual. 3) Create a Leave Allocation - Set allocation_type to Accrual. - Assign the Employee. - Define the Validity Period (date_from, date_to). **Issue:** ------------------- On accrual creation when the user selects the "last day" option for carryover_day, we are currently assigning the 31st as the day Hardcoding the 31st as the `carryover_day` can lead to errors when the `_get_carryover_date` method is triggered. For example, this causes failures in months with fewer days (e.g., February or April). **Fix:** ----------- evaluate the correct carryover_day based on the selected month & year when the value is set to last day, before using it to prepare the final date. This ensures that the last day of each month is accurately determined and applied. **Traceback:** ------------ ValueError: day is out of range for month **OPW:** 4792938 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211205
**Steps to reproduce:** - Install Accounting and l10n_es_edi_facturae - Switch to a Spanish company (e.g. ES Company) - Create or edit a Spanish customer and set "Facturae" as eInvoice format - Create an invoice: * Customer: [the Spanish customer] * Product: [any] * Customer Reference: [anything] - Confirm the invoice - Generate Facturae edi file via "Send & Print" button - Check the generated XML **Issue:** When submitting the XML to FACe service, the XML is rejected with th
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_es_edi_facturae - Switch to a Spanish company (e.g. ES Company) - Create or edit a Spanish customer and set "Facturae" as eInvoice format -…
**Steps to reproduce:** - Install Accounting and l10n_es_edi_facturae - Switch to a Spanish company (e.g. ES Company) - Create or edit a Spanish customer and set "Facturae" as eInvoice format - Create an invoice: * Customer: [the Spanish customer] * Product: [any] * Customer Reference: [anything] - Confirm the invoice - Generate Facturae edi file via "Send & Print" button - Check the generated XML **Issue:** When submitting the XML to FACe service, the XML is rejected with the following error: "Element 'ReceiverContractReference': This element is not expected. Expected is one of ( FileDate, SequenceNumber, DeliveryNotesReferences, ItemDescription )." It is caused by "ReceiverContractReference" being set after "FileReference" in the invoice line section. Apparently, the order defined in the documentation should be respected. "ReceiverContractReference" should be set before "ReceiverTransactionReference". The issue has been introduced by this other fix: https://github.com/odoo/odoo/commit/ac1af565161d70d57f51d579d0530eb7766c0c76 opw-4579987 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211177
Steps to reproduce: 1. Open Event > any upcoming event 2. make sure to check website submenu and showcase exhibitors 3. Create a sponsor with the exhibitor type and publish the website 4. Open private window in browser and go to exhibitor page by 5. Go to Events > Modfied Event > Exhibitor submenu 6. Turn on debug mode 7. Now click on more info button inside the exhibitor card Issue: - Invalid prop 'close' is used but not passed. Solution: - Add close prop in ExhibitorConnectClose
Original PR description
Steps to reproduce: 1. Open Event > any upcoming event 2. make sure to check website submenu and showcase exhibitors 3. Create a sponsor with the exhibitor type and publish the website 4. Open private window in browser and go to exhibitor page by 5. Go to Events > Modfied Event > Exhibitor submenu 6. Turn on debug mode 7. Now click on more info button inside the exhibitor card Issue: - Invalid prop 'close' is used but not passed. Solution: - Add close prop in ExhibitorConnectClosedDialog Backport of https://github.com/odoo/odoo/commit/a8a0e3b7a36e743aa24c51f96f1947e3bcaa5a5f opw-4737183 Forward-Port-Of: odoo/odoo#212308
### Before this commit: The `IBAN number` in the PDF footer is currently broken and displayed across multiple lines.  ### After this commit: Fix it by updating the CSS classes to ensure proper alignment and a cleaner UI layout.  > Task-4822070 --- I confirm I have signed the CLA and read the PR guidelines a
Original PR description
### Before this commit: The `IBAN number` in the PDF footer is currently broken and displayed across multiple lines.  ### After this commit: Fix it by updating the CSS classes to ensure proper alignment and a cleaner UI layout.  > Task-4822070 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212144
The function `_get_consumed_leaves`, that was in the hr_employee model is used in a compute method of the hr_employee_base model. This was causing some issues as the inhertiance is from hr_employee_base to hr_employee. This commit fixes the issue by moving the function to hr_employee_base. Also, a function in `hr_org_chart` was not taking care that an employee can be public or not, which lead to model inconsistencies errors. task-4742768 Forward-Port-Of: odoo/odoo#207026
Original PR description
The function `_get_consumed_leaves`, that was in the hr_employee model is used in a compute method of the hr_employee_base model. This was causing some issues as the inhertiance is from hr_employee_base to hr_employee. This commit fixes the issue by moving the function to hr_employee_base. Also, a function in `hr_org_chart` was not taking care that an employee can be public or not, which lead to model inconsistencies errors. task-4742768 Forward-Port-Of: odoo/odoo#207026
*l10n_es_real_estates,l10n_es_reports,l10n_es_reports_2024 Related to https://github.com/odoo/odoo/pull/210804 Forward-Port-Of: odoo/enterprise#86009 Forward-Port-Of: odoo/enterprise#85966
Original PR description
*l10n_es_real_estates,l10n_es_reports,l10n_es_reports_2024 Related to https://github.com/odoo/odoo/pull/210804 Forward-Port-Of: odoo/enterprise#86009 Forward-Port-Of: odoo/enterprise#85966
Steps to reproduce: - Open Follow-up levels for 15 days -Check the option for “Automatic” - Go to the email template set in the “Content Template” and set a test email in the CC of the email configuration. - Open the follow up reports for a sample customer who is in the “15 days” stage and change the next reminder date to be a day before today. The reminder must be set to automatic. - There will appear a red ribbon on the right corner that says “In need of action” - In another tab, open sch
Original PR description
Steps to reproduce: - Open Follow-up levels for 15 days -Check the option for “Automatic” - Go to the email template set in the “Content Template” and set a test email in the CC of the email…
Steps to reproduce: - Open Follow-up levels for 15 days -Check the option for “Automatic” - Go to the email template set in the “Content Template” and set a test email in the CC of the email configuration. - Open the follow up reports for a sample customer who is in the “15 days” stage and change the next reminder date to be a day before today. The reminder must be set to automatic. - There will appear a red ribbon on the right corner that says “In need of action” - In another tab, open scheduled actions and Open the action “Account Report Followup; Execute followup” - Run this action manually Issue: Go to the previous tab and notice that the email is only sent out to the customer partner record and not the cc email address Note: This issue only occurs if the automatic followup is set. If we try to manually followup by clicking on the “Follow Up” button on the customer report, the email is sent correctly to both addresses. Cause: When running the cron, the recipients aren't in the options Solution: Add an helper to find all necessary recipients from the template if no recipient ids in the options opw-4527398 Forward-Port-Of: odoo/enterprise#84714 Forward-Port-Of: odoo/enterprise#83944
The current implementation to handle the rate for multi-currency entries in CAMT creates problems when fetching the source rate from the file: the source rate can be taken from the SrcCcy or the TrgtCcy node, which should be compared with the source currency and target currency respectively. It is not done that way and is too restrictive (when the SrcCcy is found, it is always compared to the target currency, which leads to an incorrect transaction amount). Moreover, when the currency convers
Original PR description
The current implementation to handle the rate for multi-currency entries in CAMT creates problems when fetching the source rate from the file: the source rate can be taken from the SrcCcy or the TrgtCcy node, which should be compared with the source currency and target currency respectively. It is not done that way and is too restrictive (when the SrcCcy is found, it is always compared to the target currency, which leads to an incorrect transaction amount). Moreover, when the currency conversion introduces a exchange loss/gain, it is put back on the largest transaction of the entry. Backport of https://github.com/odoo/enterprise/pull/76828 and https://github.com/odoo/enterprise/pull/42763 opw-4672283 Forward-Port-Of: odoo/enterprise#84775 Forward-Port-Of: odoo/enterprise#83131
Before this commit, when the user creates more than one fsm project, the default fsm project selected once a fsm task is created if the one with the lowest sequence and lowest id which could be confusing for the user since the default order displayed in the list view of projects is `sequence, name, id`. This commit makes sure the default fsm project fetched is the first one displayed in the list view of projects. opw-4791468 Forward-Port-Of: odoo/enterprise#86554
Original PR description
Before this commit, when the user creates more than one fsm project, the default fsm project selected once a fsm task is created if the one with the lowest sequence and lowest id which could be confusing for the user since the default order displayed in the list view of projects is `sequence, name, id`. This commit makes sure the default fsm project fetched is the first one displayed in the list view of projects. opw-4791468 Forward-Port-Of: odoo/enterprise#86554