Daily updates from Odoo
Friday, May 8, 2026
283 changes
24 changes
New functionality added to Odoo
This update allows users to download General Ledger reports in CSV format. This provides greater flexibility for analyzing financial data and integrating it with other business systems. This enhancement improves reporting capabilities and supports more efficient data management.
Original PR description
task-5734354 Forward-Port-Of: odoo/enterprise#116646 Forward-Port-Of: odoo/enterprise#107638
Enhancements to existing features
This update ensures Odoo can correctly validate Brazilian CNPJs, which are transitioning to an alphanumeric format due to government expansion. This change avoids a dependency issue with an older validation library and prepares Odoo for future Brazilian business registrations. It’s a necessary update to support Brazilian businesses accurately.
Original PR description
Purpose: The Brazilian Federal Government, through the Brazilian Federal Revenue Service (Receita Federal do Brasil), is implementing the alphanumeric CNPJ to address the imminent depletion of its…
Purpose: The Brazilian Federal Government, through the Brazilian Federal Revenue Service (Receita Federal do Brasil), is implementing the alphanumeric CNPJ to address the imminent depletion of its capacity to generate new CNPJ numbers. The current, exclusively numeric model is approaching its limit. The transition to a format that includes letters and numbers expands the number of possible combinations, ensuring the future availability of registrations for new companies. With the government expanding the CNPJ numbers, we need to implement a solution to support the alphanumeric CNPJ that will be issued starting July 2026. Current Behavior: The method, `is_valid,` from stdnum is currently used to determine whether the CNPJ is valid or not. This is now considered an outdated method to determine the validation. Changed Behavior: The new validation logic by stdnum, found here https://github.com/arthurdejong/python-stdnum/commit/d3ec3bd7fefe0d0a708b6594a66de28777eb9b8d, is patched into `check_vat_br.` The reasoning for patching this rather than calling stdnum is because using stdnum will cause library dependency issues for older versions of Odoo. task-5234869 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262939 Forward-Port-Of: odoo/odoo#260516
This update ensures the demo data for Brazil (l10n_br) is accurate and reliable. The changes update product and company information, improving the quality of testing and providing a more realistic demonstration of the Brazil localization features within Odoo. This helps ensure accurate reporting and configuration for businesses using the Brazil module.
Original PR description
Updated Brazil Product and company demo data to ensure accurate testing task-6159933 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261636
This update improves the Brazil demo data within Odoo Enterprise to ensure accurate testing of the l10n_br_avatax module. The changes include updated product and company data, allowing for more reliable testing of Brazil-specific tax calculations and reporting. This ensures the demo environment reflects the latest requirements.
Original PR description
Updated Brazil Product and company demo data to ensure accurate testing task-6159933 Forward-Port-Of: odoo/enterprise#115361
Resolved issues and error corrections
This update resolves intermittent errors occurring during tests for the planning field service's geolocation functionality. These errors were causing unreliable test results, and this fix ensures the geolocation tests are now consistently reliable. This improves the stability and accuracy of the planning field service.
Original PR description
This commits aims to resolve the undeterministic failures of the planning field service geolocation tests.
This update resolves an issue where, after scanning a different serial number from a reserved one, both serial numbers incorrectly appeared on the picking view. The fix ensures the system waits for a necessary process to complete, correctly displaying only the intended serial number.
Original PR description
Problem: When entering the barcode interface from a picking and scanning a different serial number than one already reserved, a new line gets created in certain situations. When exiting the barcode…
Problem: When entering the barcode interface from a picking and scanning a different serial number than one already reserved, a new line gets created in certain situations. When exiting the barcode interface without validating the picking, both serial numbers show up on the picking view. However, the first serial number’s `stock.move.line` was deleted, so only one serial number should be there. When exiting the barcode interface a call to `post_barcode_process` is made, where the extra `stock.move.line` is deleted, but it doesn’t wait for the call to finish. https://github.com/odoo/enterprise/blob/d5a52cb79c9c41d792685d2858cfeb6aee147642/stock_barcode/static/src/models/barcode_picking_model.js#L1896 Purpose: By overriding `beforeQuit` to add the `_onExit` call, the component now waits for the `post_barcode_process` call to finish before navigating back to the picking view. This helps ensure the UI displays the updated data. Steps to reproduce on Runbot: Create a product tracked by serial numbers. Have 2 units on hand: serial 001 with a package, and serial 002 without a package. (This is needed so the barcode app will create a new line). Create a delivery for 1 unit of our test product and mark it as todo. Ensure that serial 001 is reserved. Click the Barcode smart button and scan the barcode for serial 002. Click the back button. Observe that both serial numbers are shown on the picking. Refresh the page and observe only serial 002 is now shown. opw-6105740 Forward-Port-Of: odoo/enterprise#115491
This change removes unnecessary debugging code (console.log statements) from the Gantt chart module. These logs were unintentionally left in the codebase, which could potentially impact performance and data privacy. This fix ensures a cleaner and more reliable user experience.
Original PR description
Before this PR, a console.log was left out. task-6201248
This update fixes visual inconsistencies and usability issues within the calendar form and quick create form. The changes include aligning elements, improving the appearance of dropdowns, and correcting display issues for numerical counts, resulting in a cleaner and more intuitive user experience. This enhancement focuses on the calendar and calendar_sms modules.
Original PR description
Fix quick create form view by: - making sure all the icons and fields are aligned - coloring them gray - extending the dropdowns to match the modal width - replacing the all day boolean widget by a regular checkbox Fix form view by: - condensing the duration and all day fields on a single line like it was in previous version - only displaying the discuss videocall creation button if the videocall link input is focused - aligning the attendees information with the fields labels Also making sure the "+ ..." box next to users and resources in the kanban view is correctly displaying the whole number instead of cropping it. Task-6191731 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves minor visual inconsistencies in the calendar event views across different forms. Specifically, the resource selection field now uses the full width of the modal, and a cropping issue with user counts in the Kanban view has been fixed. These changes improve the overall user experience and consistency of the appointment scheduling system.
Original PR description
Purpose ======= Fix some small UI issues accross multiple calendar.event views Specification ============= In the quick create form view, extend the resources input so that it takes all the width of the modal like other fields. .o_tags_input elements are mw-100 but not w-100 like other inputs making them shorter than intended. In the kanban view, remove fixed width on "+ ..." users/resources count so that higher numbers aren't cropped. When calendar.event records has no name and a single attendee which is not a staff user, the event was renamed "attendee name - appointment type name". Changing that to name the event with the attendee name only, a filter/group by on the appointment types makes it easy to know which appointment type it's linked to. Task-6191731
This update resolves an issue where moving workorders in the Kanban view incorrectly recalculated dates and times. The fix eliminates unnecessary date recalculations, improving the accuracy of workorder planning and scheduling within the MRP module. It also addresses minor UI improvements for the workorder list view.
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 update streamlines the work order planning process by reordering and renaming menus for better usability. It also fixes an issue where the Gantt chart displayed all employees, even those without assigned work orders, and now accurately reflects work order assignments through improved employee search functionality. The update restores additional views from the Gantt and Kanban views.
Original PR description
Some ui fixes for the new workorder planning Task: 6143389
This update fixes an issue where product images and names were displayed on separate lines in PDF reports when product names were long. Enabling product image display now ensures images and product names appear together for a cleaner and more professional-looking PDF. This improves the visual presentation of sales documents.
Original PR description
When enabling the settings 'Display Product Images' and generating a PDF with a long name for the product, the product name and image appear on different lines. This fix ensures the image and product stay on the same line. **Before:** <img width="1009" height="563" alt="before" src="https://github.com/user-attachments/assets/52c5b566-400c-4040-8ec7-710278dc1387" /> **After:** <img width="1016" height="676" alt="after" src="https://github.com/user-attachments/assets/d7d82455-f983-4f9e-9b2d-db5482c4f558" />
This update ensures that imported records open with the same context as the original import action. Previously, imported invoices lacked the correct default settings, leading to incorrect column visibility and data defaults. This fix maintains consistency and simplifies the import process for users.
Original PR description
**Problem:** After importing records through the Import action, the list view that opens with the imported records does not inherit the context of the originating action. Column visibility and…
**Problem:**
After importing records through the Import action, the list view that opens with the imported records does not inherit the context of the originating action. Column visibility and default values that depend on that context (e.g. `default_move_type` on the shared invoice list) end up wrong.
**Steps to reproduce:**
1. Go to Accounting → Customers → Invoices
2. Click "Favorites → Import records"
3. Upload a CSV containing at least one valid customer invoice row
4. Run the import and look at the "Imported records" list that opens
**Current behavior:**
The imported records list opens with an empty context. Columns rendered conditionally on `default_move_type` (invoice-type-specific columns on `account.view_invoice_tree`) are not shown as they are when opening the list from the menu, and records created from that list have no default move type.
**Expected behavior:**
The imported records list should open with the same context as the action the user started the import from (e.g.
`{ default_move_type: 'out_invoice' }` for customer invoices), so columns and defaults match the previous view.
**Cause of the issue:**
`openRecords()` in `import_action.js` builds the follow-up `ir.actions.act_window` but never forwards `this.model.context`. The model already holds the context passed through the import action's `params.context`, but it is dropped when the redirect action is dispatched, so the window action opens with an empty context.
**Fix:**
Forwarding the context the import was launched with keeps the user inside the same functional scope (invoice type, default partner, company, etc.) when they land on the imported records list. Column visibility logic and default values that rely on that context behave identically to opening the list through the normal menu flow.
opw-6120758
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#261309This update fixes an issue where a child contact's zipcode would incorrectly override a parent's manually entered zipcode. The change ensures that child contact zipcodes always match the parent's city zipcode, maintaining accurate address information. This prevents inconsistencies and ensures data integrity.
Original PR description
Currently, when a res.parter is given a parent, base_address_extended runs _onchange_city_id. This sees the city change and alters the zipcode to match the city's zipcode. However, this field can be…
Currently, when a res.parter is given a parent, base_address_extended runs _onchange_city_id. This sees the city change and alters the zipcode to match the city's zipcode. However, this field can be manually altered to differ from the city's zipcode. Thus, when a parent has a city, the zipcode will override the manually entered zipcode for a child contact. This commit solves this by checking for the parent's zipcode before blindly setting it to the city's zipcode. Steps to reproduce: 1. Install `base_address_extended` 2. Enable "Enforce Cities" on a country `(res.country)` 3. Add a city to that country with a zipcode of 123 4. Create a new contact (parent) and select the configured country 5. Select the city (the zipcode will fill in from the city's zipcode) 6. Overwrite the zipcode with 456 7. Save the contact (parent) 8. Create a new contact (child) 9. Set the company to the parent contact and save 10. The zipcode of the child will be the city's zip (123), not the parents' zip (456), thus the addresses will be different, and the child contact type will be 'other' opw-6131280 closes #262651 Forward-Port-Of: odoo/odoo#263401 Forward-Port-Of: odoo/odoo#262651
This update significantly speeds up the inventory valuation report by optimizing how it calculates accruals. The changes batch computations and remove unnecessary loops, resulting in a much faster report generation time. This improves the user experience and reduces processing time for large inventories.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249624 Forward-Port-Of: odoo/odoo#247625
This update prevents the 'Start a Poll' action from appearing when users are editing an existing message within a channel or group. This change improves the user experience by ensuring the poll action is only available when composing a new message, aligning with its intended purpose.
Original PR description
**Description of the issue/feature this PR addresses:** ---------------------------------------------- When editing a message in a channel or group and opening the 'More Actions' menu in the…
**Description of the issue/feature this PR addresses:** ---------------------------------------------- When editing a message in a channel or group and opening the 'More Actions' menu in the composer, the 'Start a poll' action is displayed among the available options. Starting a poll while editing an existing message makes no sense, as polling is only meaningful when composing a new message. **Current behavior before PR:** ---------------------------------------------- - 'Start a poll' action appears in the composer 'More Actions' menu even when the user is editing an existing message - Clicking it while in edit mode opens the poll creation dialog, which is misleading and unintended behavior **Desired behavior after PR is merged:** ---------------------------------------------- - 'Start a poll' action is hidden from the 'More Actions' menu when the composer is in edit mode - The action continues to appear as expected when composing a new message in a channel or group conversation Task-6171541 ---------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262040 Forward-Port-Of: odoo/odoo#261961
This update resolves an issue where payment reminders wouldn't display correctly when the 'Payment' module wasn't installed. The fix ensures the system checks for the necessary 'payment.method' model before attempting to use it, preventing template rendering errors. This ensures payment reminders function properly regardless of the installed modules.
Original PR description
Repro steps: 1. Initialize a new DB 2. Install account_followup module without payment module 3. Go to Email templates > Payment reminder 4. Click on Preview You will get an error Failed to render QWeb template for Mail Template: 'Payment Reminder' (ID: 9) Target Model: res.partner Language context: en_US Error: Error while render the template KeyError: 'payment.method' Root cause: The method `_show_pay_now_button` that was being called in the template email_template_followup_1 was using self.env['payment.method'] even tho payment module is not a dependency of account_followup Fix: The introduced fix ensures that 'payment.method' model exists before attempting to use it build_error-243030 Forward-Port-Of: odoo/enterprise#116692 Forward-Port-Of: odoo/enterprise#116079
This update fixes an issue where users couldn't reliably edit text within editable buttons in the website builder. The change wraps button content in a span and removes it before saving, preventing duplication of branding and ensuring accurate text insertion. This improves the user experience and consistency when customizing website content.
Original PR description
Commit 072a8e4fd061ff23902e6e448a577624cb27e188 fixes edition of buttons by wrapping the editable button in an editable span. But it allows user to write outside the savable node, and allows user to…
Commit 072a8e4fd061ff23902e6e448a577624cb27e188 fixes edition of buttons by wrapping the editable button in an editable span. But it allows user to write outside the savable node, and allows user to copy website builder's branding attributes (which causes issues when pasted). This commit adds a span inside the button instead of outside, and removes it before saving the content. Steps to reproduce: - Open website buider on `/product/item-1` - Place the cursor in the "Add to cart" button - Press left arrow, repeat until out of the button - Bug: You can write text there, but it won't be saved ##### - Open website buider on `/product/item-1` - Select some text in the "Add to cart" button - Copy (`ctrl+c`) - Paste (`ctrl+v`) - Bug: Some content seems duplicated: the branding of the savable button has been duplicated inside it and the automatic replication between identical fields is based on this branding, thus replicates the button's content inside it Similar issue about copy+pasted branding: ec93d48ab17b4a72f61fa358e5a81d2abcb18897 Forward-Port-Of: odoo/odoo#257849
This update resolves an issue where purchase users couldn't see the available stock for products due to access restrictions in the stock forecast calculation. The PR adds temporary access rights (sudos) to ensure purchase users can accurately view stock levels when working with sales orders. A related test case was also corrected to ensure accurate stock availability calculations.
Original PR description
If a user with purchase rights but not sale rights opens a product, they won't see the free to use stock because the outgoing stock is based on the SO lines, which the purchase user can't access. This PR adds 2 sudos to `_compute_forecasted_without_stock`, one in purchase and one in sale. The sudos only affect a `_read_group` call and the result is not propagated outside of the compute function runbot error 243227 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a test failure caused by an expired document range error when invoice dates are in the future (2027+). The team applied a temporary fix – freezing the test's time – to ensure the tests pass and the core functionality remains stable. This ensures continued development and testing of the l10n_do_edi module.
Original PR description
Problem: Tests are failing from a ValidationError, signaling that the document range expired, when the invoice date is 2027 and onwards. To resolve the bug, freeze_time needs to be applied on the tests. Related PR: https://github.com/odoo/enterprise/pull/112814 runbot-build-error-243527
This update fixes a bug in how Odoo calculates product costs when using FIFO stock valuation and lot tracking, particularly in complex branch setups. The issue stemmed from incorrect fallback cost calculations leading to inaccurate inventory values and potential cost discrepancies. This ensures more reliable inventory tracking and reporting.
Original PR description
Databases that are configured to have products be evaluated by lot and FIFO can experience weird behavior when the product's cost or `standard_price` is updated. The current code doesn't account for…
Databases that are configured to have products be evaluated by lot and FIFO can experience weird behavior when the product's cost or `standard_price` is updated. The current code doesn't account for the fact that we allow users to dip into negative quantities and there aren't enough safeguards against this. This leads to the following bug that I found: The FIFO algorithm can't be calculated when there is no quantity. Odoo uses a fallback cost whenever quantity is less than zero, but this is incorrect when the product is evaluated by lots. Current behavior would calculate the fallback based on the product's standard price instead of the lot's standard price, leading to self-propagating calculation errors (e.g. cost going up to the trillions) Videos of the bug: Bug: ( Lot value defaults back to the product's standard price ) https://drive.google.com/file/d/1gUtjzdLpjeJts8HcxbTZ9MG4bSjRYmeT/view?usp=drive_link Related tickets: opw-6011189 Forward-Port-Of: odoo/odoo#263127 Forward-Port-Of: odoo/odoo#256113
This update resolves a technical issue preventing users from correctly booking appointments with multiple seats and capacity limits. The fix corrects a problem where the system incorrectly interpreted a setting, causing a booking error. This ensures appointments with flexible scheduling and capacity management now function reliably.
Original PR description
### Steps to reproduce: - Download "Appointment" and "Website" - Configure an appointment to be booked by resource with multiple seats and manage capacity - Set the schedule to be flexible and configure valid time slots - Go to the booking page and select the number of participants > Traceback: cannot unpack non-iterable bool object ### Cause of Issue: The `_get_appointment_slots` method unpacks the `appointment_slots_force_month` directly: https://github.com/odoo/enterprise/blob/4ca3dddaeadeb6c937d555cc4da8fb4bb61fea35/appointment/models/appointment_type.py#L871 Since the `appointment_slots_force_month` value was explicitly set to `False` in https://github.com/odoo/enterprise/blob/4ca3dddaeadeb6c937d555cc4da8fb4bb61fea35/appointment/controllers/appointment.py#L1063-L1070 the unpacking operation failed because it tried to unpack a boolean instead of a tuple. opw-6197653 Forward-Port-Of: odoo/enterprise#116671 Forward-Port-Of: odoo/enterprise#116613
The budget report now accurately displays data without duplicate analytic lines. This issue stemmed from a recent performance optimization of the budget report query, which inadvertently caused duplicate entries. The fix ensures unique reporting by using a revised query structure.
Original PR description
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item…
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item (linked to Analytic Account A). - Open the budget report and remove the default "open budget" filter. Duplicate amounts appear in the pivot view and duplicate lines appear in the list view. #### Cause: In #104299, the query in `_get_aal_query` was refactored for performance to avoid a single query with an OR condition in the LEFT JOIN. It was replaced by two separate queries combined with `UNION ALL`. This caused some lines to be captured by both queries, resulting in duplicates in the final report. #### Fix: Use three separate queries, each with specific filter conditions to guarantee unique results: Q1 - Analytic lines with no matching budget line. Q2 - Analytic lines matched to a budget line with no company (null-company). Q3 - Analytic lines matched to a company-specific budget line. OPW-6051696 Forward-Port-Of: odoo/enterprise#116612
This update resolves a problem where long text fields in sign documents (like contact names) were not properly wrapped, resulting in text overflowing and appearing as a single line in the final PDF. The fix ensures that all text, including long names and continuous text, is correctly displayed within the designated field boundaries, improving the document's appearance and readability.
Original PR description
### Steps to reproduce: - Download 'Sign' and 'Contacts' apps - Create a contact with a really long name - Create a sign document template with a multiline text field (Read-only) that has contact…
### Steps to reproduce: - Download 'Sign' and 'Contacts' apps - Create a contact with a really long name - Create a sign document template with a multiline text field (Read-only) that has contact name value - Click 'Sign Now' and put the new contact as the signer - Sign and download > The text appears as a single extended line exceeding field/page boundaries ### Cause of Issue: The textarea and stamp field rendering only handled explicit newline characters (`\n`) and did not account for text that exceeded the field width. https://github.com/odoo/enterprise/blob/017743cbe97b629e9d9f1895b655014d4c3abbcb/sign/models/sign_document.py#L330-L345 When the HTML preview showed wrapped text, the PDF output rendered it as a single line. For continuous text without spaces, the text would overflow the field boundaries entirely. ### Fix: Accounted for long texts that have spaces and long words to show all the information in the PDF opw-6045062 Forward-Port-Of: odoo/enterprise#116658 Forward-Port-Of: odoo/enterprise#114813
10 changes
Enhancements to existing features
This update improves the demo data for Odoo's Brazil localization (l10n_br) module. The changes ensure the demo data accurately reflects Brazil's tax and business regulations, making it more reliable for testing and showcasing the module's functionality. This update primarily impacts the demonstration of the l10n_br module.
Original PR description
Updated Brazil Product and company demo data to ensure accurate testing task-6159933 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261636
This update improves the accuracy of the Brazil demo data within Odoo Enterprise. The changes to product and company data ensure that testing of the l10n_br_avatax module runs smoothly and reflects current Brazilian tax regulations. This supports ongoing development and validation of the Brazil localization features.
Original PR description
Updated Brazil Product and company demo data to ensure accurate testing task-6159933 Forward-Port-Of: odoo/enterprise#115361
Resolved issues and error corrections
This update resolves a technical issue that could cause errors when closing all conversations in Odoo. The fix prevents a re-render from triggering a traceback, ensuring a smoother and more reliable chat closing experience. This improves overall system stability.
Original PR description
When closing all conversations from ChatHub, setting `confirmCloseResolver` to `null` in `_canClose()` starts a re-render of ChatHub and ChatWindow, but the render does not complete and `requestClose()` continues. During this flow, `close()` deletes the chat window, and when the re-render of ChatWindow actions continues, the call and camera-call action name callbacks try to access `channel.hasRtcSessionActive`, causing a traceback. This commit fixes the issue by adding optional chaining on channel in the name functions of the call and camera-call thread actions. Task-[6120744](https://www.odoo.com/odoo/project/1519/tasks/6120744) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where Peppol invoices were incorrectly identifying branch companies as the sender instead of the parent company. The change ensures that the UBL/CII file accurately reflects the parent company's data, complying with Peppol regulations and improving invoice accuracy for international transactions. This resolves a prior error impacting data consistency.
Original PR description
### Issue before this commit: The XML export for branch companies incorrectly identified the branch as the sender, even when a Peppol parent company was configured. ### Steps to reproduce the issue:…
### Issue before this commit: The XML export for branch companies incorrectly identified the branch as the sender, even when a Peppol parent company was configured. ### Steps to reproduce the issue: 1. Download Accounting, Contacts and l10n_be 2. Create a branch for a Belgium company 3. Enable Peppol sending on the parent company 4. Enable Peppol sending on the branch company using the parent company endpoint 5. Switch to branch company 6. Create a customer invoice in the branch company using a customer who is on the Peppol network (meaning insert a valid VAT number and then verify button in the Accounting tab) 7. Confirm and send the invoice via Peppol 8. Download the resulting xml file and check the "AccountingSupplierParty" nodes. It contains the data of the branch and not the ones of the parent company ### Cause of the issue: The EDI export logic was fetching the supplier data directly from the invoice's company record without checking for a delegated Peppol parent company, ignoring the hierarchical relationship defined in the settings. ### Reason to introduce the fix: This fix ensures that the AccountingSupplierParty in the UBL/CII file correctly reflects the parent company's data when applicable. opw-6030526 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260389
This update ensures that imported records open with the same context as the original import action. Previously, imported lists didn't inherit the correct settings like default invoice types, leading to incorrect column visibility and default values. Now, imported records will display with the appropriate context, improving the user experience and data accuracy.
Original PR description
**Problem:** After importing records through the Import action, the list view that opens with the imported records does not inherit the context of the originating action. Column visibility and…
**Problem:**
After importing records through the Import action, the list view that opens with the imported records does not inherit the context of the originating action. Column visibility and default values that depend on that context (e.g. `default_move_type` on the shared invoice list) end up wrong.
**Steps to reproduce:**
1. Go to Accounting → Customers → Invoices
2. Click "Favorites → Import records"
3. Upload a CSV containing at least one valid customer invoice row
4. Run the import and look at the "Imported records" list that opens
**Current behavior:**
The imported records list opens with an empty context. Columns rendered conditionally on `default_move_type` (invoice-type-specific columns on `account.view_invoice_tree`) are not shown as they are when opening the list from the menu, and records created from that list have no default move type.
**Expected behavior:**
The imported records list should open with the same context as the action the user started the import from (e.g.
`{ default_move_type: 'out_invoice' }` for customer invoices), so columns and defaults match the previous view.
**Cause of the issue:**
`openRecords()` in `import_action.js` builds the follow-up `ir.actions.act_window` but never forwards `this.model.context`. The model already holds the context passed through the import action's `params.context`, but it is dropped when the redirect action is dispatched, so the window action opens with an empty context.
**Fix:**
Forwarding the context the import was launched with keeps the user inside the same functional scope (invoice type, default partner, company, etc.) when they land on the imported records list. Column visibility logic and default values that rely on that context behave identically to opening the list through the normal menu flow.
opw-6120758
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#261309This update fixes an issue where automatically selected courses for multi-category restaurant items always chose the lowest sequence number, regardless of the active category filter. Now, the system correctly picks the course linked to the currently selected category, ensuring accurate order processing. Additionally, a new feature prevents the creation of unnecessary courses when adding items to orders with `use_course_allocation` enabled.
Original PR description
When a product belongs to multiple categories, each linked to a different course, the automatic course selection was always picking the one with the lowest sequence, regardless of context. The expected behavior is to pick the course tied to the currently active category filter, not an arbitrary one. This commit implements that logic. In addition, when `use_course_allocation` is enabled, adding a first course to an order that already contains products no longer creates an extra course. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6187108 Forward-Port-Of: odoo/odoo#262683
This update fixes a potential issue where the mobile app could unexpectedly log users out due to automatic session rotation. Specifically, it allows the mobile app to temporarily bypass session rotation for certain requests, like those made through webviews, ensuring a smoother user experience. This change doesn't introduce any security risks.
Original PR description
The session id rotates softly every 3 hours For some features, the mobile app sometimes does requests "outside" of the mobile app, through a webview for instance, and if the session rotation interval…
The session id rotates softly every 3 hours For some features, the mobile app sometimes does requests "outside" of the mobile app, through a webview for instance, and if the session rotation interval is reached at that moment, it rotates the session and the `set-cookie` instruction setting the new session cookie is received by the webview only, it's not propagated back to the mobile app. Then, this could lead for the user to be logged out of the mobile app if the soft automatic session rotation happens at the very unfortunate moment the request through that webview happens. For instance, the mobile app uses a webview to download attachments. If the session rotation happened during that request, the mobile app doesn't receive the `set-cookie` header and doesn't receive the new session id, leading for the user to be logged out of the mobile app. This revision aims to provide an option for the mobile app to temporary skip the session rotation for a specific request, such as the requests done through the webview during downloads. This option to be able to disable the rotation is not a security threat: If an attacker passes that header to disable the interval session rotation, he would avoid the session to be changed every 3 hours, but if he wouldn't he would still receive the new session id every 3 hours. The session rotation is for legitimate user / computer to rotate their session every 3 hours so that in case of data leak of their browser cookies, there is a chance the session cookie is already no longer valid when published on the public web. Legitimate users have no benefit using this option header to disable the rotation. Forward-Port-Of: odoo/odoo#263325
This update resolves an issue where payment reminders wouldn't display correctly when the 'Payment' module wasn't installed. The fix ensures the system checks for the necessary 'payment.method' model before attempting to use it, preventing template rendering errors. This ensures payment reminders function properly regardless of the installed modules.
Original PR description
Repro steps: 1. Initialize a new DB 2. Install account_followup module without payment module 3. Go to Email templates > Payment reminder 4. Click on Preview You will get an error Failed to render QWeb template for Mail Template: 'Payment Reminder' (ID: 9) Target Model: res.partner Language context: en_US Error: Error while render the template KeyError: 'payment.method' Root cause: The method `_show_pay_now_button` that was being called in the template email_template_followup_1 was using self.env['payment.method'] even tho payment module is not a dependency of account_followup Fix: The introduced fix ensures that 'payment.method' model exists before attempting to use it build_error-243030 Forward-Port-Of: odoo/enterprise#116692 Forward-Port-Of: odoo/enterprise#116079
This update resolves an issue preventing users from correctly booking appointments with multiple participants when flexible scheduling and capacity limits are enabled. The fix corrects a technical error related to how appointment slots are generated, ensuring the booking process functions as intended.
Original PR description
### Steps to reproduce: - Download "Appointment" and "Website" - Configure an appointment to be booked by resource with multiple seats and manage capacity - Set the schedule to be flexible and configure valid time slots - Go to the booking page and select the number of participants > Traceback: cannot unpack non-iterable bool object ### Cause of Issue: The `_get_appointment_slots` method unpacks the `appointment_slots_force_month` directly: https://github.com/odoo/enterprise/blob/4ca3dddaeadeb6c937d555cc4da8fb4bb61fea35/appointment/models/appointment_type.py#L871 Since the `appointment_slots_force_month` value was explicitly set to `False` in https://github.com/odoo/enterprise/blob/4ca3dddaeadeb6c937d555cc4da8fb4bb61fea35/appointment/controllers/appointment.py#L1063-L1070 the unpacking operation failed because it tried to unpack a boolean instead of a tuple. opw-6197653 Forward-Port-Of: odoo/enterprise#116671 Forward-Port-Of: odoo/enterprise#116613
The budget report now accurately displays financial data without duplicate analytic lines. This change addresses an issue caused by a recent performance optimization of the budget report query, which inadvertently created duplicate entries. The fix ensures data integrity and reliable reporting.
Original PR description
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item…
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item (linked to Analytic Account A). - Open the budget report and remove the default "open budget" filter. Duplicate amounts appear in the pivot view and duplicate lines appear in the list view. #### Cause: In #104299, the query in `_get_aal_query` was refactored for performance to avoid a single query with an OR condition in the LEFT JOIN. It was replaced by two separate queries combined with `UNION ALL`. This caused some lines to be captured by both queries, resulting in duplicates in the final report. #### Fix: Use three separate queries, each with specific filter conditions to guarantee unique results: Q1 - Analytic lines with no matching budget line. Q2 - Analytic lines matched to a budget line with no company (null-company). Q3 - Analytic lines matched to a company-specific budget line. OPW-6051696 Forward-Port-Of: odoo/enterprise#116612
6 changes
Enhancements to existing features
This update ensures the demo data for Brazil (l10n_br) in Odoo is current and reliable. The changes to product and company information improve the accuracy of testing and demonstrations for this specific Odoo localization. This is an important improvement for developers and consultants working with the Brazil tax compliance features.
Original PR description
Updated Brazil Product and company demo data to ensure accurate testing task-6159933 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261636
This update improves the Brazil demo data within Odoo Enterprise to ensure accurate testing of the l10n_br_avatax module. The changes include updated product and company data, aligning the demo environment with current tax regulations for Brazil. This ensures developers and testers can reliably evaluate the module's functionality.
Original PR description
Updated Brazil Product and company demo data to ensure accurate testing task-6159933 Forward-Port-Of: odoo/enterprise#115361
Resolved issues and error corrections
This update fixes an issue where subscription delivery dates were incorrectly displayed as the previous day due to timezone differences. The fix ensures delivery dates are accurately calculated based on the company's timezone, resolving a potential scheduling problem for subscription orders. This improves the reliability of delivery planning.
Original PR description
Steps to reproduce 1. Set the company's partner timezone to a negative UTC offset (e.g. America/Argentina/Buenos_Aires, UTC-3). 2. Create a sale order for a storable subscription product and confirm…
Steps to reproduce 1. Set the company's partner timezone to a negative UTC offset (e.g. America/Argentina/Buenos_Aires, UTC-3). 2. Create a sale order for a storable subscription product and confirm it. 3. Open the generated delivery order and check its Scheduled Date. Issue The scheduled date on the first delivery renders as the previous day. `_prepare_procurement_values` writes `date_planned` as `current_period_start`, which is a plain `fields.Date` value (https://github.com/odoo/enterprise/blob/ba41d7de3c0474286e3e9319710fdacfb95d3e2c/sale_subscription_stock/models/sale_order_line.py#L156). When a `date` is stored in the `Datetime` column `stock.move.date`, Odoo anchors it at midnight UTC; in any negative-offset timezone this renders as the previous day (e.g. `2022-03-02 00:00 UTC` shows as `2022-03-01 21:00` in UTC-3). The non-subscription path does not hit this because it resolves `date_planned` through `_expected_date()`, which returns `order_id.date_order` — a full `Datetime` set to `fields.Datetime.now()` at confirmation (https://github.com/odoo/odoo/blob/996702b0d5c518db2ac6f0b144e7835b27c29736/addons/sale/models/sale_order_line.py#L1398). The same midnight-UTC drift also affects later recurrences, where `current_period_start` falls back to `last_invoice_date` — another `Date`. Solution Split the two cases explicitly: - First delivery (`last_invoice_date` unset): set `date_planned` to `order_id.date_order`, matching the non-subscription flow. - Subsequent deliveries: localize `last_invoice_date` at `00:00` in the company timezone before converting back to UTC, reusing the pattern already applied to reordering rules (https://github.com/odoo/odoo/blob/20a0eee2d03293564320c268252a0353781d99ea/addons/stock/models/stock_orderpoint.py#L722). opw-6133831 Forward-Port-Of: odoo/enterprise#116362 Forward-Port-Of: odoo/enterprise#115100
This update fixes an issue where Peppol invoices were incorrectly sending data from branch companies instead of the parent company. The change ensures invoices accurately reflect the parent company's information in the UBL/CII XML file, improving compliance with Peppol standards and avoiding potential errors in data exchange.
Original PR description
### Issue before this commit: The XML export for branch companies incorrectly identified the branch as the sender, even when a Peppol parent company was configured. ### Steps to reproduce the issue:…
### Issue before this commit: The XML export for branch companies incorrectly identified the branch as the sender, even when a Peppol parent company was configured. ### Steps to reproduce the issue: 1. Download Accounting, Contacts and l10n_be 2. Create a branch for a Belgium company 3. Enable Peppol sending on the parent company 4. Enable Peppol sending on the branch company using the parent company endpoint 5. Switch to branch company 6. Create a customer invoice in the branch company using a customer who is on the Peppol network (meaning insert a valid VAT number and then verify button in the Accounting tab) 7. Confirm and send the invoice via Peppol 8. Download the resulting xml file and check the "AccountingSupplierParty" nodes. It contains the data of the branch and not the ones of the parent company ### Cause of the issue: The EDI export logic was fetching the supplier data directly from the invoice's company record without checking for a delegated Peppol parent company, ignoring the hierarchical relationship defined in the settings. ### Reason to introduce the fix: This fix ensures that the AccountingSupplierParty in the UBL/CII file correctly reflects the parent company's data when applicable. opw-6030526 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260389
This update ensures that imported records open with the same context as the original import action. Previously, the imported list view didn't inherit the correct settings like default move types, leading to incorrect column visibility and data defaults. This fix maintains consistency and improves the user experience when working with imported data.
Original PR description
**Problem:** After importing records through the Import action, the list view that opens with the imported records does not inherit the context of the originating action. Column visibility and…
**Problem:**
After importing records through the Import action, the list view that opens with the imported records does not inherit the context of the originating action. Column visibility and default values that depend on that context (e.g. `default_move_type` on the shared invoice list) end up wrong.
**Steps to reproduce:**
1. Go to Accounting → Customers → Invoices
2. Click "Favorites → Import records"
3. Upload a CSV containing at least one valid customer invoice row
4. Run the import and look at the "Imported records" list that opens
**Current behavior:**
The imported records list opens with an empty context. Columns rendered conditionally on `default_move_type` (invoice-type-specific columns on `account.view_invoice_tree`) are not shown as they are when opening the list from the menu, and records created from that list have no default move type.
**Expected behavior:**
The imported records list should open with the same context as the action the user started the import from (e.g.
`{ default_move_type: 'out_invoice' }` for customer invoices), so columns and defaults match the previous view.
**Cause of the issue:**
`openRecords()` in `import_action.js` builds the follow-up `ir.actions.act_window` but never forwards `this.model.context`. The model already holds the context passed through the import action's `params.context`, but it is dropped when the redirect action is dispatched, so the window action opens with an empty context.
**Fix:**
Forwarding the context the import was launched with keeps the user inside the same functional scope (invoice type, default partner, company, etc.) when they land on the imported records list. Column visibility logic and default values that rely on that context behave identically to opening the list through the normal menu flow.
opw-6120758
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#261309The budget report now accurately displays data without duplicate analytic lines. This issue stemmed from a recent performance optimization of the report's underlying query, which inadvertently created duplicate entries. The fix ensures unique and reliable budget reporting.
Original PR description
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item…
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item (linked to Analytic Account A). - Open the budget report and remove the default "open budget" filter. Duplicate amounts appear in the pivot view and duplicate lines appear in the list view. #### Cause: In #104299, the query in `_get_aal_query` was refactored for performance to avoid a single query with an OR condition in the LEFT JOIN. It was replaced by two separate queries combined with `UNION ALL`. This caused some lines to be captured by both queries, resulting in duplicates in the final report. #### Fix: Use three separate queries, each with specific filter conditions to guarantee unique results: Q1 - Analytic lines with no matching budget line. Q2 - Analytic lines matched to a budget line with no company (null-company). Q3 - Analytic lines matched to a company-specific budget line. OPW-6051696 Forward-Port-Of: odoo/enterprise#116612
4 changes
Resolved issues and error corrections
This update fixes a bug in the Belgium Payroll DMFA report that incorrectly displayed 'Days Per Week' as 5 when employees worked fewer than 5 days a week. The fix ensures the report accurately reflects the employee's actual working schedule, improving data accuracy for tax reporting.
Original PR description
## Issue When generating a DMFA report with a working schedule with more or less than 5 days a week, the *Days Per Week* value in the report is still appearing as 5. ## Steps to reproduce 1. Install…
## Issue
When generating a DMFA report with a working schedule with more or less than 5 days a week, the *Days Per Week* value in the report is still appearing as 5.
## Steps to reproduce
1. Install *Belgium - Payroll* (`l10n_be_hr_payroll`)
2. In Payroll's Settings:
- set *ONSS Registration Number* to `0830123456`
- set *DMFA Employer Class* to `083`
- create a *Work Address DMFA code* (any name, any numeral code, but set the *Working Address* to the Belgian company used for the rest of the steps)
3. In Employees' Settings, set the *Company Working Hours* to a new Working Schedule, with 9 hours/day, 4 days/week. E.g from Monday to Thursday included:
- Work from 8:00 to 12:00
- Lunch from 12:00 to 13:00
- Work from 13:00 to 18:00
4. Create an Employee E for the Belgian company:
- In the *Payroll* tab, set the start date of the contract to 01/01/2026.
- In the *Personal* tab, set the *NISS Number* to `85073003328`
5. Create the payslip for January 2026 for the Employee E.
6. In Payroll > Reporting > Belgium > DMFA, create a new DMFA for the first quarter of 2026 and generate the PDF report
7. **In the generated PDF report, the _Days per Week_ line is set to 5.**
## Cause
The number of days was calculated by multiplying `5` with the `work_time_rate` of the related calendar. This is inaccurate in the case of a company where employees are only expected to work 4 days a week.
opw-6103934
Forward-Port-Of: odoo/enterprise#116465
Forward-Port-Of: odoo/enterprise#113804This update resolves an error in the Luxembourg VAT reports (FAIA) caused by a missing required 'TVA' TaxType element. The fix ensures compliance with Luxembourg tax regulations and prevents report generation failures. This was triggered by a customer report (opw-5427296).
Original PR description
This is one of several commits fixing the FAIA xml export. The customer in ticket [opw-5427296](https://www.odoo.com/odoo/unassigned-tasks/5427296) received several errors which mention that the `TaxType` element should be 'TVA'. This is corroborated by one of these elements in the XSD files for the FAIA report. The XSD files can be found at the link below. https://pfi.public.lu/dam-assets/backup/FAIA/FAIA/XSD_Files.zip opw-6118272 [link](https://www.odoo.com/odoo/project.task/6118272) Forward-Port-Of: odoo/enterprise#115293 Forward-Port-Of: odoo/enterprise#113720
This update resolves a critical issue where the rental website would crash when overlapping closed days and public time off were selected. The fix simplifies the availability check to focus solely on time ranges, ensuring a stable and reliable rental availability display for customers. This improves the user experience and prevents lost sales.
Original PR description
Steps to reproduce: - Install website_sale_renting_planning. - Create a rental service product linked to a planning role. - Enable Sync Shifts and Rental Orders on that role. - Add a two-day public time off on the working calendar. - Open the product on the website with overlapping dates. Current behavior: The shop crashes when the selected dates overlap a closed day and a public time off. Expected behavior: The website should show rental availability without crashing when both cases overlap. Issue: The availability flow mixed two kinds of calendar data while it only needed time ranges, so the overlap broke the website flow. Fix: Keep the unavailability check focused on time ranges for closed days and public time off so both cases can be combined safely. Ref: odoo/enterprise#98165 odoo/enterprise#102070 odoo/enterprise#102076 task-6164218
The budget report now accurately displays data without duplicate analytic lines. This change addresses an issue caused by a recent performance optimization that introduced redundant data retrieval. The fix ensures correct reporting by utilizing a revised query strategy.
Original PR description
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item…
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item (linked to Analytic Account A). - Open the budget report and remove the default "open budget" filter. Duplicate amounts appear in the pivot view and duplicate lines appear in the list view. #### Cause: In #104299, the query in `_get_aal_query` was refactored for performance to avoid a single query with an OR condition in the LEFT JOIN. It was replaced by two separate queries combined with `UNION ALL`. This caused some lines to be captured by both queries, resulting in duplicates in the final report. #### Fix: Use three separate queries, each with specific filter conditions to guarantee unique results: Q1 - Analytic lines with no matching budget line. Q2 - Analytic lines matched to a budget line with no company (null-company). Q3 - Analytic lines matched to a company-specific budget line. OPW-6051696 Forward-Port-Of: odoo/enterprise#116612
5 changes
Resolved issues and error corrections
This update fixes an issue where tax returns were incorrectly including all tax amounts, regardless of the specific region (e.g., British Columbia). Now, tax return entries accurately reflect taxes related to the correct tax jurisdiction, ensuring accurate reporting for businesses using Odoo's tax return functionality. This improves the reliability of tax reporting across Canada, Ecuador, Egypt, Pakistan, and South Africa.
Original PR description
Issue: Validating a tax return creates an entry with all the tax aml from the company instead of filtering them according to the tax return type. Steps to reproduce: - In a company in Canada - Invoice a Customer from British Columbia in the previous month (A) - Confirm - Go to tax report -> Return - Review and Validate tax return for "Manitoba PST Return (CA)" for month A - Click on the 3 dots -> View Entry Current Behavior: - Entry has lines for PST in British-Columbia and GST taxes Expected behavior: - Entry has lines for PST in Manitoba only Cause: https://github.com/odoo/enterprise/pull/98158 introduces method `_get_vat_closing_entry_additional_domain` in the wrong class. opw-6065838
This update resolves an error that occurred when searching for links (short URLs) within the email tracking system. Previously, searching by short URL resulted in a server error. The fix addresses the technical issue of searching a computed field and ensures the search functionality now works correctly.
Original PR description
Overview ------ When searching based on the `Link (short_url)` field in the search bar, in the `link.tracker.click` list view, an error fires up. How to Reproduce ------ 1. Open the Email Marketing…
Overview ------ When searching based on the `Link (short_url)` field in the search bar, in the `link.tracker.click` list view, an error fires up. How to Reproduce ------ 1. Open the Email Marketing app 2. Create a new mailing (or you can use an existing one that has some clicks) and send it 3. Make a click in the email from the recipient's side 4. Open the link tracker `click` related to that mailing (select the mailing → `Link Trackers` stat button → click on a link → `Clicks` stat button) 5. Make a search based on the Link (short_url) field Expected Behavior ------ Return the list of links that matches the entered search query. Current Behavior ------ Odoo Server Error. Cause & Solution ------ The cause of this error is that the `shor_url` field is a computed, non-stored, field, and hence, we cannot directly make a search on it. So, either we make the `short_url` a stored field, which is not so efficient, or we create our own custom `_search_..` method. Task-6131693 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a crash in the website editor that occurred when an event was set as the homepage. The issue stemmed from a missing match in the event ID retrieval process. By adding a default return value, the editor now correctly identifies event objects, ensuring a stable experience for users managing their website events.
Original PR description
**Description of the issue/feature this PR addresses:** The `WebsiteEvent._getEventObjectId` method lacks a specific match case for the root directory, causing event ID retrieval to fail on the…
**Description of the issue/feature this PR addresses:** The `WebsiteEvent._getEventObjectId` method lacks a specific match case for the root directory, causing event ID retrieval to fail on the homepage. In order to resolve this, I've implemented a default return of 0 when the URL pattern matching fails [following the pattern established by later revisions of this code](https://github.com/odoo/odoo/blob/2199f71070ce3e9a4717eb6b750c14485406f7aa/addons/website_event/static/src/website_builder/event_page_option_plugin.js#L67). **Steps to reproduce bug:** 1. Create an event website 2. Create an event and visit it 3. On the page click Site > Properties 4. Enable `Is Homepage` 5. Return to the homepage of the application and open the editor https://drive.google.com/file/d/1OpCUAp4LJKqkoStciWeJEGVVlR3qpw1R/view?usp=drive_link **Current behavior before PR:** https://drive.google.com/file/d/1c7ACqaQx03mePzJSV_RoPn8mlLWSMa1I/view?usp=drive_link **Desired behavior after PR is merged:** https://drive.google.com/file/d/1L3Ne9h6-yB3v7VbXipjly9OrDSkZvDOu/view?usp=drive_link opw-6101680 Forward-Port-Of: odoo/odoo#258502
The customer list view was displaying incorrect total calculations (showing dashes instead of numbers) when certain columns were enabled. This fix ensures that total due and overdue amounts are accurately calculated and displayed, providing reliable financial reporting. The change was made to properly format currency data within the list view.
Original PR description
In the partner list view, enabling the "Total Due" and "Total Overdue" columns results in empty aggregates (—) at the bottom of the list. Steps to reproduce: - Navigate to Accounting -> Customers -> Customers - Add columns 'Total Due' and 'Total Overdue'. - Check the computed totals. Issue: The totals displays dashes (—) instead of the numbers. Analysis: The web client list renderer requires a currency field to be present in the view to correctly format and display aggregate sums for monetary fields, otherwise empty dashes are shown as fallback. opw-6169513 Forward-Port-Of: odoo/odoo#261820
This update resolves an error in the FAIA report XML export for Luxembourg customers. The issue stemmed from a missing 'TVA' TaxType element, which was required by the report's specifications. This fix ensures accurate report generation and avoids potential export failures.
Original PR description
This is one of several commits fixing the FAIA xml export. The customer in ticket [opw-5427296](https://www.odoo.com/odoo/unassigned-tasks/5427296) received several errors which mention that the `TaxType` element should be 'TVA'. This is corroborated by one of these elements in the XSD files for the FAIA report. The XSD files can be found at the link below. https://pfi.public.lu/dam-assets/backup/FAIA/FAIA/XSD_Files.zip opw-6118272 [link](https://www.odoo.com/odoo/project.task/6118272) Forward-Port-Of: odoo/enterprise#115293 Forward-Port-Of: odoo/enterprise#113720
1 change
Resolved issues and error corrections
The budget report now accurately displays data without duplicate analytic lines. This change addresses an issue caused by a recent performance optimization of the budget report query, which inadvertently introduced duplicate entries. The fix ensures data integrity and reliable reporting.
Original PR description
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item…
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item (linked to Analytic Account A). - Open the budget report and remove the default "open budget" filter. Duplicate amounts appear in the pivot view and duplicate lines appear in the list view. #### Cause: In #104299, the query in `_get_aal_query` was refactored for performance to avoid a single query with an OR condition in the LEFT JOIN. It was replaced by two separate queries combined with `UNION ALL`. This caused some lines to be captured by both queries, resulting in duplicates in the final report. #### Fix: Use three separate queries, each with specific filter conditions to guarantee unique results: Q1 - Analytic lines with no matching budget line. Q2 - Analytic lines matched to a budget line with no company (null-company). Q3 - Analytic lines matched to a company-specific budget line. OPW-6051696 Forward-Port-Of: odoo/enterprise#116612
16 changes
New functionality added to Odoo
This update integrates ‘ToYou’ and ‘The Chefz’ as new food delivery options within the Odoo Enterprise system. This expands the available delivery services for our restaurant partners, providing greater choice and convenience for their customers. The change was made to support growing market demand and improve the overall delivery experience.
Original PR description
In this commit: =============== - Integrated `ToYou` and `The Chefz` as a new food delivery provider in `pos_urban_piper`. Task-6040108,6040111
Enhancements to existing features
This update enhances the Gantt view within the field service module by reducing the display precision to the quarter level. This simplifies the view and prevents it from becoming cluttered with excessive data, improving readability and usability. The total aggregate calculation has also been removed to further optimize the display.
Original PR description
This commit changes the day scale precision to quarter in the gantt view of field service. Additionally, the total aggregate is removed because otherwise the view would be polluted by too many information on tiny spaces. task-6200910
This update enhances the manufacturing order Gantt chart by allowing users to quickly view related work orders when filtering by product, displaying product quantity and UoM, and improving the overall user experience. The changes streamline the Gantt chart for better visibility and efficiency in managing production schedules.
Original PR description
Changes requested: 1. Clicking on the product in the row header (when grouped by product) should open a list view of MOs for that product. (Requires overriding the Gantt renderer template.) **Done** 2. Append the product quantity and the UoM to the MO name in each pill. **Done** 3. Disable the action for clicking on the table itself. **Done** 4. Rename the edit button on the pill popover to 'Open Manufacturing Order'. **Done** 5. Minimum space between product internal reference and the status widget in the pill popover. **Done** 6. ~~Set a grey background colour for weekends. (Might require computing unavailabilities for a Gantt API function in the model?)~~ Additionally, the `mrp_workorder` frontend files were stowed into their own directory out of `/static/src/` basedir. Task ID: [6088506](https://www.odoo.com/odoo/my-tasks/6088506)
This update allows users to manually set CST codes for ICMS, PIS, COFINS, and IPI on EDI invoices, addressing a previous limitation where Avalara lacked a direct configuration option. This change simplifies the process for NF-e invoices, improving user experience and saving time by overriding Avalara's automatic calculations for EDI invoice requests.
Original PR description
Before this Commit: - Avalara does not have a dedicated field/configuration on its website to allow users to set the right CST for all taxes. After this Commit: - We added new fields to Operation Types to manually override Avalara's CST calculation for ICMS, PIS, COFINS, and IPI. - All these new field values will be sent only for the EDI Invoice Request (submit-invoice-goods) not for Avatax calculation. - Now the user can manually override the CST value using the field of operation type for NF-e (EDI goods invoice). - Improve the user experience and save the user time. task-5404891
This update improves the Brazil demo data within Odoo Enterprise, specifically for the l10n_br_avatax module. The changes ensure the demo data accurately reflects Brazil's tax regulations, leading to more reliable testing and validation of the module's functionality. This supports better development and testing of the Brazil localization features.
Original PR description
Updated Brazil Product and company demo data to ensure accurate testing task-6159933 Forward-Port-Of: odoo/enterprise#115361
Resolved issues and error corrections
This fix resolves an issue where rental dates were incorrectly included in price calculations for non-rental products within rental orders. The update ensures that only the standard date is used when determining prices, improving accuracy and preventing pricing errors. This change focuses on a technical detail to ensure correct rental pricing.
Original PR description
When computing the price of a non-rental product in a rental order, the rental dates are added to the price computation kwargs. However, the rental dates and the date kwargs are incompatible when…
When computing the price of a non-rental product in a rental order, the rental dates are added to the price computation kwargs.
However, the rental dates and the date kwargs are incompatible when fetching applicable rules for a product.
One restricts rules to a range, whereas the other restricts rules to a specific date.
For non-rental products, the rental dates should not be forwarded; only the date argument should be.
```python
Traceback (most recent call last):
File "/Users/lipiraux/dev/odoo/master/odoo/odoo/http/router.py", line 432, in serve_db
return retrying(serve_func, env=request.env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
File "/Users/lipiraux/dev/odoo/master/odoo/addons/sale/controllers/product_configurator.py", line 72, in sale_product_configurator_get_values
**self._get_product_information(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
File "/Users/lipiraux/dev/odoo/master/enterprise/sale_renting/models/product_pricelist.py", line 40, in _compute_price_rule
results = super()._compute_price_rule(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/lipiraux/dev/odoo/master/odoo/addons/product/models/product_pricelist.py", line 201, in _compute_price_rule
rules = self._get_applicable_rules(products, quantity, date=date, uom=uom, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/lipiraux/dev/odoo/master/odoo/addons/product/models/product_pricelist.py", line 273, in _get_applicable_rules
self._get_applicable_rules_domain(
File "/Users/lipiraux/dev/odoo/master/enterprise/sale_renting/models/product_pricelist.py", line 242, in _get_applicable_rules_domain
assert not kwargs.get("date"), "Incompatible arguments"
^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Incompatible arguments
```
task-6020137This update resolves an issue where the custom declaration field wasn't automatically filled for international shipments using the World Express Pro service within the BPost module. Now, the necessary customs information is correctly populated, ensuring accurate shipping documentation and compliance with international regulations. This improves the reliability and efficiency of international order processing.
Original PR description
Before this commit, the bpost module was not filling the custom declaration in case of international shipping (World Express Pro) After this commit, the section is filled opw-4932970 Forward-Port-Of: odoo/enterprise#115368 Forward-Port-Of: odoo/enterprise#101476
This update fixes an issue where route planning for resources always started from the user's location. Now, routes begin from the resource's actual location when a location is available, ensuring more accurate and relevant route visualizations. This improves the planning process for field teams.
Original PR description
Currently, the routings per resource are always starting from the current user's location. With this commit: - If the view is not grouped by resource, no routing is shown - If the view is grouped by resource and the user is not located, no routing is shown for that resource - Else, the routing start from the located resource's geolocation task-6176479 Forward-Port-Of: odoo/enterprise#115674
This update addresses an issue where error messages from the Aspone API were not displayed correctly, leading to tracebacks. The change now ensures that error messages are presented to the user, improving the reporting experience for French language reports. This resolves a technical problem that could have impacted report accuracy.
Original PR description
Since the v2 rest api of aspone was implemented, error messages were no more well handled and a traceback was raised while getting one. This commit displays the write errr to the user task-5955980 Forward-Port-Of: odoo/enterprise#116381 Forward-Port-Of: odoo/enterprise#116076
This update addresses intermittent errors in the customer ratings tests within the Odoo Enterprise system. The fix ensures the tests are consistently reliable, preventing potential disruptions to customer feedback processes. This improves the stability and accuracy of customer ratings data.
Original PR description
This commit aims to fix the undeterministic failures of the customer ratings tests. Forward-Port-Of: odoo/enterprise#116053
This update resolves an issue where the Payment Reminder email template would fail to render if the Payment module wasn't installed alongside the account_followup module. The fix ensures the necessary 'payment.method' model exists before attempting to use it, preventing template rendering errors.
Original PR description
Repro steps: 1. Initialize a new DB 2. Install account_followup module without payment module 3. Go to Email templates > Payment reminder 4. Click on Preview You will get an error Failed to render QWeb template for Mail Template: 'Payment Reminder' (ID: 9) Target Model: res.partner Language context: en_US Error: Error while render the template KeyError: 'payment.method' Root cause: The method `_show_pay_now_button` that was being called in the template email_template_followup_1 was using self.env['payment.method'] even tho payment module is not a dependency of account_followup Fix: The introduced fix ensures that 'payment.method' model exists before attempting to use it build_error-243030 Forward-Port-Of: odoo/enterprise#116692 Forward-Port-Of: odoo/enterprise#116079
This update fixes an issue where long text fields in sign documents were not wrapping correctly, resulting in text overflowing and being unreadable in the final PDF output. The fix ensures that text, even with long words or without spaces, is properly wrapped within the designated field, improving the clarity and usability of sign documents. This resolves a previous display problem.
Original PR description
### Steps to reproduce: - Download 'Sign' and 'Contacts' apps - Create a contact with a really long name - Create a sign document template with a multiline text field (Read-only) that has contact…
### Steps to reproduce: - Download 'Sign' and 'Contacts' apps - Create a contact with a really long name - Create a sign document template with a multiline text field (Read-only) that has contact name value - Click 'Sign Now' and put the new contact as the signer - Sign and download > The text appears as a single extended line exceeding field/page boundaries ### Cause of Issue: The textarea and stamp field rendering only handled explicit newline characters (`\n`) and did not account for text that exceeded the field width. https://github.com/odoo/enterprise/blob/017743cbe97b629e9d9f1895b655014d4c3abbcb/sign/models/sign_document.py#L330-L345 When the HTML preview showed wrapped text, the PDF output rendered it as a single line. For continuous text without spaces, the text would overflow the field boundaries entirely. ### Fix: Accounted for long texts that have spaces and long words to show all the information in the PDF opw-6045062 Forward-Port-Of: odoo/enterprise#116658 Forward-Port-Of: odoo/enterprise#114813
This update resolves an issue where duplicate serial numbers appeared in the picking view after scanning a new barcode. The fix ensures the system waits for a necessary process to complete, correctly displaying only the intended serial number. This improves data accuracy and prevents confusion for users.
Original PR description
Problem: When entering the barcode interface from a picking and scanning a different serial number than one already reserved, a new line gets created in certain situations. When exiting the barcode…
Problem: When entering the barcode interface from a picking and scanning a different serial number than one already reserved, a new line gets created in certain situations. When exiting the barcode interface without validating the picking, both serial numbers show up on the picking view. However, the first serial number’s `stock.move.line` was deleted, so only one serial number should be there. When exiting the barcode interface a call to `post_barcode_process` is made, where the extra `stock.move.line` is deleted, but it doesn’t wait for the call to finish. https://github.com/odoo/enterprise/blob/d5a52cb79c9c41d792685d2858cfeb6aee147642/stock_barcode/static/src/models/barcode_picking_model.js#L1896 Purpose: By overriding `beforeQuit` to add the `_onExit` call, the component now waits for the `post_barcode_process` call to finish before navigating back to the picking view. This helps ensure the UI displays the updated data. Steps to reproduce on Runbot: Create a product tracked by serial numbers. Have 2 units on hand: serial 001 with a package, and serial 002 without a package. (This is needed so the barcode app will create a new line). Create a delivery for 1 unit of our test product and mark it as todo. Ensure that serial 001 is reserved. Click the Barcode smart button and scan the barcode for serial 002. Click the back button. Observe that both serial numbers are shown on the picking. Refresh the page and observe only serial 002 is now shown. opw-6105740 Forward-Port-Of: odoo/enterprise#116686 Forward-Port-Of: odoo/enterprise#115491
The budget report now accurately displays data without duplicate analytic lines. This change addresses an issue caused by a recent performance optimization of the budget report query, which inadvertently introduced duplicate entries. The fix ensures correct reporting by using a revised query structure.
Original PR description
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item…
#### Issue: The budget report displays duplicate analytic lines. #### Steps to reproduce: In a new company: - Create a budget with one budget line (Analytic Account A). - Create one analytic item (linked to Analytic Account A). - Open the budget report and remove the default "open budget" filter. Duplicate amounts appear in the pivot view and duplicate lines appear in the list view. #### Cause: In #104299, the query in `_get_aal_query` was refactored for performance to avoid a single query with an OR condition in the LEFT JOIN. It was replaced by two separate queries combined with `UNION ALL`. This caused some lines to be captured by both queries, resulting in duplicates in the final report. #### Fix: Use three separate queries, each with specific filter conditions to guarantee unique results: Q1 - Analytic lines with no matching budget line. Q2 - Analytic lines matched to a budget line with no company (null-company). Q3 - Analytic lines matched to a company-specific budget line. OPW-6051696 Forward-Port-Of: odoo/enterprise#116612
This update resolves an issue preventing users from correctly booking appointments with multiple participants when flexible scheduling is enabled. The fix corrects a problem where the system incorrectly interpreted a setting, causing a booking error. This ensures appointments can be scheduled accurately with capacity management.
Original PR description
### Steps to reproduce: - Download "Appointment" and "Website" - Configure an appointment to be booked by resource with multiple seats and manage capacity - Set the schedule to be flexible and configure valid time slots - Go to the booking page and select the number of participants > Traceback: cannot unpack non-iterable bool object ### Cause of Issue: The `_get_appointment_slots` method unpacks the `appointment_slots_force_month` directly: https://github.com/odoo/enterprise/blob/4ca3dddaeadeb6c937d555cc4da8fb4bb61fea35/appointment/models/appointment_type.py#L871 Since the `appointment_slots_force_month` value was explicitly set to `False` in https://github.com/odoo/enterprise/blob/4ca3dddaeadeb6c937d555cc4da8fb4bb61fea35/appointment/controllers/appointment.py#L1063-L1070 the unpacking operation failed because it tried to unpack a boolean instead of a tuple. opw-6197653 Forward-Port-Of: odoo/enterprise#116671 Forward-Port-Of: odoo/enterprise#116613
Code cleanup and technical improvements
This update simplifies how member categories are defined and managed within the system. By centralizing category data and using a single calculation method, updates to categories (like status changes) are now easier and faster to implement. This improves efficiency and reduces the risk of errors.
Original PR description
Replace the per-category getters (matchingX, filteredX, *SectionText) with a `memberCategories` definition and a single `computeCategories` method. `onWillRender` computes all category data once per render cycle into `this.categories`; the template iterates over it generically. Adding or removing a status category now only requires touching `memberCategories`. task-6189542
1 change
Resolved issues and error corrections
This pull request corrects an error in the CFDI (Mexican electronic invoice) generation process when calculating payroll for employees with IMSS (Mexican Social Security Institute) disabilities. The fix ensures the correct XML node is populated to declare these disabilities, resolving issues with incorrect invoice amounts and preventing validation errors.
Original PR description
Several error are logged in the chatter when signing a payslip that includes an IMSS incapacity time off. Steps to reproduce: * Install l10n_mx_hr_payroll_account modules * Switch to "INNOVACION…
Several error are logged in the chatter when signing a payslip that includes an IMSS incapacity time off.
Steps to reproduce:
* Install l10n_mx_hr_payroll_account modules
* Switch to "INNOVACION VALOR Y DESARROLLO SA SA" company
* Go to Employees and open Cesar Osbaldo Cruz Solorzano
* Click on "Time Off" smart button and create a new time off with
"Disability due to illness (IMSS)" type for "02/01/2026"(Any date).
* Go to Payroll > Payslips > Payslips and create a new pay run
* Select Salary Structure 'Mexico: Regular Pay', Pay Schedule 'Monthly'
and the Period '01/01/2026 -> 01/31/2026'
* Click on Continue, select Cesar and click on Select
* Open the payslip, click on "Validate" and "Ok"
* Mark as paid, open the "Journal Entry" from the smart button and click
on "Post".
* Back to the payslip, and click on "Generate CFDI" button.
* An error is added to the chatter.
### Missing node to declare disabilities
Translated message
```py
An error occurred while signing the CFDI document with the government:
Code: NOM111 Message: Unclassified error. Extra Info: The "Incapacidades"
(Disabilities) node must be reported if the perception key 014
"Subsidios por Incapacidad" (Disability Subsidies) is included, or if
the deduction key 006 "Descuento por incapacidad" (Disability Deduction)
is included.
```
Legal Context:
According to Mexican law, IMSS disabilities must be declared in a specific XML node.
There are two primary scenarios for reporting these amounts:
* Deduction (Type 006): The employer does not pay for these days, as the IMSS is responsible for the payment to the employee. This is the most common scenario.
* Perception (Type 014): The employer pays for these days as a superior benefit. For example, by law, the IMSS does not pay for the first 3 days of a disability due to illness, and employers are not obligated to cover them either. However, companies offering superior benefits may choose to pay these days as a "Disability Subsidy."
Solution:
The chosen approach is to configure the Deduction node.
For the `l10n_mx_regular_pay_imss_disabilities` rule, the `l10n_mx_concept` has been set to `l10n_mx_concept_d6` (D06 - Disability Deduction). This ensures the required node is added.
### Missing "ImporteMonetario" attribute
Translated message
```
An error occurred while signing the CFDI document with the government:
Code: NOM95 Message: The attribute "Deduccion:Importe" does not match
the sum of the "Incapacidad:ImporteMonetario" nodes, as the key
expressed in "Nomina.Deducciones.Deduccion.TipoDeduccion" is "006".
```
Problem:
The "Incapacidades" node requires the "ImporteMonetario" attribute, which should represent the sum of the monetary value associated with the disabilities.
Solution:
Add the "ImporteMonetario" attribute and calculate its value using `l10n_mx_daily_salary`.
### Invalid "DiasIncapacidad" format
```py
An error occurred while signing the CFDI document with the government:
Code : 301 Message : XML mal formado Extra Info : Element
'{http://www.sat.gob.mx/nomina12}Incapacidad', attribute
'DiasIncapacidad': '4.0' is not a valid value of the local atomic type.
```
Problem:
Altough the defaultdict where the values are sum up, `number_of_days` is a float field, and when we get back the value, it is a float, adding for example 4.0 instead of 4, which is not a valid value.
Solution:
Cast the value to int.
### Duplicate deduction on disabilities
```py
Wrong python code defined for:
- Employee: Cesar Osbaldo Cruz Solorzano
- Version: False
- Payslip: Salary Slip - Cesar Osbaldo Cruz Solorzano - 05/01/2026 - 05/15/2026
- Salary rule: ISR (Income Tax) (ISR)
- Error: TypeError('cannot unpack non-iterable NoneType object') while
evaluating
"
def find_rates(x, rates):
for low, high, fix, rate in rates:
if low <= x <= high:
return low, high, fix, rate
gross = categories['GROSS']
result = 0
if gross:
isr_table = payslip._rule_parameter('l10n_mx_isr_tables')[version.schedule_pay]
low, high, fix, rate = find_rates(gross, isr_table)
result = -((gross - low) * rate + fix)
period_factor = payslip._rule_parameter('l10n_mx_schedule_table')[version.schedule_pay]
if period_factor >= 15:
period_factor = (period_factor / 30) * (365 / 12)
min_wage = payslip._rule_parameter('l10n_mx_daily_min_wage') * period_factor
if gross <= min_wage:
result_qty = 0.0
"
```
Problem:
The IMSS incapacity amount is being deducted twice:
1. During "Worked Days" calculation, the IMSS incapacity is already not considered because the work entries belong to the "Unpaid Work Entry Types" of "Mexico: Regular Pay" structure.
2. During "Salary Computation", the `IMSS_DISABLE` salary rule deducts another time because it is in the `TAXABLE_ALW` category, and this one is deducted in the `NET` rule.
When the incapacity covers more than half of the period (e.g., 20 days in a monthly schedule), the double deduction causes the NET to become negative. This prevents the ISR rule from finding a correct stage in the tax tables, leading to a traceback.
Example: For a monthly wage of 30,000.0 and 5 incapacity days:
- The total amount in "Worked Days" is 25,000.0 (incapacities already deducted).
- The IMSS_DISABLE rule calculates -5,000.0, and when the NET rule is calculated, the incapacities are deducted again. Total NET becomes 16,843.84 instead of the expected 20,834.85.
Solution:
Change the rule category to `INTERMEDIARY_COMPUTATION` and avoid the double deduction when the `NET` is calculated, as it is already considered in the "Worked Days".
### Absenteeism and Disabilities
By law, the calculation of IMSS contributions depends on these two types of unpaid days:
* Disabilities: Refers to medical leave issued by the Institute (IMSS).
* Absenteeism: Refers to unjustified leave; apply for periods of fewer than 8 days.
Source: [Artículo 31](https://www.imss.gob.mx/sites/all/statics/pdf/leyes/LSS.pdf)
Translated text:
> Article 31. When wages are not paid due to the employee's absence from work, but the employment relationship persists, the monthly contribution shall be adjusted according to the following rules:
> I. If the employee's absences are for periods of fewer than eight consecutive or non-consecutive days, contributions shall be calculated and paid for such periods only for the sickness and maternity insurance...
If the employee's absences are for periods of eight consecutive days or more, the employer shall be released from the payment of employer-employee contributions...
> IV. In the case of absences covered by medical disabilities issued by the Institute, it shall not be mandatory to cover the employer-employee contributions, except regarding the retirement branch.
The following table summarizes the contribution requirements based on the type of absence:
Insurance Branch | Section I (Absenteeism) | Section IV (Disability)
--------------------------------|-------------------------|------------------------
Sickness and Maternity | Paid | Not Paid
Disability and Life | Not Paid | Not Paid
Severance and Old Age | Not Paid | Not Paid
Work Risk | Not Paid | Not Paid
Daycare and Social Benefits | Not Paid | Not Paid
INFONAVIT | Not Paid | Paid
Retirement | Not Paid | Paid
The type of unpaid day to be considered depends on the specific insurance branch being calculated within the employer-employee contributions.
Incorrect values in the XML
The signing process completes without errors, but some amounts in the generated XML are incorrect.
Problem:
The introduction of the Deduction 006 (Disability) directly impacts the calculation of the SubTotal and Total attributes in the Comprobante node.
For a monthly payslip with a wage of 30,000.00 (daily salary of 1,000.00) and 5 disability days (work risk), the values are calculated incorrectly as follows:
Attribute | Calculation | Actual Value | Correct Value
---------------------|----------------------------------|--------------|--------------
Comprobante:SubTotal | Sum of Perceptions (P01) | 25000.00 | 30000.00 (1)
Comprobante:Total | SubTotal - Total Deductions (2) | 15803.74 | 20803.74
(1) Must include the 5,000.00 from disabilities to balance the deduction.
(2) Total Deductions = D06 (5,000.00) + ISR (3,451.65) + IMSS (744.61) = 9,196.26.
The Total is currently undercalculated because the 5,000.00 is being deducted from the SubTotal that already had those 5,000.00 excluded.
Solution:
Since the `SubTotal` is derived from Perceptions, and the "(P01) Salaries, Wages, Stripes, and Day Labor" amount is driven by the `GROSS_WITHOUT_HOLIDAY` rule, the disability amount must be added. This balances the Deduction 006, ensuring `SubTotal` is correct.
* Add test for CFDI with incapacities.
target: 19.0
task-60661607 changes
Enhancements to existing features
This update enhances the logging process during cloud storage migration, providing more detailed information about the migration's progress. Previously, logging was limited, making it difficult to track and troubleshoot issues. Now, users will receive clearer logs, streamlining the migration process and improving overall reliability.
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
Resolved issues and error corrections
This update fixes an issue where emails sent from the system were incorrectly attributing the sender to the wrong company contact. The change adds a final rule based on partner ID to ensure the correct contact is always identified as the sender, regardless of priority.
Original PR description
Steps to reproduce:
1. Install `sale` and `contact`
2. Make a company contact that starts with "A"
3. Give the same email as the current company
4. Create a sale order, and remove the salesperson from it.
5. Send an email using the "Send by email" button
Issue:
- The message author is resolved to the wrong company partner
Cause:
- The code gives priority to some partners, but when two partners still have the same priority,
it does not use a clear final rule to choose between them.
- In that case, the result depends on the existing order of partners, so the wrong one can be picked.
- https://github.com/odoo/odoo/blob/ea56382f804e494a86a72dab02a26134ef358c50/addons/mail/models/mail_thread.py#L2075-L2084
Solution:
- Add a final tie-break rule based on partner `id`.
- This makes the result stable and prevents a newer partner with the same email from being chosen
over the expected one when both have the same priority.
opw-5907006This update fixes a minor issue where the composer field in the Odoo portal wouldn't automatically focus after an emoji was added. The fix ensures the composer always receives focus, improving the user experience when composing messages with emojis. This resolves a technical glitch related to optional JavaScript properties.
Original PR description
Before this commit, after adding an emoji via the emoji picker in the portal chatter, the composer would not be focused. This is due to the `autofocus` prop of the composer being optional and not having a default value, leading to `NaN` when being incremented while `undefined`. This commit fixes the issue by giving it a default value of 0. task-6204911
This update fixes an issue where employee attendance hours displayed in the Gantt view didn't accurately reflect their flexible work schedules. The fix ensures that expected hours are calculated correctly by tracking attendance intervals, leading to more reliable attendance reporting.
Original PR description
Steps to reproduce: 1. Set an employee to have a flexible working schedule 2. Enter the Attendances app 3. When hovering over the employee in the gantt view, the expected hours do not match their working schedule When we calculate the expected hours for the Gantt view in attendances, we calculate this based on an incorrect number of attendance intervals given from `_attendance_intervals_batch()`. To ensure that we recieve accurate intervals, we now keep track of how many hours we've recorded across all intervals, and break out of the loop when we've reached the expected hours.
This update corrects a bug where importing a product with a changed subscription type could bypass a necessary warning. Previously, the system processed the import without alerting the user, leading to potential inconsistencies. Now, a warning is raised when attempting to modify the subscription type of a product that has already been sold, ensuring data integrity.
Original PR description
__ ## Short functional explanation of the error When we have a subscription product that has already been sold. If we try to import a product with the same ID but where we change the subscription…
__ ## Short functional explanation of the error When we have a subscription product that has already been sold. If we try to import a product with the same ID but where we change the subscription type of the product, the import is executed without issue. However, this leads to undesired behavior: when we go to the product page and try to manually change the subscription type (set it back to subscription), the change is not applied as a warning is raised. ## Reproduction Steps Make sure you have debug mode enabled. 1. Create a product, and check the Subscription box. 2. Click on Orders and create a Quotation with this product, then confirm. 3. Go to Products > Products. Select the list view and search for the product you just created. Select it, and click Actions > Export. 4. Check the import compatible field. Select the fields to export: name, id and recurring_invoice. Upon exporting, a file is downloaded. 5. Access that file and change the recurring_invoice to FAUX or FALSE if your computer is in English. Save the changes. 6. Unselect the product and click on the cog, top right > Import. Click on Upload Data File and select the file that you have downloaded upon exporting, then import. ### Expected behavior A user warning is raised: we shouldn't be able to change the subscription type of the product when it has already been sold. ### Unexpected behavior The import is processed normally. Then, when we access the product page, and try to check the Subscriptions box again, a warning is raised. ## Origin of the issue Nothing prevents the import from occurring in that case. __ opw-6143789
This update resolves an issue preventing the POS scale integration with the new 19.2 IoT Box. The IoT box now sends scale data differently, triggering an error. This fix ensures the scale functionality continues to work correctly for all users.
Original PR description
Steps to reproduce - Use a localisation other than a european one (l10n_eu_iot_scale_cert must not be installed) - Setup the scale for the POS - Open the POS - Add a product to be weighted by scale to the order - Sell one of the weighted product Error: value.toFixed is not a function Cause: New versions of the IoT box send response status via data.status instead of data.status.status. [opw-6121011](https://www.odoo.com/odoo/project/49/tasks/6121011)
This update resolves an issue where branch users were unable to create transactions in parent company journals with foreign currencies. The fix ensures branch users can accurately handle currency conversions, improving usability and preventing access errors. This change impacts the account module.
Original PR description
**Problem:** When a branch user with no access to the parent company tries to create a transaction for a parent company's journal with a foreign currency set, this will raise an access error. **Steps…
**Problem:** When a branch user with no access to the parent company tries to create a transaction for a parent company's journal with a foreign currency set, this will raise an access error. **Steps to Reproduce:** - Make a branch of "My Company (San Francisco)" - Set user "Marc Demo" to only have access to the branch - Add a new bank journal set to "EUR" currency - Switch to Marc Demo - Try to add a transaction in the new bank journal **Root Cause:** When a transaction is created, Odoo determines the amount in company currency by converting it from the foreign currency. The method to convert currency uses "with_company()" to use the company's rates, but the allowed companies of the branch user does not have access to the parent company, causing an access error. **Solution:** If the company is the parent company of the active company, get the currency `inverse_rate` from the active company instead. Since branches use the rate of the parent, this will return the same result but without an access error. Ticket [link](https://www.odoo.com/odoo/project.task/6186901) opw-6186901 Forward-Port-Of: odoo/odoo#263425
9 changes
Resolved issues and error corrections
This update improves the speed of exporting the general ledger to an Excel file in version 17. The change eliminates unnecessary calculations within the export process, significantly reducing the export time from over 900 seconds to just 22.4 seconds. This results in a faster and more efficient reporting experience.
Original PR description
**Description:** In version 17, when we export the general ledger to an xls file, we now iterates over accounts fetched with `_get_accounts_with_move_lines` and perform a sum of the related amls balance, credit and debit. Source of this change: [103329](https://github.com/odoo/enterprise/pull/103329) Those sums are calculated through an SQL query built in `_get_query_sum`. However, it's currently inefficient because the query also computes the unaffected earnings of the company on each iteration, even though that information in only meant to be used if the account_type = 'equity_unaffected' in `_query_values`. **Benchmark:** | accounts | amls | before | after | |:---|:---|:---|:---| | 696 | 2819556 | >900s | 22.4s | **Reference:** opw-5904527
This update resolves a technical issue preventing invoices with Early Payment Discounts (EPD) and 0% tax from passing schematron validation, a requirement for Peppol compliance. The fix ensures accurate VAT breakdowns are generated, addressing a previous error where duplicate tax categories were created and a hardcoded tax code was used. This ensures invoices meet regulatory standards and avoids potential export failures.
Original PR description
Before this commit, creating an invoice with an Early Payment Discount (EPD) as a payment term could cause the schematron validation of the generated invoice to fail when an invoice line had a 0% tax. The issue was caused by generating two TaxSubtotal nodes for the same TaxCategory (0%, exemption code 'E'): - one for the 0% VAT - one for the EPD discount applied to the total amount However, Peppol requires a single VAT breakdown (TaxSubtotal) per VAT category (in this case: E) Additionally, when VAT was set to 0%, the allowance charge TaxSubtotal incorrectly used 'S' as a hardcoded tax category code. This commit fixes both issues. task-5900496 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where branch users without parent company access would encounter errors when creating transactions in foreign currency journals. The fix ensures proper access rights are used during currency conversion, allowing branch users to manage transactions accurately. This improves usability and avoids disruptions for users operating within branch environments.
Original PR description
**Problem:** When a branch user with no access to the parent company tries to create a transaction for a parent company's journal with a foreign currency set, this will raise an access error. **Steps to Reproduce:** - Make a branch of "My Company (San Francisco)" - Set user "Marc Demo" to only have access to the branch - Add a new bank journal set to "EUR" currency - Switch to Marc Demo - Try to add a transaction in the new bank journal **Root Cause:** When a transaction is created, Odoo determines the amount in company currency by converting it from the foreign currency. The method to convert currency uses "with_company()" to use the company's rates, but the allowed companies of the branch user does not have access to the parent company, causing an access error. **Solution:** Call the currency conversion with sudo() to ensure access to the relevant companies. Ticket [link](https://www.odoo.com/odoo/project.task/6186901) opw-6186901
This update fixes an issue where the cost of service sale order lines wasn't being calculated correctly when adding new lines to existing orders. The change ensures that the product's cost is accurately reflected, regardless of whether timesheets are associated or the product has a standard price. This improves the accuracy of pricing for service-based sales.
Original PR description
Steps to reproduce: --------------------------------------- 1. Install the `sale_timesheet_margin` module 2. Create a product as follows: * Type: Service * Invoicing Policy: Prepaid/Fixed Price *…
Steps to reproduce:
---------------------------------------
1. Install the `sale_timesheet_margin` module
2. Create a product as follows:
* Type: Service
* Invoicing Policy: Prepaid/Fixed Price
* Create on order: Nothing
* Cost: Add some cost to the product (e.g., 30)
3. Create and Confirm Sale Order with Product (Add Cost field in SOL from the optional field)
4. Now add a new Sales Order Line (SOL) with the same product
Observation:
---------------------------------------
The cost of the recently created Sales Order Line (SOL) is 0.0, which is not correctly calculated based on the product's cost.
Issue:
---------------------------------------
The `_compute_purchase_price` method has a filter (`service_non_timesheet_sols`) that excludes certain sale order lines from the parent's purchase price computation. When a new sale order line is added to an already confirmed sale order (state='sale'), the new line inherits the parent SO's state immediately. That means, the new line matches the filter criteria and gets excluded from parent computation. The `purchase_price` is never calculated from the product's `standard_price`
Solution:
---------------------------------------
The added condition, like EITHER:
1. Has timesheets recorded (`sol.timesheet_ids` is truthy) → Preserve existing cost
2. OR product has NO standard price (`not sol.product_id.standard_price`) → Use timesheet-based costing
Code intentionally skips the computation of `service_non_timesheet_sols` lines to preserve existing values
opw-5351724This update corrects a bug in how backorder receipts are valued, ensuring consistent USD pricing regardless of exchange rate differences between the bill date and receipt date. The change updates the calculation method for `receipt_value` to accurately reflect the correct exchange rate at the time of receipt, resolving discrepancies in stock valuation.
Original PR description
Configuration: - Costing method: FIFO, automated valuation - Multi-currency: PO in a foreign currency (e.g. EUR), company currency USD - Two different exchange rates: one active at bill date, one at…
Configuration:
- Costing method: FIFO, automated valuation
- Multi-currency: PO in a foreign currency (e.g. EUR), company currency USD
- Two different exchange rates: one active at bill date, one at receipt date
- Bill posted before any goods are received
Steps to reproduce:
- Set EUR as a secondary currency with two different rates:
- Rate 1 on January 1st: 1 EUR = 1 USD
- Rate 2 on January 8th: 1 EUR = 2 USD
- Create a PO in EUR for 20 units @ 10,000 EUR
- Post the vendor bill dated January 3rd (rate 1 applies: 1 EUR = 1 USD)
- Receive 10 units on a date after January 8th and create a backorder
- Receive the remaining 10 units from the backorder on the same date
- Inspect the stock valuation layers and interim account journal entries for both receipts
Prior to this commit:
The two receipts, identical in quantity, date, and PO price, would produce different unit costs in USD. The backorder receipt would be incorrectly valued due to a wrong exchange rate being used when computing `receipt_value` in `_get_price_unit()`.
Receipt 2 (backorder):
SVL 1 value: $100,000 USD
Converted to EUR at receipt date (1 USD = 0.5 EUR):
receipt_value = $100,000 × 0.5 = 50,000 EUR (wrong rate)
total_invoiced_value = 200,000 EUR
remaining_value = 200,000 - 50,000 = 150,000 EUR
remaining_qty = 20 - 10 = 10
price_unit = 150,000 / 10 = 15,000 EUR
Converted to USD at bill date (1 EUR = 1 USD):
price_unit = $15,000 USD
SVL value = $15,000 × 10 = $150,000
This bug only affects backorder receipts. The first receipt always gets `receipt_value = 0` (no prior SVLs exist), so the problematic conversion never runs.
After this commit:
`receipt_value` is now computed using `_get_currency_convert_date()` instead of `layer.create_date`. This ensures `receipt_value` and `total_invoiced_value` are both expressed in EUR at the same reference rate.
Receipt 2 (backorder):
SVL 1 value: $100,000 USD
Converted to EUR at bill date (1 EUR = 1 USD):
receipt_value = $100,000 × 1.0 = 100,000 EUR (correct rate)
total_invoiced_value = 200,000 EUR
remaining_value = 200,000 - 100,000 = 100,000 EUR
remaining_qty = 20 - 10 = 10
price_unit = 100,000 / 10 = 10,000 EUR
Converted to USD at bill date (1 EUR = 1 USD):
price_unit = $10,000 USD
SVL value = $10,000 × 10 = $100,000
Both receipts now produce identical unit costs regardless of exchange rate differences between bill date and receipt date.
OPW: 5426718
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update corrects a previous issue where product manufacturing quantities were incorrectly linked to planned production levels. Now, the system accurately reflects the actual quantity of products that have been produced, providing more reliable inventory data and reporting. This ensures better decision-making regarding stock levels and production planning.
Original PR description
* Before: the manufactured quantity on product use the planned quantity * After: Use actual produced quantity 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 update resolves an issue where employees with capped leave accrual plans were sometimes blocked from requesting future time off. The fix adjusts how future leave accruals are calculated, ensuring employees can accurately see and request time off beyond their capped balance. This improves the user experience for employees managing their leave entitlements.
Original PR description
**Issue Summary:** Employees on capped accrual plans can sometimes be blocked from requesting time off in the future, even if they currently have enough available time. This happens when they've…
**Issue Summary:** Employees on capped accrual plans can sometimes be blocked from requesting time off in the future, even if they currently have enough available time. This happens when they've previously used more time off than the cap allows at one time. It's important to note that the cap sets the maximum balance an employee can hold at once, not a limit on the total amount they can accrue over time. For example, if the cap is 12 days, an employee can never hold more than 12 days at a time. However, as long as they continue using time off regularly, they can keep accruing more, theoretically without limit. To clarify what "future" means here: it refers to any date after the accrual plan's nextcall, which is the next scheduled update to the employee's balance. So even if they have time available now, they might not be able to request leave for dates beyond that point. Fix 1: See accruals even if the future leaves would be capped. - `_get_future_leaves_on` gives the difference between today's allocation and the allocation in the future after accruals. - However, if there's an accrual cap, and today's allocation is at the cap, Odoo can't see accruals in the future since no days would be accrued. - We want to see future accruals even if we're at the cap. - Solution: Calculate the future accruals as though it had no cap, then cap the gained leaves to the accrual cap. Fix 2: Base accruals on virtual leaves, not real leaves. - When leaves are virtual (not validated), `max_leaves` is too low because it's getting capped to 2, whereas with validated leaves it's 3 successfully. - This is the result of method `_process_accrual_plans` calling `_add_days_to_allocation` with the `leaves_taken` argument. It doesn't see non-validated leaves, but it should so that future leaves are correct. - Solution: Give `_add_days_to_allocation` virtual leaves instead of real leaves. Fix 3: Show correct max leaves for capped accruals in the Time Off Dashboard. - The `max_leaves` on leave types is computed based on the user's employee, and appears in the display name when creating new leaves in the dashboard. - `max_leaves` after Fix 1 will now report the full leaves amount, which in the Dashboard context is wrong since it will say "X out of [max_leaves]" but we need `max_leaves` to reflect the cap. - Solution: Add logic in `get_allocation_data` to cap `max_leaves` based on accrual cap. opw-4720344 Co-authored-by: Dirk Douglas <dido@odoo.com> Co-authored-by: Harrison Hutton <hahu@odoo.com>
This update corrects a bug where new job applications created with an email address would incorrectly duplicate the email as the applicant's name in the system. The fix ensures that the applicant's provided name is used when creating the partner record, improving data accuracy and usability within the recruitment process. This resolves an issue that impacted partner ordering in POS testing scenarios.
Original PR description
## Issue When creating a job application with a new email address, a `res.partner` is created with both its name and email set to the email address, even if a `partner_name` is provided. ## Steps to…
## Issue
When creating a job application with a new email address, a `res.partner` is created with both its name and email set to the email address, even if a `partner_name` is provided.
## Steps to reproduce
1. Install *Recruitment* (`hr_recruitment`) and *Contacts* (`contacts`)
2. In Recruitment, create a job application:
- Any Subject
- Name N
- Email E
3. Save the job application
4. Go to Contacts
5. **The partner created from the job application has both its name and email set to the Email E used to create the job application.**
## Cause
The `_inverse_partner_email` passes the email address to `find_or_create` to create the new res.partner:
https://github.com/odoo/odoo/blob/fc58ff23f491a2063b10ffcd6393a08b90dc7975/addons/hr_recruitment/models/hr_applicant.py#L317-L324
This method is implemented to parse both a name and an email address in the same string.
https://github.com/odoo/odoo/blob/fc58ff23f491a2063b10ffcd6393a08b90dc7975/odoo/addons/base/models/res_partner.py#L937-L945
We can thus provide both the `partner_name` and the `email_from` to the method to create a user with a name and an email address properly set.
## POS tests modifications
Before this first commit, some partners in `hr_recruitment` demo data were created with their email address as their name. This is the case, for example, for "Johan Duck", whose name was set to `coincoin@gmail.example.com`.
<img width="627" height="86" alt="260296" src="https://github.com/user-attachments/assets/e4bab843-8ba3-4930-af20-ca8603983929" />
In the POS tours, the list of loaded partners is limited to 100 partners and ordered by their order count (which is often null), __and their name__.
https://github.com/odoo/odoo/blob/e7345340efbd66473da70ccf6680181b158047ce/addons/point_of_sale/models/pos_config.py#L845-L865
By "renaming" the partners from `hr_recruitment`, they started appearing higher up in the list because their name now starts with capital letters whereas their email began with lower letters, which are sorted after capital letters by the `ORDER BY` SQL clause. As a result, partners from multiple tours were pushed out of the 100 first partners, meaning they were no longer loaded during the tours, causing the tests to fail.
One solution, which is already used in other tests, is to give the test partners names that make them appear higher in the partner list, ensuring they remain within the first 100 loaded partners.
opw-6111598This update reverts a previous change to the user signup process to ensure compatibility with existing customizations. It validates user input during signup and provides autocomplete suggestions, enhancing the user experience while preventing potential disruptions to existing workflows.
Original PR description
This reverts commit fcb80cce1c4b5a24600b061ae0520b86b6c25eff. As discussed in [1], the change may break existing customizations or workflows using non-email logins. [1]: https://github.com/odoo/odoo/pull/258967 task-6094631