Daily updates from Odoo
Wednesday, February 18, 2026
150 changes
34 changes
Resolved issues and error corrections
This update corrects a visual issue in the sign application where the header overlapped due to a red color bar. The fix removed a specific styling tag, resolving the overlap and ensuring a clean, professional appearance for users completing the signing process. This improves the user experience and brand consistency.
Original PR description
Remove `top` tag to prevent header overlap due to neutralize red color bar Before fix: <img width="1953" height="790" alt="image" src="https://github.com/user-attachments/assets/dd9f7a00-eaea-4304-a22d-d8df96203823" /> After fix: <img width="1892" height="639" alt="image" src="https://github.com/user-attachments/assets/247e6067-570a-4fcb-a0e9-6f2640940f21" /> opw-5900244 Forward-Port-Of: odoo/enterprise#106844
This update adjusts the width of the 'Review' button on the ticket screen in the Point of Sale module. Previously, when an order was paid, the button was unusually narrow. Now, it expands to take up the full screen width, providing a clearer and more usable experience for users.
Original PR description
Before this commit: --- - On the ticket screen in small UI, two btns are shown: Review and Load Order. - The Load Order button is only visible when the selected order is not paid. - When the order is paid, only the Review btn is shown, but it takes 50% width. After this commit: --- - When the order is paid, the Review button expands to take 100% width. task-5892189 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246743
This update resolves an issue where document previews weren't appearing in the chatter after editing activities and attaching new documents. The fix, originally developed for a related framework component, has now been fully implemented within the Mail module, ensuring accurate document previews are displayed.
Original PR description
Description: Previously, when editing an existing activity and attaching new documents from the user’s device, the edits were saved correctly, but the document previews were not displayed in the chatter. This issue had already been addressed by the framework editor team; however, their fix was not applied to the Mail module. In this PR, we apply the existing framework fix to the Mail module to restore document preview functionality. related PR: https://github.com/odoo/odoo/pull/240114 task-5423808 Forward-Port-Of: odoo/odoo#243805
This update corrects a bug where applicants were seeing job postings from different companies within the recruitment process. The system now ensures that job listings displayed are only those belonging to the applicant's company, improving the accuracy and usability of the application search. This change enhances the applicant experience and reduces potential confusion.
Original PR description
[FIX] hr_recruitment: prevent showing jobs from different company than applicant belongs Bug production steps: Select My Belgium Company -> Recruitment -> Applications -> All applications -> Create new application -> In the job position field, many jobs can be seen that are belong to other companies from applicant company Bug cause: In the previous domain for job_ids, it should be either False (can belongs to many companies) or should be the company that our applicant belongs to. Bug solution: Convert the domain such that it only lists the jobs that the job company and applicant company are same. Also, company_id field made visible when >= 2 companies are selected in the environment. task - 5498859 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#244072
This update corrects a bug where duplicate activities were created on purchase orders when a sale order was cancelled, specifically within the dropshipping feature. The fix ensures that the correct template is only triggered when a purchase order originates from a sale order for a product, preventing unnecessary activity and streamlining the process.
Original PR description
**Steps to Reproduce** * Install `sale_management`, `purchase`, and `stock` with demo data. * In Inventory → Settings, enable `Dropshipping`. * Create a product: * Set a vendor under the Purchase…
**Steps to Reproduce**
* Install `sale_management`, `purchase`, and `stock` with demo data.
* In Inventory → Settings, enable `Dropshipping`.
* Create a product:
* Set a vendor under the Purchase tab.
* Set routes to `Dropshipping` and `Buy`
* Create and confirm a sale order for this product.
* Confirm the generated purchase order.
* Cancel the originating sale order.
* Go back to the linked purchase order.
**Observed behavior**
* Two activities are created on the purchase order when the sale order is cancelled.
**Cause**
* Both templates — `exception_on_so` (from sale_stock) and
`exception_purchase_on_sale_cancellation` (from sale_purchase)
are triggered during sale order cancellation.
* Each module overrides `_action_cancel` and triggers its corresponding exception template.
* When both modules are installed, both templates run.
https://github.com/odoo/odoo/blob/98da30375a5ae50a77d848b838781aa7247bd362/addons/sale_purchase/models/sale_order.py#L26-L32
https://github.com/odoo/odoo/blob/98da30375a5ae50a77d848b838781aa7247bd362/addons/sale_stock/models/sale_order.py#L206-L208
* The template `exception_purchase_on_sale_cancellation` should only be triggered
when the PO originates from an SO and the product is a service, but
the domain lacks the required product-type condition.
**Fix**
* Add the missing condition to ensure that `exception_purchase_on_sale_cancellation`
is not triggered for dropshipped products, preventing duplicate activities.
---
`NOTE` - This issue is resolved from version 19.0 in this [commit](https://github.com/odoo/odoo/pull/212679/changes/ede2898278220a3ba4d8910ef268fe59f1587c72)
---
opw-5153488
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#239569A recent test report for MRP production planning was failing because the administrator user lacked the necessary permissions to select product variants. This update adds the required user rights, allowing the test to pass and ensuring accurate reporting of product variants within the test environment.
Original PR description
The _/mrp:TestReportBom.test_mrp_report_bom_variant_selection_ test was failling because administrator user couldn't use the product variants. The needed dropdown menu to switch variant wasn't displayed and the test failed. We add the "product.group_product_variant" rights to the user. Runbot error: 238917 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248634
This update fixes a potential issue where abrupt system clock changes could disrupt IoT driver jobs, leading to delays and errors. The system now automatically detects and adjusts schedules to prevent misfires, ensuring consistent operation of custom IoT handlers. This enhances the reliability of the IoT system.
Original PR description
Before this commit: If IoT system clock is wrongly set (happened on a Wi-Fi environment with slow connection). The system clock will abruptly change for a date in the future which will trigger all…
Before this commit:
If IoT system clock is wrongly set (happened on a Wi-Fi environment with slow connection). The system clock will abruptly change for a date in the future which will trigger all `schedule` jobs (which will think they are several days late).
In addition to this oversight, on an IoT on which "custom IoT handlers" configuration is enabled, if the `upgrade.check_git_branch` job is called on IoT boot, it will trigger the following traceback:
```py
2026-02-17 13:53:41,751 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: Exception in thread Thread-4:
2026-02-17 13:53:41,757 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: Traceback (most recent call last):
2026-02-17 13:53:41,758 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: File "/usr/lib/python3.13/threading.py", line 1043, in _bootstrap_inner
self.run()
~~~~~~~~^^
2026-02-17 13:53:41,759 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: File "/home/pi/odoo/addons/iot_drivers/tools/helpers.py", line 50, in run
service.server.restart()
~~~~~~~~~~~~~~~~~~~~~~^^
2026-02-17 13:53:41,759 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: File "/home/pi/odoo/odoo/service/server.py", line 1622, in restart
os.kill(server.pid, signal.SIGHUP)
^^^^^^^^^^
2026-02-17 13:53:41,759 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: AttributeError: 'NoneType' object has no attribute 'pid'
```
Which will prevent the IoT to restart thus to load custom handlers
After this commit:
Brutal time changes (of 10 minutes (in a 3-second loop)) are detected, and jobs schedules are updated to prevent misfire callsThis update resolves an issue where the 'Mark as Paid' button was hidden for users in Mexico when the l10n_mx_hr_payroll_account module was installed. This change ensures the standard payment flow is clear and functional for Mexican users, improving their experience.
Original PR description
The "Mark as Paid" (action_payslip_paid) button on the hr.payslip form view [is hidden](https://github.com/odoo/enterprise/blob/19.0/hr_payroll_account/views/hr_payslip_views.xml#L39) when the l10n_mx_hr_payroll_account module is installed, making the standard payment flow confusing for users in Mexico. target: 19.0 task-5434674 Forward-Port-Of: odoo/enterprise#104390
This update corrects a rare display problem in Firefox where adding text to a link would create duplicate buttons. The fix resets Firefox's internal selection state, preventing this duplication and ensuring links display correctly. This improves the overall user experience for Firefox users.
Original PR description
In some situations Firefox behaves strangely when adding a character add the end of a button, by duplicating the button element without children and inserting the text between both buttons. It seems Firefox maintains an internal selection state that is corrupted after some operations. This commit resets the collapsed selection inside links in order to reset this internal state in Firefox. Steps to reproduce: - Insert a link - Put some text after the link - Delete the first character from the text - Keep deleting until the last character from the button is deleted - Type a character => The button was duplicated and the text was inserted between both buttons. - Note that if you undo/redo, then typing a character did work fine task-5033890 Forward-Port-Of: odoo/odoo#248703 Forward-Port-Of: odoo/odoo#241895
This update fixes a bug where customers could still redeem expired ewallet points. The change ensures that ewallet points are no longer available for claiming after their expiration date, improving the accuracy of point balances and preventing potential revenue loss. This resolves issue OPW-5476686.
Original PR description
### Issue: Due to this issue, ewallet points are claimable after expiry. #### Steps to reproduce: 1- Create a ewallet program, and generate an ewallet for a partner. 2- Set the expiration date in the past. 3- Create a SO with the same partner. 4- Click on reward. Expected: The ewallet shouldn't be claimable. Current outcome: The ewallet is claimable. opw-5476686 Forward-Port-Of: odoo/odoo#248931 Forward-Port-Of: odoo/odoo#247740
This update fixes a bug preventing embedded videos from showing correctly within shopfloor work order instructions. The issue stemmed from a previous fix being lost during a code refactor, and the original solution has now been reapplied. This ensures that video instructions are displayed as intended, improving visual guidance for shop floor operations.
Original PR description
Issue ----- Embedded videos are not displayed in the shopfloor. Steps to reproduce ----- - Create a BOM with at least one operation - Create an instruction in the work order operation - In the instruction text, add a video link - Create a MO and plan it - Open the work order in shopfloor - Open the instruction > Empty window, no video Cause ----- Fix of 61fdab3 got lost in some refactor, so reapplying the logic. ----- Ticket: opw-5926557 Forward-Port-Of: odoo/enterprise#107538
This update fixes a display issue on the Odoo Sales Portal for mobile devices. The section showing order details was not resizing correctly due to differences in how columns (unit price and taxes) were displayed on smaller screens. This change ensures a consistent and properly formatted view for users accessing the portal on their phones and tablets.
Original PR description
The colspan computation on the SO section is broken on mobile. This is because the unit price column is not rendered < sm viewports, and the taxes column is not rendered < md viewports. Thus we need to adapt the colspan accordingly to these responsive columns. task-5942576 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248871
This update resolves a technical issue preventing users from removing a date filter on the booking Kanban view in the POS system. The fix involved correcting a missing function within the user interface, ensuring the date filter option is now correctly accessible. This improves the overall usability of the booking management feature.
Original PR description
Steps: - Install pos_appointment. - Open a POS session with bookings configured. - Open the Booking tab and click Remove date filter in the header. Issue: - A traceback occurs with `Invalid handler`. Cause: - The Remove date filter button’s onclick handler was not defined. Fix: - Define a valid onclick handler for the Remove date filter button. Task-5902656 Forward-Port-Of: odoo/enterprise#107633 Forward-Port-Of: odoo/enterprise#106684
This update resolves an issue where the "Order Now" button disappeared in the self-order mobile interface after deleting or paying for an order. The fix ensures that order updates are correctly reflected in both the mobile and POS UIs, improving the customer experience and order management.
Original PR description
**Issues:** 1. Order deleted from backend When a self-order is deleted from the backend, the customer self-order UI is not updated, causing the “Order Now” button to be missing. 2. Order sent and…
**Issues:**
1. Order deleted from backend When a self-order is deleted from the backend, the customer self-order UI is not updated, causing the “Order Now” button to be missing.
2. Order sent and paid from POS UI Steps:
- Create a self-order from mobile
- Load the order in the POS UI
- Add additional items (eligible for preparation)
- Proceed to payment and validate
- Click Order in the Send for preparation popup Problem: After order validation, the customer self-order UI is not refreshed and the “Order Now” button does not reappear.
**Fixes:**
- Ensures order deletion triggers notify calls to refresh both POS and self-order UIs
- Synchronize deleted orders with the customer self-order UI
- Fix the case where setting Service at = `Table` and Pay after = `Meal` in a single operation resets Pay after to `each`.
Task-5373116
Related: https://github.com/odoo/enterprise/pull/103052
Forward-Port-Of: odoo/odoo#248844
Forward-Port-Of: odoo/odoo#240523This update ensures that the preparation display in the backend accurately reflects changes when a POS order is cancelled or deleted. Specifically, related preparation orders and data are now correctly removed, preventing outdated information and improving data consistency.
Original PR description
**In this commit:** Ensure the preparation display UI is updated when a POS order is cancelled or deleted from the backend. - On order cancellation, the preparation display is refreshed accordingly. - On order deletion, related preparation orders, lines, and states are removed via notify call. Task-5373116 Related: https://github.com/odoo/odoo/pull/240523 Forward-Port-Of: odoo/enterprise#107522 Forward-Port-Of: odoo/enterprise#103052
This update resolves an issue where tables in Sale Quotations didn't display borders correctly when printed to PDF, specifically in Firefox. The fix ensures consistent border rendering by explicitly setting a border width in the PDF generation process, improving the visual quality of printed documents.
Original PR description
Problem: When adding a table in the Sale Quotation description and printing it, the generated PDF shows no table borders when opened in Firefox. Cause: Some PDF viewers (e.g., Firefox) do not render table borders correctly of a PDF created by `wkhtmltopdf` without an explicit border width. Solution: Explicitly define the border width in the `base_style` of `html_editor` to ensure consistent rendering in generated PDFs. Steps to reproduce: - Create a new Sale Order. - Add a table in the description. - Print the quotation. - Open the generated PDF in Firefox. - Observe that the table appears borderless. opw-5857255 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248613
This update prevents badges from overlapping when multiple badges are added and duplicated on a website page. The issue stemmed from a technical process that merged badges together, causing visual conflicts. This fix ensures badges display correctly and consistently across the Odoo website.
Original PR description
Steps to reproduce: - Go to Website > Edit a page - Add a badge using editor - Duplicate that badge more than once - Save -> badges intersect each other Cause: ====== When saving, `cleanForSave` will be triggered which then will call `mergeAdjacentInlines`, since badges are inline elements, they will be merged into one single badge causing that issue. Solution: ========= We add a predicate to `unsplittable_node_predicates` to prevent `mergeAdjacentInlines` from merging badges. opw-5790891 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247368
This update resolves an issue where the website editor would crash after saving changes in Safari and Epiphany. The problem stemmed from outdated event listeners being attached to the parent window, causing conflicts when the iframe reloaded. This fix ensures the editor receives the correct, current service object, improving stability and reliability.
Original PR description
Steps to reproduce: =================== 1. In Website > Shop, open any product. 2. Click "Edit" on the product. 3. Make a change (for example, toggle "Zoom on click") 2 times. -> In the second time a…
Steps to reproduce:
===================
1. In Website > Shop, open any product.
2. Click "Edit" on the product.
3. Make a change (for example, toggle "Zoom on click") 2 times.
-> In the second time a traceback will appear `(Safari, Epiphany)`.
Cause:
======
The website builder uses two contexts:
- The **iframe** runs services (e.g. websiteEditService)
- The **parent window** runs editor plugins (e.g. EditInteractionPlugin)
They communicate via custom events on window.parent.document. The service (in the iframe) registers a listener for
"edit_interaction_plugin_loaded" on the parent document, and responds with a "transfer_website_edit_service" event carrying its service object.
When the iframe reloads after a save, the old listener was never removed from window.parent.document. The new iframe added a second listener. This meant two listeners existed on the parent document:
1. Old listener → responds with OLD websiteEditService (stale)
2. New listener → responds with NEW websiteEditService (correct)
Both fire when the plugin dispatches "edit_interaction_plugin_loaded". But the plugin only accepts the first response ({ once: true }), and since listeners fire in registration order, it always received the OLD stale service.
With the stale service:
- installPatches() early-returned (patches.length > 0 from session 1)
- destroy() called uninstallPatches() on the old service, removing stopInteractionByName from the old prototype
- stopInteraction() then tried to call the now-deleted method → crash: TypeError: publicInteractions.stopInteractionByName is not a function
Solution:
=========
Extract the anonymous event handlers into named functions and register a "beforeunload" listener on the iframe's window that removes them from window.parent.document. This ensures that when the iframe reloads, the old listeners are cleaned up before the new iframe registers its own, so the plugin always receives the current service.
opw-5864798
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#248042This update resolves a bug that was causing errors during the creation of payroll records. The fix avoids using a virtual ID (NewId) in search domains, which was triggering a framework error. This ensures smoother record creation and prevents disruptions to payroll processing.
Original PR description
The generic `TestEveryModel` fails because a virtual ID (NewId) is used in a search domain during record creation, causing a crash. This commit uses `.ids` with the `'in'` operator to idiomatically handle virtual records and prevent the framework error. runbot-115303 Forward-Port-Of: odoo/enterprise#107644
This update corrects a bug where the 'CFDI to Public' checkbox was incorrectly checked when creating new invoices in the Mexican accounting module. The fix ensures this checkbox remains unchecked until a customer is selected, preventing incorrect public invoice generation. This improves compliance and accuracy for Mexican businesses using Odoo Enterprise.
Original PR description
Steps to produce: --- - Install `l10n_mx` and `accountant` modules. - Switch to a Mexican company. - Go to Accounting > Customers > Invoices. - Click on New to create a new invoice. Issue: --- - The `CFDI to Public` checkbox is automatically checked even when no customer is selected. Root cause: --- - Here at [1], the field l10n_mx_edi_partner_address_complete evaluates to False when no partner is set. - Due to the OR condition, this causes l10n_mx_edi_cfdi_to_public to be set to True, even though no partner has been selected yet. Solution: --- - We should only evaluate partner address completeness when a partner is explicitly set. - Also, add VAT check for `l10n_mx_edi_partner_address_complete`, as requested by mial(PO). [1] https://github.com/odoo/enterprise/blob/cc00e8f3bb75b8c782fea3a42ad3bbcdbc240e2f/l10n_mx_edi/models/account_move.py#L649 opw-5911542 --- Forward-Port-Of: odoo/enterprise#106943
This update fixes a UI issue where repeatedly right-clicking pinned messages in the Odoo inbox could cause duplicate dropdown menus and instability. The change ensures only one dropdown is displayed at a time, preventing crashes and maintaining a smoother user experience.
Original PR description
**Description of the issue/feature this PR addresses:** ---------------------------------------------- When multiple messages are pinned, repeatedly right-clicking different messages in the pinned…
**Description of the issue/feature this PR addresses:** ---------------------------------------------- When multiple messages are pinned, repeatedly right-clicking different messages in the pinned messages panel can open multiple context dropdowns simultaneously. This may lead to UI inconsistencies and potential crashes. **Current behavior before PR:** ---------------------------------------------- - Multiple pinned messages can be right-clicked consecutively - Each right-click may open an additional dropdown menu - Duplicate dropdowns can remain visible at the same time - This can cause unstable or inconsistent UI behavior **Desired behavior after PR is merged:** ---------------------------------------------- - Only one dropdown menu is displayed at a time in the pinned messages panel - Repeated right-clicks properly reuse or replace the existing dropdown - Prevents duplicate dropdowns and avoids potential UI crashes Task-5935503 ---------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where right-click actions were incorrectly displayed in the pinned messages panel. The fix ensures that actions are only shown when the panel is open and messages are pinned, aligning with the design intent. This improves the user experience for managing pinned conversations.
Original PR description
Before this commit, when some messages are pinned and the pinned messages panel is open, right-click on a message in pinned panel shows the message actions. The actions are not made visible in pinned messages panel, as intended by the props `hasActions=false` in this panel. However, the right-click showing of message actions lack condition based on this props, which is what this commit fixes. Task-5935503 Before / After (shows right-click of system) <img width="317" height="301" alt="Screenshot 2026-02-18 at 12 14 39" src="https://github.com/user-attachments/assets/e81d5118-09f1-4a67-907d-119e813cbac4" /> <img width="291" height="125" alt="Screenshot 2026-02-18 at 12 15 12" src="https://github.com/user-attachments/assets/417070a2-b926-4558-8479-aacf61a86948" />
This update fixes an issue where the MTO replenishment route was incorrectly suggested by default. The change ensures the system correctly identifies the appropriate replenishment route based on product vendor information, improving the efficiency of stock replenishment processes. This impacts the purchase and stock modules.
Original PR description
*mrp,purchase_mrp,stock Issue ----- MTO gets suggested by default as the replenishment route for products. Steps to reproduce ----- - Enable routes - Unarchive MTO - Create a product with a vendor…
*mrp,purchase_mrp,stock Issue ----- MTO gets suggested by default as the replenishment route for products. Steps to reproduce ----- - Enable routes - Unarchive MTO - Create a product with a vendor and MTO route - Open the replenishment wizard > The default/suggested replenishment route is MTO Cause ----- When creating the widget, we go through its' `default_get` to set its' default route https://github.com/odoo/odoo/blob/310897cf07ebbf484ea6877fb329215e45c481d7/addons/stock/wizard/product_replenish.py#L76-L77 the domain is computed by `_get_route_domain`, which in turn calls `_get_allowed_route_domain` https://github.com/odoo/odoo/blob/310897cf07ebbf484ea6877fb329215e45c481d7/addons/stock/wizard/product_replenish.py#L165-L170 However, since we are creating a new, it does not have a `warehouse_id` yet, so we don't go into the `if` condition. https://github.com/odoo/odoo/blob/310897cf07ebbf484ea6877fb329215e45c481d7/addons/stock/models/stock_replenish_mixin.py#L26-L39 We only get routes from the product, but since buy is set on the warehouse and not the product anymore, it doesn't get included. Solution ----- There is an override of `_get_route_domain` in `purchase_stock` https://github.com/odoo/odoo/blob/310897cf07ebbf484ea6877fb329215e45c481d7/addons/purchase_stock/wizard/product_replenish.py#L91-L96 it filters out the buy route if there is no `seller_ids` for the product, but since the buy route cannot be a part of the domain anymore, the condition should be changed to include buy if the product has a seller. Note: `_get_route_domain` is only ever called in `default_get`. Other changes ----- The same change is also applied for the manufacture route, as the logic is the same. It makes no sens to include route that do not lead to an internal location. ----- Ticket: opw-5388728 Forward-Port-Of: odoo/odoo#246304
This update fixes an issue where loyalty rewards weren't correctly calculated when products were ordered in quantities other than the standard unit. Previously, orders using multiples of the base unit (like dozens) didn't trigger the discount. This change ensures that loyalty rewards are accurately applied regardless of the product's unit of measure, improving the customer experience and discount accuracy.
Original PR description
### Issue: Due to this issue, applying a different uom than unit one, will not apply the reward regarding to quantities. #### Steps to reproduce: 1- Create a program: buy 12 get 6 free. 2- Create a SO, add a dozen of product to SOL. 3- Click on reward. Expect: 6 free unit is added. Current outcome: Nothing is added. Unless you add 12 dozens which is going to add 6 units. ### Cause: In checking rules, `product_uom_qty` is directly used without conversion to quantity. Note: `test_different_uom_to_hours_on_sale_order_confirmation` is failing due to this fix, because the uom_id unit/dozens and hours/days are not compatible. As this is not possible in UI, IMO we can delete the breaking SOL in that test. opw-5913638 Forward-Port-Of: odoo/odoo#248527 Forward-Port-Of: odoo/odoo#247743
This update corrects a bug where a purchase order wasn't automatically created when selling a product with multiple variants. The fix ensures that supplier information isn't incorrectly linked to the product template when a product has several variants, preventing the system from misinterpreting sales orders and failing to generate purchase orders.
Original PR description
Steps to reproduce the bug: - Create an attribute "Test": - Display type: Radio - Attribute values: X1 and X2 - Variant creation: Dynamically - Create a storable product "P1": - Attribute & variants:…
Steps to reproduce the bug: - Create an attribute "Test": - Display type: Radio - Attribute values: X1 and X2 - Variant creation: Dynamically - Create a storable product "P1": - Attribute & variants: add X1 and X2 - Add any vendor - Route: MTO - Create a sale order with one unit of P1-X1 - Confirm it -> the purchase order is created - Create a second sale order with one unit of P1-X2 - Confirm it -> the purchase order is not created Problem: When the Buy route is triggered, a check whether a vendor is linked to the product variant being used. However, since "product.supplierinfo" is linked to the template and also to the first variant (P1-X1), no supplier is found for the other variants, so no PO is created. https://github.com/odoo/odoo/blob/60993a956f127af5bf988b056f9df948a5437d8b/addons/purchase_stock/models/stock_rule.py#L52-L55 https://github.com/odoo/odoo/blob/4759c5f1649b2a9bd3378b6e29cd2b806e86ea37/addons/product/models/product_supplierinfo.py#L113-L114 Solution: When the number of variants changes for a product template, the compute of product_id in the model product.supplierinfo is triggered. In this case, product_id must be set to False when multiple variants are linked to the product template. opw-5871195 Forward-Port-Of: odoo/odoo#248656
This update fixes an issue where single-day time off requests were incorrectly displayed as multi-day events in the calendar, primarily affecting users in the Los Angeles timezone. The change ensures that single-day leaves appear as expected, resolving a visual inconsistency and improving calendar accuracy.
Original PR description
Issues: - Single-day time off requests appear as multi-day events in the Calendar app when using certain times - Full day time offs were not appearing as `allday` events in the calendar (bar over the…
Issues: - Single-day time off requests appear as multi-day events in the Calendar app when using certain times - Full day time offs were not appearing as `allday` events in the calendar (bar over the days instead of a block representing the hours) if the time off type had a request unit of half-days. Causes: The `_compute_date_from_to()` method converts user-specified dates to UTC. https://github.com/odoo/odoo/blob/028e7228cb830e47a9726bef4c82793ba4590cd5/addons/hr_holidays/models/hr_leave.py#L316-L317 The `_prepare_holidays_meeting_values()` method then uses these UTC datetime values (`holiday.date_from`, `holiday.date_to`) In Los Angeles timezone, and for a one day leave on september 17 2025 this leads to: - holiday.date_from: September 17, 2025 at 03:00 UTC - holiday.date_to: September 18, 2025 at 12:00 UTC causing a single-day leave to be displayed as a two-day event. - The cause of the second issue was relying on `leave_type_request_unit` which is a simple related to the leave's type unit which doesn't consider cases where the time off duration could be longer than the minimal request duration. After fix: - start_value: September 17, 2025 at 12:00 - stop_value: September 17, 2025 at 11:59 Steps to Reproduce: 1. Set the user timezone to "America/Los_Angeles" 2. Set the browser timezone to the same timezone 3. Create a one-day time off request (e.g., September 17, 2025) 4. Open the Calendar app: the event spans across two days opw-4744817
This update fixes a memory error that occurred when calculating standard deviation and average for quality points. By disabling a data fetching process and focusing on only two key fields, the system now handles larger datasets more efficiently, preventing crashes and improving performance. This change impacts the Quality Control module.
Original PR description
Before this commit, computing the `standard_deviation` and the `average` of a `quality.point` involved fetching all the quality checks and all their fields. This can cause a memory error because of the field called `notes` that might involve HTML code. To avoid this, I have disabled the prefetcher since we only need two fields for the computation (`x_quality_state` and `measure`). The benchmark done below involved a recordset of quality points of size 1000 and the average size of the `notes` field was 6MB. The recordset was ordered by the size of the note section descending and for the different test cases it was sliced by the $K$ top elements and the compute function was triggered on the sliced version. | Scenario | Before | After | | :--- | :--- | :--- | | 100 | Memory LIMIT | 289.0MB | | 200 | Memory LIMIT | 290.0MB | | 500 | Memory LIMIT | 292.0MB | | 1000 | Memory LIMIT | 331.0MB | Forward-Port-Of: odoo/enterprise#106493
This update resolves a memory issue that could cause slowdowns and errors during Odoo upgrades. By optimizing image processing, particularly when related images have identical dimensions, the system uses less memory and processing time, leading to a more stable and efficient experience.
Original PR description
Description of the issue/feature this PR addresses: Because of the way `Pillow` manages memory, excessive image processing quickly leads to MemoryError, e.g. during upgrades. Current behavior before PR: When a readonly Image field with definied dimensions relates to another Image field of the same dimensions, there is no need to ever process the former one, since the processing will already have happened on the latter one. Still, the current code will process the image superfluously in these cases. Desired behavior after PR is merged: Extending the condition for skipping superfluous image processing to cover these cases will lead to reduced compute time and memory use. Forward-Port-Of: odoo/odoo#248990 Forward-Port-Of: odoo/odoo#248834
This update fixes an issue where multi-employee payslips were defaulting to the language of the first employee. The change ensures that each employee's payslip is printed in their correct, selected language, improving accuracy and user experience. This resolves a previous bug related to date formatting and language selection within the payroll system.
Original PR description
Steps to detect the bug: - Install payroll - Create more than one employee with different payslip languages - Add a contract for the employees - Payroll -> Payslip -> Pay run - Create a new payroll for more than one employee - Select all the employees in the pay run - Click 'print' button - Dates for the employees that are not the first one are in the language of the first employee This commit will allow the user to create multiemployee payslips maintaining the correct selected payslip language for each one of them. The issue was caused by a cache dictionary that used only the date and date format as a key, failing to include the user language. This led the system to reuse the first translated date for all subsequent employees. opw-5865260 Forward-Port-Of: odoo/enterprise#107269 Forward-Port-Of: odoo/enterprise#106575
This update reverts a recent change that was causing all upsell quotes to be canceled and disrupting legitimate business processes. The issue stemmed from a technical error in how quotes were handled, specifically related to alternative quotes and a faulty action call. This fix ensures upsell quotes function as intended.
Original PR description
…mmit/55b6bbe27cc31abcaee40cd4a196e087fdfd4ce5 This commit introduced an issue. All upsell quote were canceled and no filtering was done on "alternative quotes". As a result it could disrupt legit business flow. Moreover, action_cancel was called instead of _action_cancell which can lead to ValueError: Expected singleton as action_cancel can require single record sometimes. Forward-Port-Of: odoo/enterprise#107503 Forward-Port-Of: odoo/enterprise#107417
This update ensures that special products used in point-of-sale (like those with discounts or tips) cannot be deleted or archived. This prevents potential errors and data inconsistencies within the POS system, ensuring accurate sales tracking and reporting.
Original PR description
Before this commit, it was possible to delete or archive some products even if they were special for the pos (discount, tips, settle, etc.). This commit adds a mechanism to prevent this and reduce the risk of errors linked to missing products in the pos. Enterprise PR: https://github.com/odoo/enterprise/pull/95789 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230865 Forward-Port-Of: odoo/odoo#229074
This update ensures that essential products like 'settle due' and 'deposit' are automatically configured for all Point of Sale (POS) settings when the pos_settle_due module is installed. Previously, these products were only available in POS sessions without open sessions, causing potential issues. This change guarantees consistent product availability across all POS configurations.
Original PR description
Before this commit, when the module pos_settle_due was installed, the special products (settle due, deposit, settle invoice) were only set on the POS configurations that did not have any open session. This could lead to issues when trying to use these products in a POS session of a configuration that did not have them set. Now, the special products are set on all POS configurations when installing the module. Community PR: https://github.com/odoo/odoo/pull/229074 Forward-Port-Of: odoo/enterprise#96788 Forward-Port-Of: odoo/enterprise#95789
A recent issue with a POS80D printer was causing Odoo to crash. This update fixes a USB error related to printer descriptor validation, preventing the crash and ensuring reliable printer functionality. This resolves a reported problem impacting a specific printer model.
Original PR description
Seen on https://laloux-j.odoo.com/ 12/2 with a POS80D printer the printer triggers a core.USBError. This PR catches the corresponding exception 2026-02-12 04:21:12,496 1117 ERROR ? odoo.addons.iot_drivers.exception_logger: usb.core.USBError: [Errno None] Invalid descriptor task-5932720 Forward-Port-Of: odoo/odoo#248991
This update resolves an issue preventing the generation of P9 reports (tax documents) for Kenyan employees in version 19.0 and later. The fix removes a deprecated field related to employee identification, ensuring the report can be created correctly. Testing confirms the PDF generation now functions as expected.
Original PR description
Bug reproduction: When version >= 19.0, install Kenya payroll and accounting, create payslip for one of the Kenyan employee -> validate the payslip -> Reporting: P9 Report in payroll app -> Create…
Bug reproduction: When version >= 19.0, install Kenya payroll and accounting, create payslip for one of the Kenyan employee -> validate the payslip -> Reporting: P9 Report in payroll app -> Create new tax deduction card -> populate employees -> in the inside of the card: select employees and click to generate pdf -> it will not be generated
Bug cause:
1 - In cron parameters, context passed wrongly, it should take place in the clickable parameters
2 - After saas-18.4 in the migration, employee.l10n_ke_pin field is removed but this field still takes place in l10n_ke_tax_reduction_card_templates.xml and it gets error when the user clicks to generate PDF.
Bug solution:
1 - Fixing cron parameter passing
2 - Removing PIN of employee field from P9 report since it is not available anymore.
Testing: Unit test is written to check PDF's are generated for sure.
1 - Creating Kenya company, employees
2 - Creating payslip for employees and validate them
3 - Creating tax deduction card and generate declarations
4 - Checking PDF's are created
task - 5395267
Forward-Port-Of: odoo/enterprise#1048167 changes
Resolved issues and error corrections
This update resolves an issue preventing payroll users from accessing the 'One-time payments' feature within Swiss company contracts. The fix allows authorized payroll users to manage these payments, ensuring accurate payroll processing. The problem stemmed from restricted access to internal action records, which has now been addressed through a secure internal bypass.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll Officer/Manager access. 4.…
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll Officer/Manager access. 4. Log in as that user, create a contract, and click on "One-time payments". Issue: --------- A Traceback with AccessError: ```You are not allowed to access 'Action Window' (ir.actions.act_window) records.``` Cause: ---------- https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/l10n_ch_hr_payroll_elm_transmission/models/hr_contract.py#L195 The code attempts to call `.read()` on an `ir.actions.act_window` record. Standard users typically do not have read access to window action records, resulting in an **AccessError** even if they have rights to the payroll data. Solution: ------------- Use [_for_xml_id](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L187) to return action content for the provided xml id in a safe way by doing [sudo](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L205) internally to bypass the access restriction. opw-5491467 Forward-Port-Of: odoo/enterprise#106598
This update resolves a bug where autofilling pivot cells with incorrect relational IDs caused a crash. The fix ensures that the autofill process itself functions correctly, while preventing the associated tooltip from triggering a system failure. This improves the reliability of pivot table data entry.
Original PR description
If you try to autofill a pivot cell that has an invalid relational id in its domain (eg. `=PIVOT.HEADER(1, "stage_id", 99999999)`), the autofill actually works but the tooltip make everything crash. Task: [5913754](https://www.odoo.com/web#id=5913754&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#107502 Forward-Port-Of: odoo/enterprise#106601
This update resolves an issue where archived employees were still visible in the attendance Gantt chart. The change ensures that only currently active employees are displayed, improving data accuracy and clarity for reporting. This prevents confusion and ensures users only see relevant attendance records.
Original PR description
Steps to reproduce: 1. install `hr_attendance_gantt` 2. create an employee 3. make attendance records for the employee in the previous months 4. archive the employee When opening the gantt view of the attendance, a row appears for the archived employee, with no attendance showing up. This commit adds a constraint to only show the active employees. opw-5490119 Forward-Port-Of: odoo/enterprise#106486
This update corrects a bug where the 'CFDI to Public' checkbox was incorrectly checked when creating new invoices in the Mexican accounting module. The fix ensures this checkbox remains unchecked until a customer is selected, preventing incorrect public invoice generation. This improves data accuracy and compliance for Mexican businesses using Odoo.
Original PR description
Steps to produce: --- - Install `l10n_mx` and `accountant` modules. - Switch to a Mexican company. - Go to Accounting > Customers > Invoices. - Click on New to create a new invoice. Issue: --- - The `CFDI to Public` checkbox is automatically checked even when no customer is selected. Root cause: --- - Here at [1], the field l10n_mx_edi_partner_address_complete evaluates to False when no partner is set. - Due to the OR condition, this causes l10n_mx_edi_cfdi_to_public to be set to True, even though no partner has been selected yet. Solution: --- - We should only evaluate partner address completeness when a partner is explicitly set. - Also, add VAT check for `l10n_mx_edi_partner_address_complete`, as requested by mial(PO). [1] https://github.com/odoo/enterprise/blob/cc00e8f3bb75b8c782fea3a42ad3bbcdbc240e2f/l10n_mx_edi/models/account_move.py#L649 opw-5911542 --- Forward-Port-Of: odoo/enterprise#106943
This update fixes an issue where CFDI refund XMLs were using a generic description instead of the original line details. Now, refund descriptions accurately reflect the returned items, ensuring proper compliance with Mexican tax regulations. This change aligns with a previous update in version 19.0.
Original PR description
Steps to produce: --- - Install `accountant` and `l10n_mx` modules. - Switch to Mexican company. - In Settings, under `Authorized Certification Provider (PAC)`, set PAC to `Solución Factible`. -…
Steps to produce: --- - Install `accountant` and `l10n_mx` modules. - Switch to Mexican company. - In Settings, under `Authorized Certification Provider (PAC)`, set PAC to `Solución Factible`. - Create new invoice > set customer to `INMOBILIARIA CVA`, payment way to `Efectivo` and product as `Large Meeting table` > confirm the invoice. - Mark the invoice as global. - Register the payment. - Create a credit note and confirm it. - Click Send(make sure CFDI is checked) and check the generated XML. Issue: --- - The CFDI XML sets the `Descripcion` field to the default value `Devoluciones, descuentos o bonificaciones`. Solution: --- - Preserve the original line description for CFDI refunds instead of forcing the generic label. - For POS refunds, continue using the generic label. - This aligns with the fix introduced in 19.0([here]). Before: --- <img width="519" height="60" alt="image" src="https://github.com/user-attachments/assets/75066bdb-5fba-4959-bf16-8b2953bc40d5" /> After: --- <img width="615" height="56" alt="image" src="https://github.com/user-attachments/assets/bd93d0af-957f-47fc-b65c-3ec16c4b8f10" /> [here]: https://github.com/odoo/enterprise/pull/97681/changes/515410ec45541e6c07f892a094bb0aa57f479436 **Backport of https://github.com/odoo/enterprise/pull/97681** opw-5870052 --- Forward-Port-Of: odoo/enterprise#107739 Forward-Port-Of: odoo/enterprise#107367
This update ensures payslips display the employee's actual start date with the company, rather than the contract start date. This is crucial for accurate payroll reporting, especially when employees transition between roles internally. The change applies to both Switzerland and the UAE due to localized payslip reports.
Original PR description
In the payslip definition, the current contract's start date is used. But if a person changes job or contract internally we don't want this value to change and we want it fixed to when the person joined the company. Notably, if a person worked at the same company in two well distinct periods, we want to consider the beginning of this period and not of the previous one(s). Since Switzerland uses a custom report for the payslip, the same change is applied there. Task: 5909637 Community PR: https://github.com/odoo/odoo/pull/248598
This update reverses a recent change that was causing all upsell quotes to be canceled, disrupting legitimate business processes. The previous update incorrectly used a function that resulted in errors and prevented proper filtering of alternative quotes. This reversion restores the correct functionality.
Original PR description
…mmit/55b6bbe27cc31abcaee40cd4a196e087fdfd4ce5 This commit introduced an issue. All upsell quote were canceled and no filtering was done on "alternative quotes". As a result it could disrupt legit business flow. Moreover, action_cancel was called instead of _action_cancell which can lead to ValueError: Expected singleton as action_cancel can require single record sometimes. Forward-Port-Of: odoo/enterprise#107503 Forward-Port-Of: odoo/enterprise#107417
24 changes
Resolved issues and error corrections
This update ensures that DateV identifiers are unique across all partners, including those that have been archived. Previously, a duplicate identifier could be assigned to a partner after it was archived, leading to data inconsistencies. This change corrects a technical issue related to how the system checks for unique identifiers.
Original PR description
Currently, it is possible to set a DateV identifier on a partner even if it is already assigned to an archived partner. This leads to duplicate identifiers if the archived partner is later…
Currently, it is possible to set a DateV identifier on a partner even if it is already assigned to an archived partner. This leads to duplicate identifiers if the archived partner is later unarchived. ### **Steps to reproduce:** 1) Install **l10n_de_reports, Contacts** App with Demo Data. 2) Switch to a **DE company**. 3) Create a contact 'Test-A' and set `'DateV Vendor' to 123456789` in the **Accounting Section**. 4) Archive 'Test-A'. 5) Create 'Test-B' and set `'DateV Vendor' to 123456789`. 6) Unarchive 'Test-A'. ### **Observed Behavior:** 'Test-B' is created successfully. After step 6, both 'Test-A' and 'Test-B' are active with the same DateV identifier. ### **Expected Behavior:** A validation error should be raised when trying to save 'Test-B', stating that the identifier is already defined. ### **Root Cause:** Since [this commit](https://github.com/odoo/enterprise/commit/733c4ba1fd5558891ffdbc67066c3a3a5938e2f0), company-dependent fields are stored as JSONB in the database. Due to this improvement, the previous SQL constraint (which enforced uniqueness across all records) was removed and replaced with a Python constraint. However, the new Python constraint utilizes `search_count`, which by default filters out archived records (`active=False`). This allows the reuse of identifiers belonging to archived partners, breaking the uniqueness requirement that existed in previous versions. Fix: Update the `_check_datev_identifier` and `_check_datev_identifier_customer` constraints to use `with_context(active_test=False)`. This ensures that the uniqueness check considers all partners, including archived ones. opw-5474106 Forward-Port-Of: odoo/enterprise#106146
This update resolves an issue preventing standard payroll users from accessing the 'One-time payments' feature within Swiss company contracts. The fix allows payroll officers and managers to correctly open this functionality, ensuring proper processing of payroll data. This improves usability for key payroll operations.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll…
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll Officer/Manager access. 4. Log in as that user, create a contract, and click on "One-time payments". Issue: --------- A Traceback with AccessError: ```You are not allowed to access 'Action Window' (ir.actions.act_window) records.``` Cause: ---------- https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/l10n_ch_hr_payroll_elm_transmission/models/hr_contract.py#L195 The code attempts to call `.read()` on an `ir.actions.act_window` record. Standard users typically do not have read access to window action records, resulting in an **AccessError** even if they have rights to the payroll data. Solution: ------------- Use [_for_xml_id](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L187) to return action content for the provided xml id in a safe way by doing [sudo](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L205) internally to bypass the access restriction. opw-5491467 Forward-Port-Of: odoo/enterprise#106598
This update ensures that when creating expenses or sales orders, the associated account is correctly linked to the company being used. Previously, accounts were incorrectly tied to the main company, even when processing transactions for a different company. This fix improves data accuracy and prevents errors in financial reporting.
Original PR description
The aim of this commit is to ensure the account select through product is related to the correct company. (ie. the one related to the processed model) Before this commit: If a user has company_a selected as the main company in the company switcher and create an expense for company_b, the account selected from the product will be an account from company_a. (because product is shared between company but the account properties on those are company dependent) This could also happens in other places so we fixed it. After this commit: The account selected from the product will be from the company set on the model. task-4699717 Forward-Port-Of: odoo/odoo#249003 Forward-Port-Of: odoo/odoo#209144
This update resolves an issue where the public knowledge sidebar overlapped with article content on mobile devices. The fix ensures the sidebar functions as a proper mobile overlay, providing a cleaner and more consistent user experience when viewing knowledge articles on smartphones. This improves usability for mobile users.
Original PR description
Steps to reproduce: 1. Install `website_knowledge` 2. Create a long, scrollable knowledge article with 20 sub-articles. 3. Share the article publicly 4. Open the public link in mobile view (logged…
Steps to reproduce:
1. Install `website_knowledge`
2. Create a long, scrollable knowledge article with 20 sub-articles.
3. Share the article publicly
4. Open the public link in mobile view (logged out)
5. Toggle the sidebar using the top-left menu button
6. Scroll down
Issue:
- On mobile, the public sidebar overlaps with the article's content while scrolling.
Cause:
- the sidebar and its backdrop were positioned absolutely inside a flex container. Because they were not fixed to the viewport, the article content continued to scroll and render underneath the sidebar, causing visible overlap between the sidebar and the article body. Additionally, the sidebar’s internal scroll container was not explicitly positioned, which contributed to inconsistent scrolling behavior when the sidebar was open.
Solution:
- Update the public Knowledge sidebar css to behave as a proper mobile overlay by: Fixing the sidebar and its backdrop to the viewport using position: fixed, ensuring they are removed from the flex layout flow on mobile Explicitly positioning the sidebar’s internal scroll view to ensure correct scrolling behavior
<table>
<tr>
<td><strong>Before</strong></td>
<td><strong>After</strong></td>
</tr>
<tr>
<td><img width="725" height="901" alt="Before image" src="https://github.com/user-attachments/assets/33190684-5b52-4931-b01a-5044734c9cf0" /></td>
<td><img width="686" height="916" alt="After image" src="https://github.com/user-attachments/assets/610a5aef-3467-4215-a0a0-83607375a016" /></td>
</tr>
</table>
opw-5384026
Forward-Port-Of: odoo/enterprise#103135This update fixes an issue where CFDI refund XMLs were using a generic description instead of the original line description. The change ensures that refund details are accurately reflected in the CFDI documents, complying with Mexican tax regulations. This aligns with a previous update in version 19.0.
Original PR description
Steps to produce: --- - Install `accountant` and `l10n_mx` modules. - Switch to Mexican company. - In Settings, under `Authorized Certification Provider (PAC)`, set PAC to `Solución Factible`. -…
Steps to produce: --- - Install `accountant` and `l10n_mx` modules. - Switch to Mexican company. - In Settings, under `Authorized Certification Provider (PAC)`, set PAC to `Solución Factible`. - Create new invoice > set customer to `INMOBILIARIA CVA`, payment way to `Efectivo` and product as `Large Meeting table` > confirm the invoice. - Mark the invoice as global. - Register the payment. - Create a credit note and confirm it. - Click Send(make sure CFDI is checked) and check the generated XML. Issue: --- - The CFDI XML sets the `Descripcion` field to the default value `Devoluciones, descuentos o bonificaciones`. Solution: --- - Preserve the original line description for CFDI refunds instead of forcing the generic label. - For POS refunds, continue using the generic label. - This aligns with the fix introduced in 19.0([here]). Before: --- <img width="519" height="60" alt="image" src="https://github.com/user-attachments/assets/75066bdb-5fba-4959-bf16-8b2953bc40d5" /> After: --- <img width="615" height="56" alt="image" src="https://github.com/user-attachments/assets/bd93d0af-957f-47fc-b65c-3ec16c4b8f10" /> [here]: https://github.com/odoo/enterprise/pull/97681/changes/515410ec45541e6c07f892a094bb0aa57f479436 **Backport of https://github.com/odoo/enterprise/pull/97681** opw-5870052 --- Forward-Port-Of: odoo/enterprise#107367
This update fixes an issue where users experienced unexpected behavior when editing file names within the HTML editor. The change now prevents automatic editing and requires a user click to initiate editing, ensuring smoother and more predictable keyboard navigation.
Original PR description
### Purpose of this PR: - In the static file box, the file name is contenteditable by default, which leads to unexpected caret movement and arrow-key navigation behavior. - Change the behavior so that the file name is contenteditable="false" by default and becomes editable only when the user explicitly clicks on it. The editability is reverted when clicking outside of the file name. - This ensures consistent keyboard navigation while keeping the change limited to the static file box. task-5427329 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241591
This update fixes an issue where input fields weren't resizing correctly in Safari and Firefox, leading to overflow. The fix removes outdated browser detection and dynamically calculates input widths, ensuring consistent sizing across all supported browsers and preventing visual glitches.
Original PR description
Before this PR, `autoresizeInput` used a fixed buffer of `5px` to compensate for input borders. This caused incorrect sizing when inputs had thicker borders, leading to overflow issues. Safari 16 and…
Before this PR, `autoresizeInput` used a fixed buffer of `5px` to compensate for input borders. This caused incorrect sizing when inputs had thicker borders, leading to overflow issues. Safari 16 and earlier versions did not include padding and border in `scrollWidth`. To work around this, browser detection via regex was used to add a hardcoded extra value. A similar issue appeared in Firefox 145, where scrollWidth also excluded padding and border, causing inputs to overflow again. After this PR, The buffer is no longer hardcoded. The border width is now calculated dynamically and applied correctly to the final width. Browser sniffing has been removed entirely. Instead, the logic detects at runtime whether scrollWidth includes padding; if not, the missing padding is added to the computed width. This makes the behavior consistent across browsers and prevents overflow without relying on user agent checks. task-[5412025](https://www.odoo.com/odoo/project/1519/tasks/5412025) Forward-Port-Of: odoo/odoo#241315
This update corrects a technical issue where duplicate activities were created on purchase orders when a sale order was cancelled, specifically within the dropshipping feature. The fix ensures that a key template is only triggered when relevant, preventing this duplication and streamlining the process. This change was introduced in version 19.0.
Original PR description
**Steps to Reproduce** * Install `sale_management`, `purchase`, and `stock` with demo data. * In Inventory → Settings, enable `Dropshipping`. * Create a product: * Set a vendor under the Purchase…
**Steps to Reproduce**
* Install `sale_management`, `purchase`, and `stock` with demo data.
* In Inventory → Settings, enable `Dropshipping`.
* Create a product:
* Set a vendor under the Purchase tab.
* Set routes to `Dropshipping` and `Buy`
* Create and confirm a sale order for this product.
* Confirm the generated purchase order.
* Cancel the originating sale order.
* Go back to the linked purchase order.
**Observed behavior**
* Two activities are created on the purchase order when the sale order is cancelled.
**Cause**
* Both templates — `exception_on_so` (from sale_stock) and
`exception_purchase_on_sale_cancellation` (from sale_purchase)
are triggered during sale order cancellation.
* Each module overrides `_action_cancel` and triggers its corresponding exception template.
* When both modules are installed, both templates run.
https://github.com/odoo/odoo/blob/98da30375a5ae50a77d848b838781aa7247bd362/addons/sale_purchase/models/sale_order.py#L26-L32
https://github.com/odoo/odoo/blob/98da30375a5ae50a77d848b838781aa7247bd362/addons/sale_stock/models/sale_order.py#L206-L208
* The template `exception_purchase_on_sale_cancellation` should only be triggered
when the PO originates from an SO and the product is a service, but
the domain lacks the required product-type condition.
**Fix**
* Add the missing condition to ensure that `exception_purchase_on_sale_cancellation`
is not triggered for dropshipped products, preventing duplicate activities.
---
`NOTE` - This issue is resolved from version 19.0 in this [commit](https://github.com/odoo/odoo/pull/212679/changes/ede2898278220a3ba4d8910ef268fe59f1587c72)
---
opw-5153488
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#239569This update enhances the accuracy of payment reference validation by tailoring checks to the bank account's country. Previously, a single check applied to all countries could lead to incorrect validation. Now, the system verifies reference formats against the specific country of the bank account, with a fallback to a standard format if the country isn't supported.
Original PR description
Currently, when initiating a payment, we check if the reference is a structured one by using `is_valid_structured_reference` which checks the validity of the structure accross all supported countries. This can lead to issues when it matches formats accepted by other countries but not the one of the bank account. With this commit, we replace this check by a call to a new function that checks the structure validity according to the country of the bank account, with a fallback to the generic check (ISO 11649) if the country is not supported. opw-5387269 Forward-Port-Of: odoo/odoo#248926 Forward-Port-Of: odoo/odoo#248194
This update enhances the accuracy of payment reference checks by tailoring validation to the bank account's country. Previously, a single check applied to all countries could lead to incorrect validation. Now, the system verifies the reference format against the bank's country, with a fallback to a standard format for unsupported countries, ensuring payments are processed correctly.
Original PR description
Currently, when initiating a payment, we check if the reference is a structured one by using `is_valid_structured_reference` which checks the validity of the structure accross all supported countries. This can lead to issues when it matches formats accepted by other countries but not the one of the bank account. With this commit, we replace this check by a call to a new function that checks the structure validity according to the country of the bank account, with a fallback to the generic check (ISO 11649) if the country is not supported. opw-5387269 Forward-Port-Of: odoo/enterprise#107589 Forward-Port-Of: odoo/enterprise#107116
This update resolves a crash issue that occurred when using the pivot table autofill feature with invalid data. The fix ensures that autofill functionality continues to work while preventing tooltips from causing a system failure. This improves the reliability and usability of the pivot table feature.
Original PR description
If you try to autofill a pivot cell that has an invalid relational id in its domain (eg. `=PIVOT.HEADER(1, "stage_id", 99999999)`), the autofill actually works but the tooltip make everything crash. Task: [5913754](https://www.odoo.com/web#id=5913754&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#107502 Forward-Port-Of: odoo/enterprise#106601
This update corrects a visual inconsistency in Odoo's note-taking feature. Previously, checklists and bulleted lists had different indentation levels, leading to a misaligned appearance. This change ensures all list types are consistently formatted for a cleaner user experience.
Original PR description
The checklist has different indents than bullet list and numbered list. It should not be the case. This commit removes the extra indent from checklist entries. Steps to reproduce: - Go to a "To do" note - Create a checklist with indented items - Create a bullet list with indented items => Both list were not aligned task-5916723 Forward-Port-Of: odoo/odoo#247568
This update fixes an issue where the tax report (mod 390) was incorrectly displaying amounts twice for Spanish companies using the 0% EU G tax code. The fix corrects a misconfiguration in the tax template, ensuring accurate reporting of intra-community purchases. This ensures compliance with Spanish VAT regulations.
Original PR description
How to reproduce: - Install the l10n_es module - Switch to a spanish company - Confirm a Vendor Bill with a Product with the tax 0% EU G - Go to the Tax Report and select mod390 The problem: In the section "Adquisiciones intracomunitarias de bienes", the total amount is shown two time, once for grid 716 and once for grid 26 Why: In the declaration of the tax template for 0% EU G, there is two tags for the mod 390, the one for grid 26 being wrong Before: <img width="818" height="447" alt="image" src="https://github.com/user-attachments/assets/0565802d-5d98-4e0f-9e08-50776f0a5aec" /> After: <img width="834" height="443" alt="image" src="https://github.com/user-attachments/assets/89696c83-7022-439d-adaa-d456c2dbadf8" /> opw-5867849 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248682 Forward-Port-Of: odoo/odoo#247590
The installation of the appointment module was failing due to an outdated database reference. This update prevents the module from attempting to generate email invites during installation, resolving a template validation error and ensuring a smoother installation process. This change improves the reliability of module installation.
Original PR description
Reinstalling the appointment module fails during mail template validation. ### Reproduction Steps 1. Install the `appointment_hr_recruitment` module. 2. Uninstall `appointment`. 3. Reinstall `appointment`. → A template parsing error appears. ### Cause The global `request.env` is bound to the registry active at the start of the request. When reinstalling a module, this registry becomes stale and does not include the models being re-added. During installation, the `mail.template` model performs a test render to validate its XML data. One of the templates calls `_get_interview_invite_url`, which invokes a controller that looks up the `appointment.type` model using `request.env`. Because the registry is stale and does not contain this model, the lookup raises a KeyError and the installation fails. ### Fix Rationale Skip invite URL generation when `install_mode` is set to avoid using the stale `request.env`. opw-5898780
This update corrects a visual bug in the HTML editor where the cursor's position was incorrect after using backspace after a button. Specifically, text was inserted after the button instead of within it. This ensures a more intuitive and accurate editing experience.
Original PR description
When using backspace after a button, the cursor is visually displayed as being inside the button, but it a character is typed, it is inserted after the button, while it should be inside. What actually happens is that after backspace after a button, the selection is set around the FEFF that follows the button. This commit fixes this by putting the selection before the FEFF inside the button instead. Steps to reproduce: - Go to a "To do" note - Insert a button - Insert text after the button - Put cursor before text after button - Press backspace: the cursor is displayed inside the button - Type a letter => The letter was inserted after the button. task-5928806 Forward-Port-Of: odoo/odoo#248179
This update resolves an issue where archived employees were still visible in the attendance Gantt view. The change ensures that only currently active employees are displayed, improving data accuracy and clarity for attendance reporting. This prevents confusion and outdated information.
Original PR description
Steps to reproduce: 1. install `hr_attendance_gantt` 2. create an employee 3. make attendance records for the employee in the previous months 4. archive the employee When opening the gantt view of the attendance, a row appears for the archived employee, with no attendance showing up. This commit adds a constraint to only show the active employees. opw-5490119 Forward-Port-Of: odoo/enterprise#106486
This update corrects a bug where a new Mexican invoice was automatically marked as 'public' (CFDI to Public) even when no customer was selected. The fix ensures this checkbox remains unchecked, preventing incorrect public disclosure of invoices. This ensures compliance with Mexican tax regulations.
Original PR description
Steps to produce: --- - Install `l10n_mx` and `accountant` modules. - Switch to a Mexican company. - Go to Accounting > Customers > Invoices. - Click on New to create a new invoice. Issue: --- - The `CFDI to Public` checkbox is automatically checked even when no customer is selected. Root cause: --- - Here at [1], the field l10n_mx_edi_partner_address_complete evaluates to False when no partner is set. - Due to the OR condition, this causes l10n_mx_edi_cfdi_to_public to be set to True, even though no partner has been selected yet. Solution: --- - We should only evaluate partner address completeness when a partner is explicitly set. - Also, add VAT check for `l10n_mx_edi_partner_address_complete`, as requested by mial(PO). [1] https://github.com/odoo/enterprise/blob/cc00e8f3bb75b8c782fea3a42ad3bbcdbc240e2f/l10n_mx_edi/models/account_move.py#L649 opw-5911542 --- Forward-Port-Of: odoo/enterprise#106943
This update resolves an issue where grouped tax reports were inaccurate when invoices included both positive and negative tax amounts. The fix ensures that all tax line balances are considered, preventing errors in report generation. This improves the reliability of tax reporting within the system.
Original PR description
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous…
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous commit](https://github.com/odoo/odoo/commit/48d60151254045768d5aac1b29c5acf84b70cef2) modified the query responsible for the construction of the grouped reports. It only keeps the base lines of type entry which have a balance of the same sign as the tax line. Yet in our case, the CABA move is of type 'entry'. It has only one tax line with a positive amount because the taxes amounts on each line are added. But the balance of the negative line is negative. So the query will only consider the positive line hence the error. So now, the logic is only considering lines with the same sign to avoid entries where the invoice lines and the refund lines are both there. This is why it only checks for moves of type 'entry'. We also ignore the check for CABA moves, i.e. moves where `tax_cash_basis_origin_move_id` is defined. Steps to reproduce: - Activate Cash Basis in the Settings - Create a tax based on payment - Create an invoice with two lines: - One with a negative amount, an income account and the created tax - One with a positive amount big enough to compensate the previous line, a different income account and the same tax - Confirm - Click "Pay", validate the payment - In the Dashboard > Bank journal > Create a reconciliation of the amount of the invoice - Reconcile it with the invoice - Accounting > Reporting > Tax Return - Select "Group By: Account tax" Ticket [link](https://www.odoo.com/odoo/project.task/5089790) opw-5089790 Forward-Port-Of: odoo/odoo#239081
This update resolves an issue where grouped tax reports were generating incorrect results when invoices included both positive and negative tax amounts. The fix ensures that all tax lines, including those with negative balances (CABA moves), are properly considered during report generation. This ensures accurate tax reporting for cash basis accounting.
Original PR description
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous…
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous commit](https://github.com/odoo/odoo/commit/48d60151254045768d5aac1b29c5acf84b70cef2) modified the query responsible for the construction of the grouped reports. It only keeps the baselines of type 'entry' which have a balance of the same sign as the tax line. But in our case, the CABA move is of type 'entry'. It has only one tax line with a positive amount because the taxes amounts on each line are added. But the balance of the negative line is negative. So the query will only consider the positive line hence the error. So now, the logic of the only considering lines with the same sign is to avoid entries where the invoice lines and the refund lines are both there. This is why it only checks for moves of type 'entry'. We also ignore the check for CABA moves, i.e. moves where `tax_cash_basis_origin_move_id` is defined. Steps to reproduce: - Activate Cash Basis in the Settings - Create a tax based on payment - Create an invoice with two lines: - One with a negative amount, an income account and the created tax - One with a positive amount big enough to compensate the previous line, a different income account and the same tax - Confirm - Click "Pay", validate the payment - In the Dashboard > Bank journal > Create a reconciliation of the amount of the invoice - Reconcile it with the invoice - Accounting > Reporting > Tax Return - Select "Group By: Account tax" Community PR: odoo/odoo#239081 Ticket [link](https://www.odoo.com/odoo/project.task/5089790) opw-5089790 Forward-Port-Of: odoo/enterprise#101601
This update resolves a potential memory issue during Odoo upgrades caused by excessive image processing. Specifically, it optimizes how images are handled when linked, reducing the strain on system resources and improving overall performance. This change primarily impacts the core functionality of image management within Odoo.
Original PR description
Description of the issue/feature this PR addresses: Because of the way `Pillow` manages memory, excessive image processing quickly leads to MemoryError, e.g. during upgrades. Current behavior before PR: When a readonly Image field with definied dimensions relates to another Image field of the same dimensions, there is no need to ever process the former one, since the processing will already have happened on the latter one. Still, the current code will process the image superfluously in these cases. Desired behavior after PR is merged: Extending the condition for skipping superfluous image processing to cover these cases will lead to reduced compute time and memory use. Forward-Port-Of: odoo/odoo#248990 Forward-Port-Of: odoo/odoo#248834
This update reverses a recent change that was causing all upsell quotes to be canceled, disrupting business processes. The previous update incorrectly used a function that led to errors and prevented proper filtering of alternative quotes. This reversion restores the correct functionality for upsell quote management.
Original PR description
…mmit/55b6bbe27cc31abcaee40cd4a196e087fdfd4ce5 This commit introduced an issue. All upsell quote were canceled and no filtering was done on "alternative quotes". As a result it could disrupt legit business flow. Moreover, action_cancel was called instead of _action_cancell which can lead to ValueError: Expected singleton as action_cancel can require single record sometimes. Forward-Port-Of: odoo/enterprise#107503 Forward-Port-Of: odoo/enterprise#107417
This update resolves an issue where custom filters in the Odoo Sign module were not consistently remembering the 'ends with' operator. The fix ensures that when a user selects 'ends with' to filter by display name, it remains selected after the page is refreshed or updated. This improves the usability of the filter functionality.
Original PR description
Steps to reproduce ================== - Go to Sign - Add a custom filter - Select the Display Name field - Select the "ends with" operator -> The "starts with" operator ends up being selected Cause of the issue ================== The ends_with operator is a virtual operator that should be restored after a render opw-5714125 Forward-Port-Of: odoo/odoo#248908
This update corrects a rounding issue that caused product prices to be incorrectly inflated when importing vendor bills using the UBL-CII format. Specifically, when a product had a price of $0.00 and included allowances, the system was adding these incorrectly, leading to mismatched totals between the imported XML and the Odoo invoice. This ensures accurate pricing and invoice totals.
Original PR description
Whenever a line with price `0.0` with `AllowanceCharge`s got imported, Odoo used to update the `price_unit` to the sum of price, allowance and charges, because of a wrong float comparison condition between this sum and the XML total. So the product price was increased, but the allowances were maintained. The total imported in Odoo became double the one in the XML. Step to reproduce: - Import vendor bill from XML with a product: - price: `0.00` - quantity: `1` - an AllowanceCharge, amount: `0.2` - an AllowanceCharge, amount: `0.1` - `0.0 + 0.2 + 0.1 (sum of price and allowances) != 0.3 (subtotal)` (but `float_compare(0.1 + 0.2, 0.3, precision_digits=4) == 0`) - `price_unit` is updated to `0.3` - Total in Odoo is `0.6` Ticket [link](https://www.odoo.com/odoo/project.task/5499525) opw-5499525 Forward-Port-Of: odoo/odoo#248043
This update addresses a recent SAT requirement by allowing accented characters (specifically 'É') in tax documents. Previous efforts removed accents to comply with SAT standards, but recent testing shows the SAT now accepts them. This change ensures Odoo continues to meet Mexican tax regulations.
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) Forward-Port-Of: odoo/enterprise#107677
10 changes
Resolved issues and error corrections
This update ensures that all rates displayed on the printed payslip are formatted to a maximum of 4 decimal places. This improves the clarity and consistency of the payslip document, aligning with reporting requirements. The change was made to address a formatting issue.
Original PR description
This commit improves the payslip display by limiting all rates to 4 decimals max on the printed pdf payslip. Task: 5709739 Forward-Port-Of: odoo/enterprise#104915
This update resolves a visual issue in the employee offer screen for the Belgium payroll localization. The contract type field was incorrectly displayed when the localization wasn't installed. A new field was added to the model to correctly manage the display, ensuring the correct UI for 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#104578
This update ensures that CODA file imports processed via the cron job correctly split transactions according to the configured journal settings. Previously, the cron process bypassed this splitting logic, leading to incorrect accounting. This fix guarantees consistent transaction handling regardless of the import method.
Original PR description
When importing CODA files manually, transactions are correctly split according to the journal configuration. However, when processed via the cron, the splitting logic is bypassed because the journal recordset is empty at the time of parsing. This occurs because the journal is identified only after the file has been parsed, which is too late for the cron flow. This commit ensures the journal is available early enough to respect the "Split Transactions" setting regardless of the import method. opw-4954539 Forward-Port-Of: odoo/enterprise#107560 Forward-Port-Of: odoo/enterprise#106344
This update fixes an issue where duplicate DateV identifiers could be assigned to partners, even after archiving. The change ensures that a unique DateV ID is always required, regardless of a partner's active status, preventing data inconsistencies. This improves the accuracy of financial reporting for German businesses.
Original PR description
Currently, it is possible to set a DateV identifier on a partner even if it is already assigned to an archived partner. This leads to duplicate identifiers if the archived partner is later…
Currently, it is possible to set a DateV identifier on a partner even if it is already assigned to an archived partner. This leads to duplicate identifiers if the archived partner is later unarchived. ### **Steps to reproduce:** 1) Install **l10n_de_reports, Contacts** App with Demo Data. 2) Switch to a **DE company**. 3) Create a contact 'Test-A' and set `'DateV Vendor' to 123456789` in the **Accounting Section**. 4) Archive 'Test-A'. 5) Create 'Test-B' and set `'DateV Vendor' to 123456789`. 6) Unarchive 'Test-A'. ### **Observed Behavior:** 'Test-B' is created successfully. After step 6, both 'Test-A' and 'Test-B' are active with the same DateV identifier. ### **Expected Behavior:** A validation error should be raised when trying to save 'Test-B', stating that the identifier is already defined. ### **Root Cause:** Since [this commit](https://github.com/odoo/enterprise/commit/733c4ba1fd5558891ffdbc67066c3a3a5938e2f0), company-dependent fields are stored as JSONB in the database. Due to this improvement, the previous SQL constraint (which enforced uniqueness across all records) was removed and replaced with a Python constraint. However, the new Python constraint utilizes `search_count`, which by default filters out archived records (`active=False`). This allows the reuse of identifiers belonging to archived partners, breaking the uniqueness requirement that existed in previous versions. Fix: Update the `_check_datev_identifier` and `_check_datev_identifier_customer` constraints to use `with_context(active_test=False)`. This ensures that the uniqueness check considers all partners, including archived ones. opw-5474106 Forward-Port-Of: odoo/enterprise#106146
This update resolves an issue preventing payroll users from accessing the 'One-time payments' feature within Swiss company contracts. The fix allows payroll officers and managers to open this functionality, ensuring proper processing of payroll-related transactions. The change was triggered by a restriction on access to internal action records.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll…
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll Officer/Manager access. 4. Log in as that user, create a contract, and click on "One-time payments". Issue: --------- A Traceback with AccessError: ```You are not allowed to access 'Action Window' (ir.actions.act_window) records.``` Cause: ---------- https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/l10n_ch_hr_payroll_elm_transmission/models/hr_contract.py#L195 The code attempts to call `.read()` on an `ir.actions.act_window` record. Standard users typically do not have read access to window action records, resulting in an **AccessError** even if they have rights to the payroll data. Solution: ------------- Use [_for_xml_id](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L187) to return action content for the provided xml id in a safe way by doing [sudo](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L205) internally to bypass the access restriction. opw-5491467 Forward-Port-Of: odoo/enterprise#106598
This update fixes an issue where CFDI refund XMLs were using a generic description instead of the original line description. The change ensures that refund details are accurately reflected in the CFDI document, aligning with previous updates and improving compliance. This impacts Mexican VAT reporting.
Original PR description
Steps to produce: --- - Install `accountant` and `l10n_mx` modules. - Switch to Mexican company. - In Settings, under `Authorized Certification Provider (PAC)`, set PAC to `Solución Factible`. -…
Steps to produce: --- - Install `accountant` and `l10n_mx` modules. - Switch to Mexican company. - In Settings, under `Authorized Certification Provider (PAC)`, set PAC to `Solución Factible`. - Create new invoice > set customer to `INMOBILIARIA CVA`, payment way to `Efectivo` and product as `Large Meeting table` > confirm the invoice. - Mark the invoice as global. - Register the payment. - Create a credit note and confirm it. - Click Send(make sure CFDI is checked) and check the generated XML. Issue: --- - The CFDI XML sets the `Descripcion` field to the default value `Devoluciones, descuentos o bonificaciones`. Solution: --- - Preserve the original line description for CFDI refunds instead of forcing the generic label. - For POS refunds, continue using the generic label. - This aligns with the fix introduced in 19.0([here]). Before: --- <img width="519" height="60" alt="image" src="https://github.com/user-attachments/assets/75066bdb-5fba-4959-bf16-8b2953bc40d5" /> After: --- <img width="615" height="56" alt="image" src="https://github.com/user-attachments/assets/bd93d0af-957f-47fc-b65c-3ec16c4b8f10" /> [here]: https://github.com/odoo/enterprise/pull/97681/changes/515410ec45541e6c07f892a094bb0aa57f479436 **Backport of https://github.com/odoo/enterprise/pull/97681** opw-5870052 --- Forward-Port-Of: odoo/enterprise#107367
This update resolves a bug where autofilling pivot cells with incorrect relational IDs caused the application to crash. The fix ensures that autofill functionality continues to work while preventing tooltips from triggering errors. This improves the reliability of pivot table data entry.
Original PR description
If you try to autofill a pivot cell that has an invalid relational id in its domain (eg. `=PIVOT.HEADER(1, "stage_id", 99999999)`), the autofill actually works but the tooltip make everything crash. Task: [5913754](https://www.odoo.com/web#id=5913754&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#107502 Forward-Port-Of: odoo/enterprise#106601
This update corrects a visual issue on mobile devices where the public knowledge sidebar would overlap with article content while scrolling. The fix ensures the sidebar functions as a proper mobile overlay, providing a consistent and readable experience for users accessing knowledge articles on their phones. This improves usability and prevents a distracting visual problem.
Original PR description
Steps to reproduce: 1. Install `website_knowledge` 2. Create a long, scrollable knowledge article with 20 sub-articles. 3. Share the article publicly 4. Open the public link in mobile view (logged…
Steps to reproduce:
1. Install `website_knowledge`
2. Create a long, scrollable knowledge article with 20 sub-articles.
3. Share the article publicly
4. Open the public link in mobile view (logged out)
5. Toggle the sidebar using the top-left menu button
6. Scroll down
Issue:
- On mobile, the public sidebar overlaps with the article's content while scrolling.
Cause:
- the sidebar and its backdrop were positioned absolutely inside a flex container. Because they were not fixed to the viewport, the article content continued to scroll and render underneath the sidebar, causing visible overlap between the sidebar and the article body. Additionally, the sidebar’s internal scroll container was not explicitly positioned, which contributed to inconsistent scrolling behavior when the sidebar was open.
Solution:
- Update the public Knowledge sidebar css to behave as a proper mobile overlay by: Fixing the sidebar and its backdrop to the viewport using position: fixed, ensuring they are removed from the flex layout flow on mobile Explicitly positioning the sidebar’s internal scroll view to ensure correct scrolling behavior
<table>
<tr>
<td><strong>Before</strong></td>
<td><strong>After</strong></td>
</tr>
<tr>
<td><img width="725" height="901" alt="Before image" src="https://github.com/user-attachments/assets/33190684-5b52-4931-b01a-5044734c9cf0" /></td>
<td><img width="686" height="916" alt="After image" src="https://github.com/user-attachments/assets/610a5aef-3467-4215-a0a0-83607375a016" /></td>
</tr>
</table>
opw-5384026
Forward-Port-Of: odoo/enterprise#103135This update resolves an issue where archived employees were still visible in the attendance Gantt view. The change ensures that only currently active employees are displayed, improving data accuracy and clarity for HR reporting. This prevents confusion and ensures users only see relevant attendance information.
Original PR description
Steps to reproduce: 1. install `hr_attendance_gantt` 2. create an employee 3. make attendance records for the employee in the previous months 4. archive the employee When opening the gantt view of the attendance, a row appears for the archived employee, with no attendance showing up. This commit adds a constraint to only show the active employees. opw-5490119 Forward-Port-Of: odoo/enterprise#106486
This update corrects a bug where a new Mexican invoice was automatically marked as 'public' when no customer was selected. The fix ensures the 'public' checkbox remains unchecked unless a customer is specified, preventing incorrect reporting for invoices. This improves data accuracy and compliance with Mexican tax regulations.
Original PR description
Steps to produce: --- - Install `l10n_mx` and `accountant` modules. - Switch to a Mexican company. - Go to Accounting > Customers > Invoices. - Click on New to create a new invoice. Issue: --- - The `CFDI to Public` checkbox is automatically checked even when no customer is selected. Root cause: --- - Here at [1], the field l10n_mx_edi_partner_address_complete evaluates to False when no partner is set. - Due to the OR condition, this causes l10n_mx_edi_cfdi_to_public to be set to True, even though no partner has been selected yet. Solution: --- - We should only evaluate partner address completeness when a partner is explicitly set. - Also, add VAT check for `l10n_mx_edi_partner_address_complete`, as requested by mial(PO). [1] https://github.com/odoo/enterprise/blob/cc00e8f3bb75b8c782fea3a42ad3bbcdbc240e2f/l10n_mx_edi/models/account_move.py#L649 opw-5911542 --- Forward-Port-Of: odoo/enterprise#106943
14 changes
Resolved issues and error corrections
This update fixes a bug in the onboarding tour for holiday requests. The tour previously failed when the yearly calendar displayed an initially disabled weekday cell (due to January 1st falling on a weekend). By excluding disabled calendar slots, the tour now reliably selects the correct 'first Thursday' for navigation, ensuring a smoother user experience.
Original PR description
Before, the tour attempted to click the “first Thursday” by selecting the first .fc-day-thu element in the DOM. The yearly calendar sometimes renders an initial “empty”/disabled weekday cell (when Jan 1 is Fri/Sat/Sun), so the first .fc-day-thu can be a disabled slot with no actionable element. That makes firstChild de-facto empty and the tour fails (seen reproducibly when the server date is set to years like 2027/2028, for example). Excluding .fc-day-disabled makes the selector target the first real Thursday cell task-5930501 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue preventing payroll users from opening the 'One-time payments' section within contracts. The fix allows authorized payroll users to access this functionality, ensuring they can complete necessary payroll processes. The change utilizes a secure method to bypass access restrictions.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll…
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll Officer/Manager access. 4. Log in as that user, create a contract, and click on "One-time payments". Issue: --------- A Traceback with AccessError: ```You are not allowed to access 'Action Window' (ir.actions.act_window) records.``` Cause: ---------- https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/l10n_ch_hr_payroll_elm_transmission/models/hr_contract.py#L195 The code attempts to call `.read()` on an `ir.actions.act_window` record. Standard users typically do not have read access to window action records, resulting in an **AccessError** even if they have rights to the payroll data. Solution: ------------- Use [_for_xml_id](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L187) to return action content for the provided xml id in a safe way by doing [sudo](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L205) internally to bypass the access restriction. opw-5491467 Forward-Port-Of: odoo/enterprise#106598
This update fixes an issue where input fields weren't resizing correctly in some browsers, particularly Safari and Firefox. The change eliminates a reliance on outdated browser detection methods, ensuring consistent and accurate input field sizing across all supported browsers and preventing overflow.
Original PR description
Before this PR, `autoresizeInput` used a fixed buffer of `5px` to compensate for input borders. This caused incorrect sizing when inputs had thicker borders, leading to overflow issues. Safari 16 and…
Before this PR, `autoresizeInput` used a fixed buffer of `5px` to compensate for input borders. This caused incorrect sizing when inputs had thicker borders, leading to overflow issues. Safari 16 and earlier versions did not include padding and border in `scrollWidth`. To work around this, browser detection via regex was used to add a hardcoded extra value. A similar issue appeared in Firefox 145, where scrollWidth also excluded padding and border, causing inputs to overflow again. After this PR, The buffer is no longer hardcoded. The border width is now calculated dynamically and applied correctly to the final width. Browser sniffing has been removed entirely. Instead, the logic detects at runtime whether scrollWidth includes padding; if not, the missing padding is added to the computed width. This makes the behavior consistent across browsers and prevents overflow without relying on user agent checks. task-[5412025](https://www.odoo.com/odoo/project/1519/tasks/5412025) Forward-Port-Of: odoo/odoo#241315
This update fixes an issue where pasting XML into email templates didn't always work correctly, leading to malformed content. The change now automatically cleans and validates pasted XML, ensuring email templates are properly formatted and functional. This improves the user experience when creating and editing email templates.
Original PR description
Problem: Pasted HTML in email templates is not properly parsed. Cause: The pasted content can be valid XML. In that case, some self-closing elements (e.g. self-closing `t` tags) are not correctly parsed by the editor, leading to malformed content. Solution: Call the `fixInvalidHTML` utility when starting the edition to normalize the content and properly handle self-closing tags. Steps to reproduce: - Open an email template. - Add some content. - Toggle to code view. - Paste XML containing a self-closing `t` tag. - Observe that the content is not properly parsed. opw-5089487 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248624
This update resolves an issue where custom filter operators (like 'ends with') were not being correctly saved after a page refresh. Users were experiencing a confusing situation where the selected operator would revert to 'starts with'. This fix ensures that selected filter operators remain active, improving the usability of the custom filter creation process.
Original PR description
Steps to reproduce ================== - Go to Sign - Add a custom filter - Select the Display Name field - Select the "ends with" operator -> The "starts with" operator ends up being selected Cause of the issue ================== The ends_with operator is a virtual operator that should be restored after a render opw-5714125
This update corrects a display issue in the employee offer screen for the Belgium payroll localization. Previously, a contract type field was incorrectly shown, which has now been removed. This fix ensures the correct offer screen display and avoids future duplication in subsequent Odoo versions (starting 19.0).
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#104578
This update fixes an issue where table menus would overflow and prevent users from accessing table UI menus when hovering over lists within table cells. The change introduces a local overlay to contain the table menu, ensuring menus are always displayed correctly when hovering over list elements, improving the user experience.
Original PR description
**Current behavior before PR:** - Table menu handlers could overflow into adjacent table areas when the targeted part of the table was only partially visible within the container. - When a table cell contained a list, hovering over the list element did not display the table UI menus, even though the mouse was inside the cell. **Desired behavior after PR is merged:** - Use a local overlay for the table menu to prevent overflow into adjacent cells. - Table UI menus are now correctly displayed when hovering over list elements inside a table cell. task-5353518
This update fixes an issue where the default putaway strategy wasn't consistently applied, leading to incorrect location assignments during manufacturing and by-product processes. The change ensures the strategy defaults to child locations, aligning with expected workflow and improving inventory management accuracy.
Original PR description
Steps to reproduce ----- - Enable locations & by products - Create 4 locations - View A of type view (parent: Stock) - View B of type view (parent: Stock) - Storage A of type internal location…
Steps to reproduce ----- - Enable locations & by products - Create 4 locations - View A of type view (parent: Stock) - View B of type view (parent: Stock) - Storage A of type internal location (parent: View A) - Storage B of type internal location (parent: View B) - Create a "Manufacture to A" route - Rule 1: Manufacture, Stock -> Stock - Rule 2: Push To, Internal Transfer, Stock -> View A - Create a "By Products to B" route - Rule 1: Push To, Internal Transfer, Stock -> View B - Create a "Bonus" product with route "By Products to B" - Create a "Finished" product with route "Manufacture to A" - BoM with "Bonus" as by product - Create a MO for Finished, and produce it - Open the linked transfers' list view - Open the "Bonus" transfer > "Destination Location" states View B - Open the line's details (hamburger button) > "Store To" states View A/Storage A Cause ----- When retrieving the location in https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_move_line.py#L280-L282 we pass `locations` as a context key. The problem is that `locations` contains the childs of **all** of the SMLs' locations https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_move_line.py#L260 This means that, in `_get_putaway_strategy`, when no `putaway_location` is found, we end up defaulting to the first element of the list https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_location.py#L370-L371 which might not be a child of the location. Solution ----- By removing the context key, locations get populated as such https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_location.py#L328-L330 This is ok because we know the call to `_get_putaway_strategy` is made on a single record (`sml.move_id.location_dest_id`) so the default will correctly be a child of said location. ----- Ticket: opw-5359945
This update grants the Invoicing & Banks group within the enterprise version of Odoo access to essential reports, specifically 'Statement Reports'. This enhancement improves reporting capabilities for this key group, allowing them to better manage financial data.
Original PR description
In enterprise, we are allowing the Invoicing & Banks group to have access to basic reports, including 'Statement Reports' task-5925567 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where Invoicing and Banks users were unable to access certain basic reports. The change adds necessary security permissions, allowing these groups to view key reports related to partner ledgers and tax units, improving usability and functionality.
Original PR description
* Revert commit https://github.com/odoo/enterprise/commit/86c3c212bb79fbc2becac46f4d83b6f2fc381854 that introduced having Accounting features, menu items, and Account on invoice lines available for Invoicing users. * Allow Invoicing & Banks group to access basic reports * Backport missing access rights to properly open the reports without an access error. task-5925567
This update fixes an error in the Time Off balance report that was incorrectly calculating remaining time off days for employees with allocations across different periods. The fix reorders allocations by start date to ensure accurate calculations when filters are applied. This ensures employees see the correct remaining time off balance.
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
This update resolves an issue where customers placing multiple Click & Collect orders from different store locations could inadvertently create duplicate address records. The fix ensures correct address hierarchy management, preventing confusion and streamlining the order process for customers.
Original PR description
## Versions 18.0+ Not visible in 19.0 because the UI prevents this behavior but it still occurs in the backend. ## Issue In eCommerce, when a customer places an order for in-store pickup at one…
## Versions
18.0+
Not visible in 19.0 because the UI prevents this behavior but it still occurs in the backend.
## Issue
In eCommerce, when a customer places an order for in-store pickup at one location, then places another order for pickup at a different store, a problematic address record can be created iff they select the previously used store address (created during the first order) as the delivery address.
This leads to a third address being created with a name combining both store locations, due to improper address parent-child relationships.
## Steps to reproduce
With Admin user:
- In Inventory's "Warehouses", duplicate the existing warehous:
- Change the duplicated one's address (create one if needed).
- Activate "Click & Collect" in Settings app;
- Setup "Pickup Locations":
- Under "Pick up in store", add both warehouses.
- Go to a storable and published product (eg. Acoustic Bloc Screens):
- Set On Hand quantity to at least 2 units per warehouse.
With Portal user logged in:
- Access the shop:
- Order 1 unit of the setup product;
- Process checkout up to Delivery step:
- Select user's address (only available "DELIVERY ADDRESS");
- Select a store location;
- Confirm and finalize the order.
- Order 1 unit of the setup product (bis);
- Process checkout up to Delivery step (bis):
- Select the store address (newly created "DELIVERY ADDRESS");
- Select the other store location;
- Confirm and finalize the order.
- Order 1 unit of the setup product (ter);
- Process checkout up to Delivery step (ter):
- A third address shows up named after both store locations.
## Cause
The `_action_confirm` method looks for an existing partner based on `parent_id`: https://github.com/odoo/odoo/blob/d80628a45bcfe5192f1b95286a6758fe6616fbec/addons/delivery/models/sale_order.py#L169-L176
The issue comes from:
https://github.com/odoo/odoo/blob/d80628a45bcfe5192f1b95286a6758fe6616fbec/addons/delivery/models/sale_order.py#L164 https://github.com/odoo/odoo/blob/d80628a45bcfe5192f1b95286a6758fe6616fbec/addons/delivery/models/sale_order.py#L178-L189
On the first order:
- A new delivery address is created.
- Its `parent_id` is set to the customer (order partner).
On the second order:
- The user selects the previously created store address as delivery address.
- Odoo sets the `parent_id` of the new address to this store address (instead of the customer).
- This creates an unintended hierarchy, causing further confusion in subsequent orders.
opw-5340953This update resolves a bug where clicking the 'More options' button in the HTML editor caused it to lose focus. Additionally, it corrects a filtering issue within the powerbox, ensuring commands are properly displayed when typing. This improves the editor's usability and responsiveness.
Original PR description
**Issue 1:** Steps to Reproduce - Click on the More options button in the power buttons. - The powerbox opens, but the editor loses focus and the button receives focus. Description of the issue: -…
**Issue 1:** Steps to Reproduce - Click on the More options button in the power buttons. - The powerbox opens, but the editor loses focus and the button receives focus. Description of the issue: - After clicking the power button, the button becomes focused and the editor loses focus. Solution - When clicking the power button, after the command is executed in the click event, explicitly restore focus to the editable area so the editor remains focused. **Issue 2:** Steps to reproduce - Click More options in the Power Buttons to open the powerbox. - Start typing `heading`. Description of the issue: - The powerbox does not filter commands and continues to show all commands. Cause: - In `search_powerbox_plugin`, commands are filtered only when `shouldUpdate` is true. - `shouldUpdate` is set only when the powerbox is opened through `search_powerbox_plugin`. - Power Buttons open the powerbox via `powerbox_plugin`, so `shouldUpdate` remains false and filtering is not triggered. Solution: - Introduced `openSearchPowerbox` in `searchPowerboxPlugin`. - Updated the implementation to use this method instead of `openPowerbox` in `search_powerbox_plugin`. - Instead of opening the powerbox via `powerbox_plugin`, it is now opened via `search_powerbox_plugin`, ensuring `shouldUpdate` is set correctly and commands are filtered on keypress. task-5485088
This update resolves an issue where the delivery charge was being calculated twice during Stripe express checkout, leading to incorrect order totals. The fix ensures accurate delivery pricing by excluding delivery lines from tax calculations. This improves the customer experience and prevents financial discrepancies.
Original PR description
Versions: --- - 17.0+ Issue: --- Delivery amount is doubled in stripe express payment checkout. Steps to reproduce: --- 1- Setup a stripe payment express checkout. (In my client case it is apple pay…
Versions: --- - 17.0+ Issue: --- Delivery amount is doubled in stripe express payment checkout. Steps to reproduce: --- 1- Setup a stripe payment express checkout. (In my client case it is apple pay express checkout but we also reproduced it in google pay) 2- Set fixed price on standard delivery: 10 3- Navigate to website: add a product to cart. Use express checkout. Outcome: The delivery price is calculated twice which is wrong. Cause: --- This regression is due to #238574. Once `/compute_taxes` is called, there is delivery lines included in SO. As a result returning `amount_total` will cause `this.paymentContext['minorAmount']` to include delivery amount. Then we add delivery carrier `minorAmount`: https://github.com/odoo/odoo/blob/469220cde82ecebf4a59451cc1325add6bfc3e69/addons/payment_stripe/static/src/js/express_checkout_form.js#L188-L196 Which cause delivery amount be added twice. Fix: --- We could exclude delivery amount from total amount in `express_checkout_shipping_address_compute_taxes`, which is going to calculate the tax for lines excluding delivery lines. opw-5424398 Forward-Port-Of: odoo/odoo#248415
11 changes
Resolved issues and error corrections
This update resolves an issue where Peppol invoices were incorrectly using the wrong company context, leading to errors and inconsistencies when processing invoices between different companies. The fix ensures that invoices are processed with the correct company information, preventing data mismatches and improving data accuracy for cross-company transactions.
Original PR description
Currently, the created move does not always use the company context of the related move/proxy user. As a result, default values may be taken from another company, which can lead to cross-company inconsistencies and access errors. Steps to reproduce: - Set up two companies, A and B - In company A, configure a default value for the partner.company_id field, applicable only to company A - When a Peppol invoice arrives for company B but is processed using the context of company A, and a new partner must be created, the partner is created with company A as the default value - This results in an incompatible companies on record error This fix ensures that the company context of the move or EDI user is used when creating the move, preventing cross-company issues. opw-5473233 Forward-Port-Of: odoo/odoo#249059
This update corrects a problem where the e-dispatch XML generated by the Nilvera integration was failing validation due to a missing customer tax office. The fix adds this required information and includes a validation check to ensure it's present before the XML is created, preventing rejection by GIB validation.
Original PR description
Problem: - The generated e-dispatch XML was missing the customer tax office name, marking XML to be rejected or incomplete in GIB validation. After this commit: - Added the missing customer tax office name in the e-dispatch XML. - Introduced a validation check to ensure the tax office field is set before XML generation. task-5013706 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures that One Stop Shop (OSS) invoices for intra-EU B2C sales in Italy are correctly formatted for the Italian Revenue Agency (Agenzia delle Entrate). The change introduces a specific XML structure to accurately represent VAT amounts, resolving previous rejection issues by the SDI and ensuring compliance with FatturaPA regulations.
Original PR description
This commit aligns the Italian e-invoicing (FatturaPA) generation for One Stop Shop (OSS) transactions with the requirements of the Italian Revenue Agency ( Agenzia delle Entrate). Current behavior:…
This commit aligns the Italian e-invoicing (FatturaPA) generation for One Stop Shop (OSS) transactions with the requirements of the Italian Revenue Agency ( Agenzia delle Entrate). Current behavior: Invoices for intra-EU B2C sales (OSS) are generated with a single line containing the foreign VAT rate. This is rejected or considered non-compliant by the SDI because foreign VAT cannot be typically exposed in the standard way for Italian electronic invoices. New behavior: The XML generation logic has been updated to follow the specific codification required for OSS operations: 1. Invoice Lines (`DettaglioLinee`): - The product line is reported with 0% VAT and Nature 'N7' (VAT paid in another EU member state). - A new, separate line is injected to represent the VAT amount, classified with Nature 'N2.2' (Non-taxable/Other). 2. Tax Summary (`DatiRiepilogo`): - The original foreign tax lines are excluded from the summary. - Synthetic summary lines are added for the 'N7' (Taxable Base) and 'N2.2' (VAT Amount) categories. Implementation details: - Added `_l10n_it_is_oss_tax` helper to identify OSS taxes. - Modified `_l10n_it_edi_get_line_values` to split OSS lines. - Modified `_l10n_it_edi_get_tax_values` to adjust the tax summary. task-4711509 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 ensures that the Studio XML editor only translates views for the currently selected website, preventing unintended translations from other websites in the database. This improves the user experience by focusing translations on the relevant website content, resolving a previous issue where the default website's language was always used.
Original PR description
Problem: When opening the Studio XML editor when Website is installed, the translation terms corresponding to the Default Language of the first website in the database are used. This behavior should only be applied to the HTML/CSS Editor in Website. Purpose: Modify Website's override of get_related_views to only return translated views when called with a specific website in context. This is done here by adding a context flag, as to not interfere with customizations made in stable versions. This will be changed for master. Steps to Reproduce in Runbot: 1. Activate a non-English (US) language. 2. Add this language to the Website with the lowest ID in the database, then set it to the Default Language of the Website. 3. Enter Studio and navigate to a view that has translation terms in its view (ex. Invoice PDF Report), then open the XML editor. opw-5136124
This update fixes a problem where large image uploads would fail, causing a confusing user experience. Now, uploads can be safely aborted, preventing errors and ensuring a smoother, more predictable process for users. The fix eliminates unexpected uploads after discarding the media dialog.
Original PR description
Steps to Reproduce: 1. Open the website module. 2. Open the media upload dialog to upload an image by either double-clicking the logo or replacing the existing image. 3. Upload a large file. 4. Abort the upload before it finishes by clicking the 'Discard' button in the media dialog box. After performing these steps, a traceback is observed. Before this commit: - Image upload failures would throw uncaught exceptions. - These exceptions would interrupt the flow and result in a poor user experience with no clear feedback. - Even after clicking the discard button the image was still getting uploaded. After this commit: - Uploads can be safely aborted when the media dialog is discarded. - Ongoing XHR requests and RPC calls are properly cancelled. - The upload loop stops immediately when an abort is triggered with no traceback. - Users get a predictable and clean exit instead of a broken state. - Files are no longer uploaded after clicking Discard. ### task-4752497
This update resolves a problem preventing Virtual IoT boxes from downloading handlers due to a limitation in Python's SSL verification process on Windows. The change ensures secure certificate validation by explicitly using a trusted certificate package, maintaining security while restoring functionality.
Original PR description
In PR #233423, we rightfully removed `cert_reqs='CERT_NONE'` to enforce secure certificate validation during IoT handler downloads. However, this exposed a blind spot in Python's `urllib3` library on Windows. Because `urllib3` defaults to the host's underlying certificate list (which is limited on Windows) instead of the installed `certifi` package, Virtual IoT boxes get the following error during handler downloads: `certificate verify failed: unable to get local issuer certificate` This commit restores the broken flow while maintaining security by explicitly passing `certifi.where()` to the `urllib3.PoolManager` via the `ca_certs` parameter. opw-5902549 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A recent test failure related to the eWallet checkout process has been fixed. The update ensures the system correctly applies the eWallet discount and updates the total amount before proceeding to the final payment step, preventing checkout errors.
Original PR description
In the `shop_sale_ewallet` tour, a Runbot error was triggered because the test would add a $50 product to the cart and immediately click the checkout button after selecting eWallet. This sometimes caused the eWallet to not be applied in time, leaving the total amount not updated to $0, and later the pay button could not be found. Solution: Ensure that after clicking on eWallet, the tour waits for the total amount to be $0 and for a success message confirming the code has been applied before proceeding to checkout. runbot-145574
This update ensures that invoice totals in the Italian e-invoice format (`l10n_it_edi`) are correctly expressed in EUR, as required by Italian tax regulations. Previously, the total was incorrectly using the invoice currency. This change aligns with government guidelines and avoids potential compliance issues.
Original PR description
With an `l10n_it` company: - Create an invoice in a foreign currency and export the XML. In the XML, the field `ImportoTotaleDocumento` is expressed in the invoice currency, while `Divisa` is set to…
With an `l10n_it` company: - Create an invoice in a foreign currency and export the XML. In the XML, the field `ImportoTotaleDocumento` is expressed in the invoice currency, while `Divisa` is set to the company currency. `ImportoTotaleDocumento` must be expressed in EUR, as stated in the following document: https://www.agenziaentrate.gov.it/portale/documents/20143/0/10FAQ+pubblicate+il+19+luglio+2019+(aggiornate+il+1+luglio+2021).pdf/6e8acb34-b7c5-730e-6a39-79c0a296e02b > L'art. 21, comma 2, lettera l) del d.P.R. n. 633/72 specifica che > “aliquota, ammontare dell'imposta e dell'imponibile con arrotondamento al centesimo di euro”. > Conseguentemente, se la fattura è emessa da soggetti residenti o stabiliti il codice da inserire nel campo `<Divisa>` > deve essere obbligatoriamente “EUR”. > Article 21, paragraph 2, letter (l) of Presidential Decree No. 633/72 specifies that > “the tax rate, the amount of the tax, and the taxable amount must be stated with rounding to the euro cent.” > Consequently, if the invoice is issued by resident or established taxpayers, the code to be entered in the `<Divisa>` > field must mandatorily be “EUR”. As a result, we now use the **company currency amount** for the `ImportoTotaleDocumento` field (assuming the company currency is always EUR for `l10n_it`). Ticket [link](https://www.odoo.com/odoo/project.task/5913088) opw-5913088
This update fixes an issue where overtime calculations were incorrect after a leave request was re-evaluated or switched back to validated. The system now automatically recalculates overtimes whenever leave information is changed, ensuring accurate overtime reporting for employees. This improves the reliability of time tracking data.
Original PR description
When we re-evaluate leaves we update overtimes after switching to draft but we do not update the overtimes again after the leave is switched back to validated. This causes the overtimes from attendances that overlap with the leave to be miscalculated as if the leave was not validated. To rectify this issue, we recalculate the overtimes for the affected employees after every create/write/unlink of `resource.calendar.leaves`. opw-4844447
This update fixes an issue where the system incorrectly predicted taxes on imported invoices. Previously, it relied on customer history, even if the XML invoice only contained one tax rate. Now, the system accurately uses the tax information directly from the imported XML file, ensuring correct tax calculations.
Original PR description
Context: When importing an XML invoice or vendor bill, the tax prediction was based on the customer’s invoice history. Example: if the imported invoice contains an item found in the history with two taxes (6% and 21%), the prediction would return both taxes (6% and 21%), even though only one tax is present in the XML file. The actual tax data present in the imported XML was not taken into account. After this commit, the prediction is more rigorous and correctly relies on the tax information provided in the XML (restricted search domain) task-5503126 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the ZATCA XML generation process would fail when an order had no payment due to full discounts. Now, the system correctly handles orders with zero payment, ensuring accurate ZATCA reporting. This prevents potential reporting errors and maintains data integrity.
Original PR description
Before this commit, when an order was fully discounted and therefore had no payment, the generation of the XML file for ZATCA would fail. opw-5928185 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr