Daily updates from Odoo
Monday, February 23, 2026
250 changes
11 changes
Resolved issues and error corrections
The Time Off Balance report was incorrectly calculating remaining time off days due to how allocations were aggregated. This fix reorders allocations by their start date to ensure accurate calculations, especially when employees have allocations across different periods. This ensures the report accurately reflects available time off.
Original PR description
The balance report aggregates allocations regardless of the period in which they occur resulting in wrong information when an employee has two allocations in different periods and a filter is used in the report Steps to reproduce: 1. Install Time Off app 2. Open Time Off app and go to Management > Allocations 3. Create a new allocation of 100 days for employee "Mitchell Admin" of time off type "Paid Time Off" with a validity period from 01/01/2027 to 31/12/2027 and approve it 4. Activate debug mode 5. Go to Time Off > Reporting > Balance 6. The number of days left for "Mitchell Admin" for "Paid Time Off" is 120 days even though the default filter is on the period of 2026 Solution: Refactor the entire query: we order the allocations by date_from so we can subtract taken leaves from the allocations in that order opw-5156142 Forward-Port-Of: odoo/odoo#249512 Forward-Port-Of: odoo/odoo#245860
This update resolves an issue where borders were missing from mention elements in the email interface. The problem stemmed from an unnecessary inline-block property being applied to the mention links. This change ensures consistent and proper display of borders, improving the visual quality of emails.
Original PR description
Backport of https://github.com/odoo/odoo/pull/248999 Before this PR, the border from the mention element was missing at the top and bottom. This is caused by the inline-block property. `<a>` is already an inline element and doesn't need this property. Task-5867464 (point 68) Before / After <img width="272" height="63" alt="Screenshot 2026-02-20 at 14 38 24" src="https://github.com/user-attachments/assets/c5c3ffe2-d8a7-4405-9e69-59f4e6e05a77" /> <img width="268" height="57" alt="Screenshot 2026-02-20 at 14 38 36" src="https://github.com/user-attachments/assets/29cf6777-b84a-46c4-b78a-4950865e1ef0" /> Forward-Port-Of: odoo/odoo#249811
This update fixes several issues related to how custom website snippets are displayed in the preview. Specifically, it ensures consistent preview heights for carousel snippets, corrects parallax preview behavior, and maintains labels for custom previews. These changes improve the user experience when creating and testing website content.
Original PR description
Steps to reproduce: - Open the website editor. - Add a carousel snippet to a page. - Remove content from the first slide so it is shorter. - Save the carousel as a custom snippet. - Open the snippet…
Steps to reproduce: - Open the website editor. - Add a carousel snippet to a page. - Remove content from the first slide so it is shorter. - Save the carousel as a custom snippet. - Open the snippet dialog and locate the custom snippet. => The preview height is too small. Before this commit, the preview height was computed from the scaled size, so shorter slides made the preview min-height too low. After this commit, the preview height uses the layout size so the min-height stays consistent with other slides. ---------- Steps to reproduce: - Open the website editor. - Open the snippet dialog and resize the window. => The parallax preview background shifts to the left. - Save a snippet with a parallax zoom in/out effect as a custom snippet. - Open the snippet dialog and locate the custom snippet. => The preview shows a top to bottom effect instead of zoom. Before this commit, resizing the snippet dialog could offset the parallax background to the left, and zoom previews looked like top to bottom effects. After this commit, the preview keeps the background aligned and shows zoom in/out effects for custom snippets. Fixed parallax is still not previewed because it would require an oversized background in the dialog. ---------- Steps to reproduce: - Open the website editor. - Save a "Carousel" snippet as a custom snippet. - Open the snippet dialog. => The custom snippet shows no label. Before this commit, custom previews dropped the base label so the dialog showed no tag for custom snippets. After this commit, custom previews reuse the base label. task-5156137 **To see/test the bug, the change made in https://github.com/odoo/odoo/pull/244251 must be present** Forward-Port-Of: odoo/odoo#249163 Forward-Port-Of: odoo/odoo#244295
This update addresses a recent finding that the SAT (Mexican tax authority) sometimes accepts accented characters in tax documents. Previously, the system was removing these accents to comply with SAT's rules. This change temporarily allows the 'É' character, and further investigation is underway to determine the best long-term approach for SAT compliance.
Original PR description
An improvement in September (PR #95207) began removing accents from names in documents sent to the SAT, in order to comply with their own practices. In recent months, it has become clear that the SAT…
An improvement in September (PR #95207) began removing accents from names in documents sent to the SAT, in order to comply with their own practices. In recent months, it has become clear that the SAT does accept accents sometimes. First with umlauts on the `ü` in October (PR #96043), then all umlauts in February (PR #106557). As this PR has found another accepted accented character `É`, it may be necessary to undo the original improvment entirely. The [Anexo 20 Guía de llenado de los comprobantes fiscales digitales por Internet](http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Anexo_20_Guia_de_llenado_CFDI.pdf), pg 17, indicates that accented characters are maintained in legal names. At least, `Í` is allowed. At this point in time I only added the exception for `É`. Steps to reproduce are [on the ticket](https://www.odoo.com/mail/message/999357619), as it requires a real person's tax information. [opw-5915515](https://www.odoo.com/odoo/project.task/5915515) ---- *Edit: Miguel (mial) confirmed that names are not always sanitized, but that we expect them to be.* Forward-Port-Of: odoo/enterprise#107677
This update resolves an issue where the 'Update Prices' button disappeared after saving a quotation. The fix adds a field to the view that correctly maintains the button's visibility, ensuring users can easily adjust prices when needed. This improves the sales process and prevents data inconsistencies.
Original PR description
Steps to produce: --- - Install sales module. - Go to Settings and enable Pricelists (make sure we have 2 pricelists so that we able to change the pricelist value in quotation). - Create a new…
Steps to produce: --- - Install sales module. - Go to Settings and enable Pricelists (make sure we have 2 pricelists so that we able to change the pricelist value in quotation). - Create a new quotation > Add a customer and product. - Change the pricelist. - Save the record. Issue: --- - After saving the quotation, the `Update Prices` button becomes invisible. Root cause: --- - The field `show_update_pricelist`, which controls the visibility of the button, is not present in the view. As a result, when the record is saved, the field is not included in the form data and its value is not properly maintained, causing the button to become invisible. - The field is removed from the view in this [commit]. Solution: --- - Added the `show_update_pricelist` field to the view to ensure its value is properly maintained. This allows the `Update Prices` button to remain visible when applicable. [commit]: https://github.com/odoo/odoo/commit/da4b588b272432095f549c012e0a0d7238f00dc0 **Enterprice PR:** https://github.com/odoo/enterprise/pull/107621 opw-5927659 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249881 Forward-Port-Of: odoo/odoo#248957
This update resolves an issue where the 'Update Rental Prices' button disappeared after saving a rental order. The fix adds a field to the view that ensures the button remains visible when a rental period is changed and the order is saved. This improves the user experience for managing rental agreements.
Original PR description
Steps to produce: --- - Install `sale_renting` module. - Rental > Open any order > Change the rental period. - Save the record. Issue: --- - After saving the order, the `Update Rental Prices` button becomes invisible. Root cause: --- - The field `show_update_duration`, which controls the visibility of the button, is not present in the view. As a result, when the record is saved, the field is not included in the form data and its value is not properly maintained, causing the button to become invisible. - The field is removed from the view in this [commit]. Solution: --- - Added the `show_update_duration` field to the view to ensure its value is properly maintained. This allows the `Update Rental Prices` button to remain visible when applicable. [commit]: https://github.com/odoo/enterprise/commit/b90bbdef10a7a37fb065626ba995811ab388c7a1 opw-5937145 --- Forward-Port-Of: odoo/enterprise#108157 Forward-Port-Of: odoo/enterprise#107621
This update fixes a display issue in the Point of Sale product information popup. Previously, the 'Financials' section incorrectly showed the tax identification number (RFC) instead of the correct VAT or IVA name. This change ensures accurate tax information is presented to users, improving data clarity and accuracy within the POS system.
Original PR description
How to reproduce; - Use a company from a country with a different vat_label (Mexico for example) - Go to the frontend of POS - Select a product > ... > Info The problem: Under the "Financials" section, "RFC" is displayed instead of "VAT" or "IVA". RFC is the tax identification number, not the tax name Why: This commit (https://github.com/odoo/odoo/commit/4fa9f9b849016f312efcb73f9a76b223e429aec0) introduced the usage of vat_label to display the tax name in a dynamic way. However, the vat_label field is used to store the tax identification number, not the tax name opw-5915087 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249374 Forward-Port-Of: odoo/odoo#247618
This update corrects a bug where refund transactions for non-settled payments were incorrectly cancelled. The change ensures that voided refund transactions are now properly marked as 'confirmed,' improving the reliability of refund processing within the Payment Authorize module. This resolves an issue impacting payment reconciliation and reporting.
Original PR description
Versions: --- 19.0+ Issue: --- Refund transactions are cancelled once refund is completed for non-settled payments. Steps to reproduce: --- 1- Configure `payment_authorize`. 2- Create a payment, and pay using authorize. 3- Refund the payment. Outcome: The refund transaction is initiated and then cancelled once the refund is completed. Cause: --- After #209685, the `tx._refund` method is introduced, which is creating a new transaction, and the provider-specific logic is left for `_send_refund_request` hook. Before that, the tx creation was done in `_send_refund_request`, which in `payment_authorize`'s override, no transaction was created if the payment wasn't settled by the provider yet. Therefore, voided transaction meant setting tx.status as cancelled. Fix: --- Now that we are creating tx for all refund tx regardless of payment settlement, we should set status of refund voided tx as confirmed. opw-5904548 Forward-Port-Of: odoo/odoo#249434
This update fixes a potential issue with how Odoo accesses email messages, ensuring more reliable performance and stability. The changes include enhanced testing to cover complex access scenarios and improve the overall robustness of the mail system. This resolves a technical problem that could have impacted email delivery.
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#248125 Forward-Port-Of: odoo/odoo#245744
This update resolves a previous issue where automation flows involving moving documents and triggering subsequent actions frequently failed due to security restrictions. The change allows actions to run seamlessly even after a document is moved, improving the reliability of automated workflows. The fix simplifies the system and enhances user flexibility.
Original PR description
Prior to this commit, creating a multi-action that moved a document to a new folder and immediately triggered another action (e.g., "Create Invoice") often failed. This occurred because the security…
Prior to this commit, creating a multi-action that moved a document to a new folder and immediately triggered another action (e.g., "Create Invoice") often failed. This occurred because the security check required the sub-action to be explicitly embedded (pinned) on the *destination* folder. Since the record was moved during the process, the subsequent action failed the security check on the new folder where it wasn't pinned. This limitation caused confusion for users setting up automation flows, as the intent of the sequence (Move -> Action) was clear and initiated from a valid context (the source folder), but strict per-action security rules blocked execution. This commit improves the `ir.actions.server` execution logic to support this pattern by introducing a context-based security sentinel: 1. Entry Point Validation: When a Documents action (root) is triggered, the system enforces strict security: the action must be explicitly embedded on the record's current folder. 2. Context Inheritance: Once the root action is authorized and begins execution, it sets a secure sentinel in the context. 3. Trusted Execution: Any subsequent sub-actions (children) detect this sentinel and are allowed to run, regardless of the record's current folder location. This ensures that if a user has the right to start the process (the root action), they have the right to complete the defined sequence, even if intermediate steps move the record to a folder where the sub-actions are not explicitly pinned. As a result, the `_can_execute_action_on_records` override in `documents_account` is no longer necessary and has been removed. Tests have been extended in the `documents` and `documents_account` modules to cover these scenarios (using Tags in the `documents` module instead of Accounting-specific models to make the tests generic). A new test file `test_documents_ir_actions_server.py` was created to maintain a clean testing environment, covering nesting, move sequences, and RPC spoofing attempts. Task-5916630 Forward-Port-Of: odoo/enterprise#106702
This update fixes an issue where invoices weren't correctly using product category accounts. Now, Odoo automatically checks the entire category hierarchy (parent to child) to find an appropriate account, ensuring invoices accurately reflect the intended income or expense. This improves financial reporting accuracy.
Original PR description
**Steps to reproduce:** * Install the **Accounting** module. * Create a product category hierarchy (grandparent → parent → child). * Set an **income account** on the grandparent category. * Set an…
**Steps to reproduce:** * Install the **Accounting** module. * Create a product category hierarchy (grandparent → parent → child). * Set an **income account** on the grandparent category. * Set an **expense account** on the child category. * Leave the parent category without any accounts. * Create a product assigned to the child category. * Create a customer invoice using this product. **Observed behavior:** * The invoice line uses the **default income account** from settings instead of the grandparent category’s income account. * The category hierarchy is not checked to retrieve parent accounts. **Expected behavior:** * If no account is defined on a category, Odoo should traverse the **parent categories** to find one. * Only if no account exists in the hierarchy should it fall back to journal or default accounts. **Cause:** * Account lookup only checked the **immediate category**. * Parent categories were not considered. **Fix:** * Traverse the product category hierarchy when searching for accounts. * Use the first account found in the parent chain. opw-5869592 Forward-Port-Of: odoo/odoo#249909 Forward-Port-Of: odoo/odoo#248389
19 changes
Resolved issues and error corrections
This update fixes an issue where products without the 'sale' option were incorrectly selectable in Sales Orders. The fix ensures that only products specifically enabled for sales are included, preventing errors and improving data accuracy within the rental sales process. This change enhances the reliability of our rental sales functionality.
Original PR description
Steps to produce: --- - Install `sale_renting` and `sale_management` modules. - Go to `Sales > Products > Products`. - Create a product and disable the Sales option (`sale_ok = False`). - Create a…
Steps to produce:
---
- Install `sale_renting` and `sale_management` modules.
- Go to `Sales > Products > Products`.
- Create a product and disable the Sales option (`sale_ok = False`).
- Create a Sales Order and try to add that product.
Issue:
--
- Even though the product is not sale-enabled (`sale_ok = False`), it is still selectable in the Sales Order.
Root cause:
---
- At [1], The issue occurs because `super_domain` was not always included.
- When `order_is_rental` is True, `super_domain + []` happens,
so only `super_domain` is applied.
- But when `order_is_rental` is False, instead of
`super_domain + [('rent_periodicity', '=', False)]`, only
`[('rent_periodicity', '=', False)]` was returned, and
`super_domain` was ignored.
- Because of this, base conditions from `super_domain` like
`sale_ok = True` were not applied.
Solution:
---
- Add parentheses around the conditional expression to ensure proper evaluation order and correct domain construction, so only products with `sale_ok = True` are selectable.
[1] https://github.com/odoo/enterprise/blob/abfde5f253c4c52d3a734ca8dafe6f8ed261cf75/sale_renting/models/sale_order_line.py#L49
opw-5902403
---This update fixes a technical error that occurred when users discarded the 'Lot/Serial number(s) required' dialog during product setup with unique serial number tracking in Point of Sale. The fix prevents further errors and ensures the POS system functions correctly when users choose not to enter serial numbers, improving the reliability of product tracking.
Original PR description
Steps to reproduce: = - Configure a product with `Tracking`=`By Unique Serial Number` - Open POS and click on the configured product. - The “Lot/Serial number(s) required” dialog opens. - Click `Discard`. Issue: = - The following error occurs: `TypeError: Cannot read properties of undefined (reading 'modifiedPackLotLines')` Fix: = - Stop further steps to add the product when the lot/serial number dialog is discarded. Reference: = - https://github.com/odoo/odoo/pull/238635/files#diff-9e8905c1e88dc96f9145acda2c6a165fb14a58e0d2cfb5b3b6049411918ba27dL913-L914 task-5505855 related pr: https://github.com/odoo/enterprise/pull/108263
This update resolves an issue where product traceability within Odoo's Point of Sale (POS) system was incomplete when using unique serial numbers for products. The change ensures that order line configurations are correctly applied, allowing for accurate tracking of products with serial numbers throughout the sales process. This improves data accuracy and inventory management.
Original PR description
In this commit: = - Overridden `requiresOrderLineConfiguration` so that `configureNewOrderLine` is also called when lot or scale configuration is required. task-5505855 related pr: https://github.com/odoo/odoo/pull/245165
This update fixes an issue where trial websites were sometimes created multiple times. The change ensures that a website is created using the original website information when a trial request is converted, streamlining the process and preventing unnecessary website duplication. It also introduces a more reliable method for generating trial websites.
This update corrects a test failure that could cause the application to incorrectly focus a card during one-to-one calls. The fix ensures the application correctly detects when a meeting view is active before triggering actions related to video streams, preventing unexpected behavior. This improves the reliability of the call functionality.
Original PR description
Before this commit, the following discuss call test may fail non-deterministically: ``` @mail/discuss/call/call/auto-focus participant video in one-to-one call in chat window ``` This happens at the…
Before this commit, the following discuss call test may fail non-deterministically: ``` @mail/discuss/call/call/auto-focus participant video in one-to-one call in chat window ``` This happens at the step where it checks that when inside the discuss meeting view, having another participant enable a video stream does not auto-focus the card. The test was failing and auto-focusing the card because the simulated toggling of enabling the video stream happens before the side-effect of rendering to toggle the flag that meeting view is on. So the handling of event that video stream is toggled on was mistakenly considering outside of meeting view. This commit fixes the issue by awaiting a `data-active` on the UI if meeting view, which ensures the rendering of meeting view is complete and store is aware of meeting view being open, before triggering the event that simulates toggling of video stream. This technique is borrowed from `DiscussApp` component that requires a similar technique to determine whether a chat window must auto-open or not, which also requires making sure the store knows precisely when `DiscussApp` is logically open. Fixes runbot-error-240554
This update resolves an issue where the description field for new tasks was being duplicated in the project form. The root cause was a default field content being incorrectly appended. This change ensures that task descriptions are displayed accurately and consistently within the project management interface.
Original PR description
Steps to reproduce: =================== 1. Go to website > contact us page 2. Submit a new task with description. 3. View the Description in the project app. -> The description field is already shown in the form by default. You will find another time it is repeated. Cause: ====== The default field content is always appended to the form content. Solution: ========= Avoid adding description to the description field content. opw-5868382 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246952
This update resolves a display issue in the employee offer screen for the Belgium payroll localization. The contract type field was incorrectly appearing due to a previous addition by the localization module. This fix removes the unnecessary field addition, ensuring correct display for standard Odoo Enterprise users.
Original PR description
Bug reproduction: Ensure that belgium payroll localization is not installed, go to offer of employee, contract type field is not there. Bug cause: Contract type field does not exist in the model, it was adding to the view by l10n_be_hr_payroll. Bug solution: I added new field contract_type_id to the hr_contract_salary_offer model (to show it on UI). Solved from 17.0 Note: I need to fix after version 19.0, because by starting from 19.0, the Belgium one will try to add the same field to the view again task - 5500488 Forward-Port-Of: odoo/enterprise#108052 Forward-Port-Of: odoo/enterprise#104578
This update resolves an issue preventing custom fields from being added to attendee registration forms. Previously, adding new fields caused conversion errors. The fix allows for more flexible customization of event forms, ensuring that third-party modules can easily integrate with the registration process. This enhances the extensibility of the website event functionality.
Original PR description
Before the addition of identification questions like "name", "email", and "phone" in the commit [1] as event questions instead of having them static, we could add custom data, such as fields for the address, with static inputs in the form. After that addition, it's no longer possible because the registration gives us the following error when trying to convert data that isn't a M2o ID or an Integer value:
invalid literal for int() with base 10
By adding the check for the field's type, we can still add custom fields with static fields in the template, as an alternative, given that there's no question type for other fields.
[1]: https://github.com/odoo/odoo/commit/6b8daa880c
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#244378This update resolves an issue where attendee registration answers were not being saved correctly after a POS transaction. The fix simplifies the data loading process to ensure all answers are consistently recorded, preventing data loss during ticket purchases. This ensures accurate attendee information is always available.
Original PR description
In [1], a refactoring of the POS framework was done, but in the process some overlooked behaviors induced a complete loss of the answers given in the registration process, as long as they do not…
In [1], a refactoring of the POS framework was done, but in the process some overlooked behaviors induced a complete loss of the answers given in the registration process, as long as they do not include an answer to a 'selection' question. STEPS ===== 0. Create a new event with a few questions (no 'selection' one) 1. Add tickets so that you can buy one in the POS 2. Go in the POS (reload data if needed) 3. Buy a ticket and fill the attendee form (answer to all questions) 4. Continue the POS flow and pay for your ticket. 5. Go back to the back-end and event > attendees 6. Check your new attendee: no answers are linked to the record. ISSUE ===== TLDR - Two fields have the same comodel on event.registration. This breaks the use of inverseMap as both are loaded in the pos. As they are treated sequentially when connecting related records, hidden side effects occur when both are not set. Details: This effect is due to two main issues. First, after [1], we compute the whole model reference relations using processModelDefs method, that accounts for inverse relations of o2m, m2o fields and provides an inverseMap to be used in several places, notably on creation or deletion of relational records from the POS. However, pos_event presents a peculiar situation, as registrations have two o2m fields, both loaded in _load_pos_data_fields, that are linked to the model event.registration.answer: registration_answer_ids and registration_answer_choice_ids, a subset of the first, just with a domain to only include answers of 'selection' questions. Meaning that the inverseMap will only use one of the two, in this case registration_answer_choice_ids. In turn, this means that any update of registration_id on the answer model will update that field, even if the original update was done on registration_answer_ids... Secondly, one could notice that this should still work, as the inverseMap is used in all places, we should just update the records through the field registration_answer_choice_ids. So why does it not work and why are all answers removed? Because both fields are loaded in _load_pos_data_fields, and in _sanitazeRawData we use getFields to know which fields to update and to connect (for relations on the model), both being returned. This means that independantly of the create values for the registration in addProductToOrder in pos_event, the 'framework' will still have two fields to connect and will do so sequentially, one field at the time. But in the _connect logic, if a field has no value given at creation, then the 'CLEAR' command is used, as this would mean we remove the content of the relational field. But in this case, this means that as both answer fields try to update registration_id through registration_answer_choice_ids, if no value is given at creation in that field, then we clear existing ones, for instance those we just linked through the creation values in the first field registration_answer_ids, as we basically empty registration_id on those records. The answers will also be deleted of the indexedDB because of the condition in databaseTable (no linked registration -> can be removed) FIX === Remove registration_answer_choice_ids from the loaded data, as it is not used anywhere except in the registration creation values. As it is a subset of the other field registration_answer_ids, only keep that one instead. Update the creation values to only use that field. Note that this seems to highlight a limitation when it comes to having more than one o2m field on a model loaded at the same time in POS. [1] odoo/odoo@a80a39f2ad16baf474553574c79d55948f86c453 Task-4919080 Forward-Port-Of: odoo/odoo#231293
This update corrects a critical issue where Belgian invoices generated by the account_edi_ubl_cii module were missing a required scheme ID. This ensures compliance with international standards (ISO 6523 ICD) and proper invoice processing for Belgian company registries. The fix also addresses a related issue with PartyLegalEntity data for the Netherlands.
Original PR description
1) This commit adds the new generic methods to build an UBL file. The big objective is to remove the hierarchy of UBL later on and make BIS3 completely standalone. In this commit, BIS3 is not independent of UBL 2.1 & 2.0. 2) Missing schemeID for Belgium Company registry Since https://github.com/odoo/odoo/commit/d40652c17b43b6a9fd4d19ce84b943b2a51fad9c, in Belgium, we set by default the company registry. However the schemeID is missing and should be part of the ISO 6523 ICD list: https://docs.peppol.eu/poacc/billing/3.0/codelist/ICD/ 3) Fix PartyLegalEntity when the country is NL and there is no company registry/EAS/Endpoint That case was raising a traceback before this commit. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246377
This update ensures shift start and end times accurately reflect the selected shift template, even when employees have fixed schedules. Previously, shifts were incorrectly influenced by employee schedules, leading to inaccurate time calculations. This change corrects a bug to guarantee shifts align with the intended template.
Original PR description
__ ## Short functional explanation of the error Let's say we create a role containing employees with fixed schedules. Then, we create a shift template that applies on this role. When we create a…
__ ## Short functional explanation of the error Let's say we create a role containing employees with fixed schedules. Then, we create a shift template that applies on this role. When we create a shift, the starting and ending hours will take into consideration the hours of the employee's fixed schedule, instead of aligning with the shift template start and end hours. As discussed with XBO, the start and end hours of the shift should align with the shift template, despite the fixed working schedules having different start and end hours. ## Reproduction Steps 1. Go to Planning. Click on Configuration tab > roles. 2. Create a role and add an employee as a resource This employee has to have a fixed working schedule. 3. Click on Configuration tab > Shift Templates. 4. Create a new Shift Template. Select starting and ending hours different from the employee's fixed schedule. Select the role you just created. 5. Click on Schedule tab > By resource and click on New. 6. Select the role you just created. ### Expected behavior The start and end hours should align with the shift template start and end hours. ### Unexpected behavior The start and end hours are aligned on the employee's fixed working schedule: if the employee has a schedule from 8 to 16h36 and the shift template goes from 10 to 18, the starting and ending hours will be 10 to 16h36. ## Origin of the issue We kept computing the working intervals of employees, even if a shift template was set: https://github.com/odoo/enterprise/blob/8b00363e5e461f11b9736354d94e520e21932e71/planning/models/planning.py#L656-L664 Which isn't necessary in the case where a shift template has been set, as the start and end time are determined by the shift template, and not the employee's schedule. __ opw-5898509 Forward-Port-Of: odoo/enterprise#107018
This update corrects an issue where accrual entries weren't accurately reflecting product costs, particularly when sales prices differed from the original product cost. The fix ensures that inventory valuation and cost of goods sold accounts are correctly updated, leading to more precise financial reporting. This resolves discrepancies related to price differences in purchase orders and sales.
Original PR description
## [FIX] Accrual account domain Since [1], the accrued order wizard can be open from a purchase order line view and from a sale order line view. The wizard account field uses a domain, and this…
## [FIX] Accrual account domain Since [1], the accrued order wizard can be open from a purchase order line view and from a sale order line view. The wizard account field uses a domain, and this domain is different if the active model is `purchase.order`. In quoted PR, the domain wasn't adapted to work with `purchase.order.line` as active model. This PR fixes that. ## [FIX] Correct COGS cost #### How to reproduce the issue - Use anglo-saxon config; - Have a product with a cost; - Sale this product with its unit price =/= its cost; - Deliver; - Create accrual entry for this product => The perpetual valuation lines are not correct, they use the SO lines' price for their debit/credit instead of the product's cost. #### Example If we have a product with cost of $100 and sell it for $180 We currently have: Account Debit Credit Stock Valuation $ 0.00 $ 180.00 Cost of Goods Sold $ 180.00 $ 0.00 But we should have: Account Debit Credit Stock Valuation $ 0.00 $ 100.00 Cost of Goods Sold $ 100.00 $ 0.00 ## PO line price diff #### Issue While generating accrual entries for a PO with billed not received, if the billed price is different than the PO line price, no entries were generated for the price diff account. #### How to reproduce 1. Create a product using "Standard Price" as its costing method and set a cost for this product and set a price difference account (on its product category); 2. Create a purchase order for this product and confirm it; 3. Create an invoice for this PO with a different price for the product; 4. Go to Accounting > Review > Billed Not Received; 5. Select the PO and click on "Create Accrual Entries" button => Accrued entries are created but no entries are created for the price difference. #### Expected behavior Two more entries must be created: one for the price diff account and one for the stock valuation account. [1]: https://github.com/odoo/odoo/pull/231510 task-[5349657](https://www.odoo.com/odoo/966/tasks/5349657) Forward-Port-Of: odoo/odoo#234600
This update enhances how Odoo extracts amounts from bank statements (like CODA files). It now supports bank statements that represent amounts in cents without decimal separators, allowing for more accurate reconciliation. Users can now use specific regex patterns to ensure correct decimal amount extraction.
Original PR description
Update the reconciliation logic of reco models to support regex patterns using named capture groups 'integer' and 'fraction'. This is specifically designed for cases where bank statement labels (like CODA files) provide amounts in cents i.e continuous string of digits without a decimal separator. The logic now: - Prioritizes 'integer' and 'fraction' named groups if present in the match. - Concatenates these groups with a decimal point to form a valid float. - Falls back to the standard digit extraction logic if named groups are not found. So now if user wants the amount to be extracted in decimal values from label then user needs to add regex which supports two groups 'integer' and 'fraction'. Community PR: odoo/odoo#242750 Task [link](https://www.odoo.com/odoo/project.task/5449413) Task-5449413 Forward-Port-Of: odoo/enterprise#103630
This update corrects a bug where refund transactions were incorrectly marked as cancelled in the Payment Authorize module. The change ensures that voided refund transactions are now properly marked as 'confirmed' after the refund process is complete, improving the accuracy of payment records. This resolves an issue impacting refund processing reliability.
Original PR description
Versions: --- 19.0+ Issue: --- Refund transactions are cancelled once refund is completed for non-settled payments. Steps to reproduce: --- 1- Configure `payment_authorize`. 2- Create a payment, and pay using authorize. 3- Refund the payment. Outcome: The refund transaction is initiated and then cancelled once the refund is completed. Cause: --- After #209685, the `tx._refund` method is introduced, which is creating a new transaction, and the provider-specific logic is left for `_send_refund_request` hook. Before that, the tx creation was done in `_send_refund_request`, which in `payment_authorize`'s override, no transaction was created if the payment wasn't settled by the provider yet. Therefore, voided transaction meant setting tx.status as cancelled. Fix: --- Now that we are creating tx for all refund tx regardless of payment settlement, we should set status of refund voided tx as confirmed. opw-5904548 Forward-Port-Of: odoo/odoo#249434
This update makes it easier to use the 💯 emoji within Odoo by adding a new shortcode (:100:). The emoji picker's empty state message has also been updated for clarity. This improves the user experience when sending messages with the 💯 emoji.
Original PR description
Purpose of this PR: Before this PR, the 💯 emoji could only be found using the`:hundred_points:` shortcode, which is less commonly used. This PR adds the `:100:` shortcode to improve discoverability. Additionally, the empty-state helper text in the emoji picker is adjusted from `"No emoji matches your search"` to `"No emojis match your search"` for better wording. task-5873748 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248654
This update fixes an issue where invoices weren't correctly using product category accounts. Now, Odoo automatically checks the entire category hierarchy (parent to child) to find an available account, ensuring invoices accurately reflect the intended income or expense classification. This improves financial reporting accuracy.
Original PR description
**Steps to reproduce:** * Install the **Accounting** module. * Create a product category hierarchy (grandparent → parent → child). * Set an **income account** on the grandparent category. * Set an…
**Steps to reproduce:** * Install the **Accounting** module. * Create a product category hierarchy (grandparent → parent → child). * Set an **income account** on the grandparent category. * Set an **expense account** on the child category. * Leave the parent category without any accounts. * Create a product assigned to the child category. * Create a customer invoice using this product. **Observed behavior:** * The invoice line uses the **default income account** from settings instead of the grandparent category’s income account. * The category hierarchy is not checked to retrieve parent accounts. **Expected behavior:** * If no account is defined on a category, Odoo should traverse the **parent categories** to find one. * Only if no account exists in the hierarchy should it fall back to journal or default accounts. **Cause:** * Account lookup only checked the **immediate category**. * Parent categories were not considered. **Fix:** * Traverse the product category hierarchy when searching for accounts. * Use the first account found in the parent chain. opw-5869592 Forward-Port-Of: odoo/odoo#249909 Forward-Port-Of: odoo/odoo#248389
This update resolves an issue where borders were missing from mention elements in the email system. The problem stemmed from an unnecessary 'inline-block' property being applied to the mention links. This change ensures that mentions are visually consistent and correctly framed, improving the overall user experience.
Original PR description
Backport of https://github.com/odoo/odoo/pull/248999 Before this PR, the border from the mention element was missing at the top and bottom. This is caused by the inline-block property. `<a>` is already an inline element and doesn't need this property. Task-5867464 (point 68) Before / After <img width="272" height="63" alt="Screenshot 2026-02-20 at 14 38 24" src="https://github.com/user-attachments/assets/c5c3ffe2-d8a7-4405-9e69-59f4e6e05a77" /> <img width="268" height="57" alt="Screenshot 2026-02-20 at 14 38 36" src="https://github.com/user-attachments/assets/29cf6777-b84a-46c4-b78a-4950865e1ef0" /> Forward-Port-Of: odoo/odoo#249811
This update resolves a visual issue in the messaging menu where hovering over muted notifications would cause a horizontal scrollbar to appear. The fix ensures the 'Mark as Read' button's spacing adjusts correctly, regardless of whether the unread counter is visible, improving the user experience.
Original PR description
**Purpose of this PR:** Hovering over a muted notification in the messaging menu caused a horizontal scrollbar because the `'Mark as Read'` button retained a margin that overflowed the container when the unread counter was hidden. This commit makes the margin conditional on the counter's presence, preventing the layout overflow. task-[5904526](https://www.odoo.com/odoo/project.task/5904526) **Before/After:**   Forward-Port-Of: odoo/odoo#247320
This update ensures internal users viewing message links within slides are consistently directed to the backend form view, aligning with other portal documents. Previously, internal users were incorrectly redirected to the website page. This change maintains a consistent user experience across all user types.
Original PR description
Since #202555, a message link in slides redirects internal users to the website page if it's published. To ensure consistency with other documents in the portal, this commit redirects internal users to the backend form view of the slides. Portal and public users continue to be redirected to the published website page. Forward-Port-Of: odoo/odoo#249720
2 changes
Resolved issues and error corrections
This update resolves a validation error occurring during invoice tax calculation with the Avatax service. The issue stemmed from incorrect tax data being sent, leading to calculation discrepancies. This fix ensures accurate tax calculations for BR localization invoices.
Original PR description
Steps to reproduce: - Set up a Company with BR localization - Create a product as follows: - [General Information] Product Type: Service - [Sales] LC116 Code: 14.01 - [Sales] Purpose of Use: Not applicable - [Sales] Service Code Origin: 14.01.3/168061/1524 - [Sales] Service Codes: 14.01.3/168061/1524 - Create an Invoice with Document Type "Electronic Service Invoice - NFS-e" - Add the product on the line - Compute taxes - Compute taxes again Issue: Action will be blocked by a validation error resulting from the external taxes call ``` odoo.exceptions.ValidationError: Odoo could not fetch the taxes related to Draft Invoice. Errors: Rejection: Total Installments doesnt match Total Lines ∑ installments[m]grossValue - ∑ (lines[n].lineAmount-line[n].lineTaxedDiscount) <> 0 ``` It occurs because during the call the system is considering the existing taxes on the line and it will send to the avatax service wrong amounts opw-5412456 opw-5409735
This update corrects a bug where OCR processing was incorrectly triggered on split expenses, leading to increased IAP credit usage and potential unexpected costs for users. The fix ensures OCR is only applied to the original expense document, particularly important when automatic digitization is enabled.
Original PR description
OCR should only be performed on the original document. Enabling it on splits leads to redundant OCR requests and unnecessary IAP credit consumption. This is particularly important when automatic digitization is enabled, as it triggers a paid request for every split generated, leading to unexpected costs for the user. The same bug was fixed in version 19.0 and up (commit 0688575), but it couldn't be backported as the `split_expense_origin_id` field doesn't exist in version 18.0. opw-[5930791](https://www.odoo.com/odoo/project/2068/tasks/5930791) Forward-Port-Of: odoo/enterprise#107992 Forward-Port-Of: odoo/enterprise#107789
2 changes
Resolved issues and error corrections
This update resolves an issue where automatic digitization of split expenses in Odoo Enterprise triggered redundant and costly OCR requests. This was impacting users' IAP credit consumption, particularly when automatic digitization was enabled. The fix ensures OCR is only performed on the original expense document.
Original PR description
OCR should only be performed on the original document. Enabling it on splits leads to redundant OCR requests and unnecessary IAP credit consumption. This is particularly important when automatic digitization is enabled, as it triggers a paid request for every split generated, leading to unexpected costs for the user. The same bug was fixed in version 19.0 and up (commit 0688575), but it couldn't be backported as the `split_expense_origin_id` field doesn't exist in version 18.0. opw-[5930791](https://www.odoo.com/odoo/project/2068/tasks/5930791) Forward-Port-Of: odoo/enterprise#107992 Forward-Port-Of: odoo/enterprise#107789
This update fixes an issue where invoices weren't correctly using product category accounts. Now, Odoo automatically checks the entire category hierarchy (parent to child) to find an available account, ensuring invoices accurately reflect the intended income or expense. This improves financial reporting accuracy.
Original PR description
**Steps to reproduce:** * Install the **Accounting** module. * Create a product category hierarchy (grandparent → parent → child). * Set an **income account** on the grandparent category. * Set an…
**Steps to reproduce:** * Install the **Accounting** module. * Create a product category hierarchy (grandparent → parent → child). * Set an **income account** on the grandparent category. * Set an **expense account** on the child category. * Leave the parent category without any accounts. * Create a product assigned to the child category. * Create a customer invoice using this product. **Observed behavior:** * The invoice line uses the **default income account** from settings instead of the grandparent category’s income account. * The category hierarchy is not checked to retrieve parent accounts. **Expected behavior:** * If no account is defined on a category, Odoo should traverse the **parent categories** to find one. * Only if no account exists in the hierarchy should it fall back to journal or default accounts. **Cause:** * Account lookup only checked the **immediate category**. * Parent categories were not considered. **Fix:** * Traverse the product category hierarchy when searching for accounts. * Use the first account found in the parent chain. opw-5869592 Forward-Port-Of: odoo/odoo#249909 Forward-Port-Of: odoo/odoo#248389
1 change
Resolved issues and error corrections
This update resolves a technical issue preventing accurate scale readings for IoT devices. The fix corrects a problem where the system was receiving incorrect data, leading to scale readings of '0'. This ensures correct certification data is generated for our EU IoT customers.
Original PR description
This PR fixes the lack of compatibility with the new event manager code sending result instead of value, fixing the weighing stuck at 0 in some situations Forward-Port-Of: odoo/enterprise#107974
4 changes
Resolved issues and error corrections
This update resolves a problem where test data for the Stripe expense reporting module wasn't correctly applied. The fix ensures that tests run successfully by utilizing a dedicated demo company data set. This prevents test failures and maintains the stability of the expense reporting functionality.
Original PR description
When adding the tests, the changes in d15faf0 were not taken into account. The tests wouldn't fail as the `hr_expense_stripe_demo` module would contain the necessary data runbot-241008
This update ensures that 'pay later' payment lines are correctly created when settling invoices through the fast payment option in Point of Sale. Previously, this line was missing, causing discrepancies in order totals. The fix moves the necessary validation code to ensure consistent payment line generation regardless of the payment flow.
Original PR description
Steps to reproduce ------------------ 1. Install `pos_settle_due` 2. Enable "One-Click Payment" from the configs, and make sure it has some valid payment methods (Cash, Card, etc). 3. Open PoS, and…
Steps to reproduce ------------------ 1. Install `pos_settle_due` 2. Enable "One-Click Payment" from the configs, and make sure it has some valid payment methods (Cash, Card, etc). 3. Open PoS, and click "Settle Invoices" for a client having a "Total Due" > 0 4. Select the invoice(s) 5. Fast settle the invoice by directly paying on the product screen, using one of the fast payment methods on the bottom. -> The order is payed, however, it only has the fast payment line, while it should also have an additional equivalent "pay later" line, with a negative amount, balancing the amount payed with the fast payment method. Why the issue ------------- If we settled this invoice from the payment page, this issue does not happen, i.e. an equivalent "pay later" payment line is created. That additional "pay later" line is created when calling the `validateOrder` method on the `payment_screen`, which in `pos_settle_due`, is overriden to also add the "pay later" payment lines under certain conditions. After introducing the "One-Click Payment" feature in #216523, we needed to be able to validate the order in two different places: 1. On the payment screen, that was already taken care of, by the method `validateOrder` mentioned just above, that is normal validation. 2. On the products screen, when using fast payment, that is fast validation. For that reason, the validation code has been moved from the payment screen to the class `OrderPaymentValidation` which will be used by the two flow: the normal validation and the fast validation. However, we have forgot to move the `pos_settle_due` specific validation code from payment_screen to the new `OrderPaymentValidation`, hence, the `pos_settle_due` validation that creates the "pay later" PL is only executed from the payment_screen, never from fast validation. The fix ------- Now, we move the `pos_settle_due` validation code from `payment_screen` to an override of `OrderPaymentValidation` so it's executed when for both normal and fast validation. Notes ----- - We keep the methods in `payment_screen` for backward compatibility, they will be removed in master. - We replace the usage of `props.isDepositOrder` in the `payment_screen` with `order.is_settling_account`, as they will have both the same value, but `order.is_settling_account` is available on the order, so it can be used for both normal and fast flows, while `props.isDepositOrder` was only available in the payment screen during normal valuation. On master, we can remove the prop `isDepositOrder` in favor of `order.is_settling_account === true`. opw-5488587
This update corrects a previous error where Odoo incorrectly defaulted to USD for Stripe currency settings, particularly for European companies. Switching to EUR as the default resolves a potential blocking issue for EU businesses and ensures accurate Stripe account configuration. This change improves reliability and prevents disruptions for our European users.
Original PR description
Right now, we need to guess the correct stripe currency for the stripe account depending on the country, we used the USD as an ultimate fallback But, the USD currency is easy to guess, where the EUR is way harder (it may not be the company currency). So, it is too error-prone to set the USD as the default fallback, and it can lead to EU companies being blocked as their stripe currency is the wrong one. We therefore switch it to EUR. opw-5393508 opw-5913327 opw-5953025
This update corrects a minor oversight in the system's invoice matching tolerance settings. Previously, a hardcoded tolerance value wasn't updated correctly, leading to potential inaccuracies in bank statement reconciliation. This fix ensures more reliable matching of financial data.
Original PR description
During this commit:https://github.com/odoo/enterprise/commit/15d26e62f14bb0224712a1712b47ebe16c3b8702 we forgot to change one part of the hardcoded tolerance. task-5952881 Forward-Port-Of: odoo/enterprise#108112
5 changes
Resolved issues and error corrections
This update fixes an issue where international UPS deliveries were generating commercial invoices with zero freight charges. The fix ensures that freight costs are accurately reflected on the invoice, complying with customs requirements and preventing potential delays or discrepancies. This ensures accurate customs documentation for international shipments.
Original PR description
Issue ----- For international deliveries, the commercial invoice used for customs does not include the freight charges (it is set to 0). Steps to reproduce ----- - Create an international UPS sale - Confirm the delivery - Open the "UPSCommercialInvoice.pdf" file > In the price breakdown, freight is set to 0.0 Cause ----- It has to be specified in the `ship` request as `ShipmentServiceOptions.InternationalForms.FreightCharges.MonetaryValue` (source https://docs.rocketshipit.com/rs/docs/ups-api-parameters.html#shipment) Expected result ----- <img width="1912" height="963" alt="image" src="https://github.com/user-attachments/assets/170e49f7-6575-4524-b186-3829f4c20430" /> ----- Ticket: opw-5135494
This fix resolves an issue where changing the description of a stock move during a picking process created duplicate stock valuation lines, leading to incorrect value calculations. The update ensures that stock valuations are correctly calculated when multiple moves exist for the same product within a single picking, preventing inflated inventory values.
Original PR description
**Steps to reproduce:** - create a storable avco automated product - in the purchase tab, select control policy : "on invoice quantitites" - create and confirm a purchase order for 100 qty at 1 unit…
**Steps to reproduce:** - create a storable avco automated product - in the purchase tab, select control policy : "on invoice quantitites" - create and confirm a purchase order for 100 qty at 1 unit price - on the picking, unhide the description column - change the description for the move - go back to the purchase order and change the quantity to 105 - (because we changed the description, the new move created with a quantity of 5 is not merged to the existing one of 100 and we now have two moves on the picking) - create and confirm the bill - validate the picking - select the valuation smart button **Current behavior:** the svl with a quantity of 100 has a total value of 105 the svl with a quantity of 5 has a total value of 105 **Expected behavior:** the svl with a quantity of 100 should have a value of 100 the svl with a quanitty of 5 shoul have a total value of 5 **Cause of the issue:** When the picking is validated, action_done is created on the two moves. In the stock_account override: - first the super method is called As a consequence the state of the two moves becomes 'done' and the qty_received of the linked purchase order line becomes 105. - then product_price_update_before_done is called on the two moves before creating the svls. https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/stock_account/models/stock_move.py#L352 Inside product_price_update_before_done, for each move, we call _get_price_unit. https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/stock_account/models/stock_move.py#L426 For the first move, in the purchase_stock override of _get_price_unit : - to get the received qty we call _get_qty_received_without_self() https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/purchase_stock/models/stock_move.py#L50 and because the super method of action_done was already called, qty_received of the purchase order line is 105, so _get_qty_received_without_self will return 5. https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/purchase_stock/models/stock_move.py#L108-L113 So received_qty is 5 and later remaining_qty will be 100 https://github.com/odoo/odoo/blob/dc57ea4d306f8745d37f2c5d2c3d3fa4bcaf7253/addons/purchase_stock/models/stock_move.py#L86 - but because no svl was created yet receipt_value will stay 0 and later remaining_value will be 105 https://github.com/odoo/odoo/blob/dc57ea4d306f8745d37f2c5d2c3d3fa4bcaf7253/addons/purchase_stock/models/stock_move.py#L55-L60 Therefore price_unit will be 1.05 (105/100) instead of 1 https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/purchase_stock/models/stock_move.py#L95 For the second move, the problem is the same and the price unit ends up being 21 (105/5) **fix** We do not take into account the move(s) for the same product of the same picking in the remaining value (because svls are not created yet) so we should not take them into account in the remaining quantity. the problem is very similar to https://github.com/odoo/odoo/pull/235601 In this other PR it happend because we had multiple move for the same product because they were in a batch, and in this PR we have the issue because we have multiple move for the same product because they didn't merge due to the description difference. opw-5429501
This update ensures taxes are automatically calculated for charge and discount lines within the UrbanPiper POS system, even when tax data isn't directly provided by UrbanPiper. Previously, taxes weren't applied if UrbanPiper didn't send tax information, now it defaults to using standard product tax calculations, ensuring accurate tax reporting.
Original PR description
Before this commit: --- - If UrbanPiper did not send tax data for charge and discount lines, taxes were not applied. - Tax data was only provided by UrbanPiper for the India region. After this commit: --- - When the payload does not include tax data, compute taxes for charge and discount lines using the product tax, the same way as for normal order lines. task-5895987
This update fixes an issue where Peppol invoices weren't correctly processed if the specific module wasn't installed. The import logic for self-billing invoices has been moved to the main `account_peppol` module, ensuring consistent handling of all Peppol invoices regardless of module installation. This improves the accuracy of invoice processing and reduces potential errors.
Original PR description
At the moment, the Peppol AP accepts incoming self-billing invoices for all 18.0 users, but if the `account_peppol_selfbilling` module is not installed on the database, incoming self-billing invoices are not decoded correctly, and end up as as vendor bills rather than sales documents. This is because the import logic for self-billing invoices is in `account_peppol_selfbilling` at the moment. To solve this issue, we move the import logic to `account_peppol`, as well as related tests. task-none
This update fixes a potential issue where VIES validation errors caused errors in Odoo, specifically impacting OCR invoice processing. By catching a broader range of exceptions from the VIES service, the system now handles invalid XML responses gracefully, preventing disruptions and improving data accuracy.
Original PR description
Catch all `zeep` exceptions instead of only `zeep.Fault`. On 14th of February 2026, the VIES service wasn't working properly, they were returning invalid XML in their response. This caused the `check_vies` call to raise a `zeep.XMLSyntaxError` which wasn't caught, causing a traceback every time VIES was used to validate a VAT number. opw-5938723 (OCR couldn't be refreshed on an invoice because it tried to create a partner from its VAT number and it couldn't be checked with VIES). Forward-Port-Of: odoo/odoo#249853
6 changes
Resolved issues and error corrections
This update allows branch companies to see and select contacts owned by their parent company when creating invoices or vendor bills. Previously, a branch company could only see contacts owned by itself or those without a company assigned. This change resolves a limitation in the multi-company hierarchy functionality.
Original PR description
Currently, when operating in a branch company, contacts belonging to the parent company are not visible in the partner dropdown on Invoices or Vendor Bills. ### **Steps to reproduce:** 1) Create a…
Currently, when operating in a branch company, contacts belonging to the parent company are not visible in the partner dropdown on Invoices or Vendor Bills.
### **Steps to reproduce:**
1) Create a multi-company hierarchy (Company A -> Branch B).
2) Create a contact owned by Company A.
3) Switch the current company to Branch B.
4) Go to Accounting > Customers > Invoices and create a new invoice.
5) Try to select the contact created in step 2.
### **Current/Buggy Behavior:**
The contact does not appear in the search results.
### **Expected Behavior:**
The contact should be selectable.
### **Root Cause:**
since commit https://github.com/odoo/odoo/commit/67169c42061cb51bc68f6c74f0674a670dd04f58,
the partner model supports the standard
`check_company=True` mechanism, and record rules were updated to allow
branches to access partners of their parent company.
However, the `partner_id` field on the `account.move` form view still
retained a explicit domain: `[('company_id', 'in', (False,
company_id))]` as shown at [1].
This domain overrides the standard `check_company` behavior.
due to which it restricts the selection to partners owned by the current company
(the branch) or partners with no company set. It explicitly excludes
partners owned by the parent company.
### **Fix:**
Remove the domain at [1],
This allows the field to rely on the standard `check_company=True`
logic, which correctly handles the multi-company hierarchy and allows
branches to select parent company partners.
[1]- https://github.com/odoo/odoo/blob/6b7b83449739932aa8420ef8fcd888116e3c0f8a/addons/account/views/account_move_views.xml#L896
**opw-5484611**This update corrects a bug where the carousel image navigation wasn't functioning correctly in RTL (Right-to-Left) languages like Arabic. By adding a specific HTML attribute, the carousel now correctly displays the next and previous images based on the language direction, ensuring a consistent user experience across different languages.
Original PR description
Some libraries expect to find the language direction on the HTML element (e.g. Bootstrap). As we didn't set it, there were some issues. For instance on the website: - set the website language to some RTL language (e.g. Arabic) - drop an image gallery snippet and save - navigate with the keyboard to the carousel and start using the arrows to switch images => Pressing left should show the _next_ image, and pressing right should show the _previous_ image (contrary to LTR languages). This is illustrated by the image indicators at the bottom of the carousel (the 1st image is on the right, the last image on the left). But without `dir="rtl"` on the HTML element, the arrows keep their LTR behavior: pressing left goes to the previous image, and right to the next image. task-5109547
This update ensures that NACHA payment files accurately reflect the actual account holder's name, rather than the customer's name in Odoo. Prioritizing the bank account holder's name improves payment processing accuracy and compliance with NACHA standards.
Original PR description
The NACHA entry detail was using the partner's name (res.partner.name) for the Individual Name field. This should instead prioritize the Account Holder Name (acc_holder_name) from the bank account, as this reflects the actual name on the bank account which may differ from the partner's name in Odoo. The code now uses bank.acc_holder_name if set, and falls back to payment.partner_id.name if not set.
This update resolves an issue where users received a generic error message when attempting to print resumes with invalid templates. The fix adds detailed tracebacks to the error message, providing developers with the necessary context to quickly identify and resolve template problems. This improves the user experience and streamlines troubleshooting.
Original PR description
Currently, when a user tries to print a resume with an invalid template there’s no traceback to show what went wrong. **Steps to produce:** * Install `hr` with demo data * Modify the view…
Currently, when a user tries to print a resume with an invalid template there’s no traceback to show what went wrong. **Steps to produce:** * Install `hr` with demo data * Modify the view `report_employee_cv` by adding `<div t-if=o.no/>` * Print resume of any employee **Observed Behavior:** Currently it only shows the error in [1], with no context or traceback to explain what went wrong. **Root cause:** * This happens because the route doesn’t include the website parameter. Without it, the system treats the route as non–front end [2], so the error handler never reaches [3].That means [4] never loads the templates [5], and the browser just gets a plain response at [6]. **Solution:** * Catching and raising UserError shows appropriate traceback. **Before:** <img width="1606" height="796" alt="image" src="https://github.com/user-attachments/assets/d5432fbf-d016-46a9-bade-8e8408848c66" /> **After:** <img width="1832" height="928" alt="image" src="https://github.com/user-attachments/assets/6f0413ca-a82a-487d-888f-81be6f0fab03" /> [1]: https://drive.google.com/file/d/1qJLkFGw4bEclqKihdUI-4bjJofdFArEc/view?usp=sharing [2]: https://github.com/odoo/odoo/blob/e4e2dca73213c33c487033dd404a7ca335960a66/addons/http_routing/models/ir_http.py#L386 [3]: https://github.com/odoo/odoo/blob/e4e2dca73213c33c487033dd404a7ca335960a66/addons/http_routing/models/ir_http.py#L611 [4]: https://github.com/odoo/odoo/blob/e4e2dca73213c33c487033dd404a7ca335960a66/addons/http_routing/models/ir_http.py#L573-L576 [5]: https://github.com/odoo/odoo/blob/e4e2dca73213c33c487033dd404a7ca335960a66/addons/http_routing/views/http_routing_template.xml#L139 [6]: https://github.com/odoo/odoo/blob/e4e2dca73213c33c487033dd404a7ca335960a66/addons/http_routing/models/ir_http.py#L575 Related: https://github.com/odoo/enterprise/pull/100142 opw-5167898
This update fixes a problem where users received a generic error message when generating PDF payroll reports with invalid templates. Now, the system displays a detailed traceback, making it easier to identify and resolve the underlying template issues. This improves the user experience and streamlines troubleshooting.
Original PR description
Currently, when a user tries to print a PDF report with an invalid document layout template, there’s no traceback to show what went wrong. **Steps to produce:** * Install payroll with demo data. *…
Currently, when a user tries to print a PDF report with an invalid document layout template, there’s no traceback to show what went wrong. **Steps to produce:** * Install payroll with demo data. * Settings > Configure Document Layout then Edit Layout * Add non-existent field `<div t-if='o.no'/>` * Payroll > All payslips > print any payslip **Observed Behavior:** * Currently it only shows the error in [1], with no context or traceback to explain what went wrong. **Root cause:** * This happens because the route doesn’t include the website parameter. Without it, the system treats the route as non–front end [2], so the error handler never reaches [3].That means [4] never loads the templates [5], and the browser just gets a plain response at [6]. **Solution:** * Catching and raising UserError shows appropriate traceback. **Before:** <img width="1601" height="507" alt="image" src="https://github.com/user-attachments/assets/f7f208f0-cdd7-410e-87e7-32a9651df9d8" /> **After:** <img width="1847" height="928" alt="image" src="https://github.com/user-attachments/assets/c73522d6-2632-422b-b1d1-234e6c61ed2e" /> [1]: https://drive.google.com/file/d/1qJLkFGw4bEclqKihdUI-4bjJofdFArEc/view?usp=sharing [2]: https://github.com/odoo/odoo/blob/e4e2dca73213c33c487033dd404a7ca335960a66/addons/http_routing/models/ir_http.py#L386 [3]: https://github.com/odoo/odoo/blob/e4e2dca73213c33c487033dd404a7ca335960a66/addons/http_routing/models/ir_http.py#L611 [4]: https://github.com/odoo/odoo/blob/e4e2dca73213c33c487033dd404a7ca335960a66/addons/http_routing/models/ir_http.py#L573-L576 [5]: https://github.com/odoo/odoo/blob/e4e2dca73213c33c487033dd404a7ca335960a66/addons/http_routing/views/http_routing_template.xml#L139 [6]: https://github.com/odoo/odoo/blob/e4e2dca73213c33c487033dd404a7ca335960a66/addons/http_routing/models/ir_http.py#L575 Related:https://github.com/odoo/odoo/pull/237262 opw-5167898
This update fixes an issue where the names of Ecuadorian localization regimes didn't comply with government regulations. The change ensures all names are in Spanish, as required for electronic invoices submitted to the government, regardless of the user's language settings. This ensures accurate and compliant invoicing for Ecuadorian businesses.
Original PR description
[FIX] l10n_ec_edi: fiscal localizations name The name of the regimes for the Ecuadorian localization does not respect the government requirements Steps to reproduce: 1. Install l10n_ec_edi module 2. Go to Settings > Invoicing > Ecuadorian Localization 3. In Electronic Invoicing > Regime, the names of the regimes do not respect government requirements Solution: Change the name of the fiscal localizations to respect the requirements Add a computed field used to map the name of the regime to the technical name of the regime used in SRI documents We write them in Spanish because we always want the name of the regime to be in Spanish in the XML invoice sent to the government, even if the user didn't install any other language. opw-5221871