Monday, December 29, 2025
15 changes · 19.0
New functionality added to Odoo
This update adds comprehensive automated tests for the POS Restaurant module's preparation display functionality. These tests, using a new testing environment, ensure the display works correctly and reliably, contributing to a more stable and dependable user experience. This work is part of a larger effort to improve the quality and stability of the Odoo Enterprise platform.
Original PR description
In this commit: --- - Added HOOT test coverage for the POS Restaurant module's preparation display. - Introduced `setupPosPrepDisplayEnv` to mock and initialize the preparation display test environment. - Added test coverage for core components, models, and service logic. - Adjust hoot case for pos_urban_piper. task-5225193 Related PR: - https://github.com/odoo/odoo/pull/234474 Forward-Port-Of: odoo/enterprise#102887 Forward-Port-Of: odoo/enterprise#98849
Enhancements to existing features
This update improves how Point of Sale test data is synchronized, especially when records are matched through stable identifiers. It also strengthens product category links in test data, helping ensure more reliable validation of Point of Sale behavior.
Original PR description
In this commit: --- - Improved `sync_from_ui` function to support record UUID-based relational mapping. - Added `pos_categ_ids` field in product data for better category linkage in tests. task-5225193 Related PR: - https://github.com/odoo/enterprise/pull/98849 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241349 Forward-Port-Of: odoo/odoo#234474
Resolved issues and error corrections
This fix prevents an error popup in Point of Sale when a cashier returns to an order that was started while offline using a Pine Labs terminal. The system now checks that the required transaction reference exists before requesting payment status, reducing checkout disruption for Indian POS users.
Original PR description
Steps: ---------- - Install pos_pine_labs and l10n_in module. - Create a payment method for the Pine Labs terminal in an indian company. - Configure the config with the Pine Labs payment method. - Open pos session process order till payment screen. - Go offline and try to add a Pine Labs payment method. - Go back online and create a second order using the plus (+) button in the navbar. - Switch back to the first order. Issue: ---------- - A pop-up error appears due to a missing `plutusTransactionReferenceID` key when switching back to the first order and trying to get Pinelabs' transaction status. Fix: ---------- - Ensure the payment status is fetched only when the `plutusTransactionReferenceID` key is available in the payment line. opw-5176160 Forward-Port-Of: odoo/odoo#233357
Miscellaneous changes
This pull request appears to be a trial change with no clear business-facing feature or issue described. Based on the available information, it likely has little to no impact on day-to-day Odoo use.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adjusts the minimum wage calculation within the Odoo Mexico payroll module to comply with new regulations announced by CONASAMI. Specifically, the daily minimum wage parameter has been updated to 315.04, effective January 1, 2026, ensuring accurate payroll processing for Mexican businesses.
Original PR description
According to CONASAMI: https://www.gob.mx/conasami/articulos/incremento-a-los-salarios-minimos-para-2026?idiom=es the minimum wage will increase effective January 1, 2026. It is necessary to update the “Mexico: Daily Minimum Wage” parameter to reflect the new value: 315.04 target: 19.0 task-5412717
This fixes an issue where clicking a segment in the Employee Skills pie chart could show an error instead of behaving safely. It improves reliability for HR users reviewing employee skill timelines and prevents a disruptive traceback in the report.
Original PR description
Clicking a record in the Employee Skills pie chart report currently triggers a traceback. Steps to reproduce the error: - Install ``hr_skills`` module with demo data - Open any employee > In Resume…
Clicking a record in the Employee Skills pie chart report currently triggers a traceback. Steps to reproduce the error: - Install ``hr_skills`` module with demo data - Open any employee > In Resume tab, Click on TIMELINE - Switch to Pie chart > click on any record Traceback: ```py UndefinedColumn: column hr_employee_skill_history_report.id does not exist LINE 1: SELECT "hr_employee_skill_history_report"."id" FROM "hr_empl... ``` ``hr.employee.skill.history.report`` model is ``_auto=False``, meaning that no database table is created for this model. In earlier versions, clicking on the record opens the list view. In the [commit](https://github.com/odoo/odoo/commit/341fe890d2b7001dab1e3cd65ecb0c3bb4ed327e), list view was removed. So, now clicking on the record will lead to the above traceback. [1]: https://github.com/odoo/odoo/commit/341fe890d2b7001dab1e3cd65ecb0c3bb4ed327e sentry-7099766240 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239416
Preparation tickets for self-orders now show key details such as the restaurant table number and point-of-sale configuration name. The order reference and time are also placed correctly, making tickets easier for staff to read and reducing preparation confusion.
Original PR description
Before this commit: =================== - Some details were missing from the preparation tickets, such as the table number and configuration name. - The order reference and time were not displayed in the correct positions. After this commit: ================== - Added the configuration name and table number to the receipt. - Corrected the placement of the order reference and time. Task: 5268966 | Before this PR | After this PR | |--------|--------| | <img width="511" height="431" alt="before" src="https://github.com/user-attachments/assets/ac5b2c45-5210-4a4e-86c7-953e2ab89eb1" /> |<img width="514" height="448" alt="after" src="https://github.com/user-attachments/assets/f1feb317-d5fe-469a-ab70-cf1dd793dce5" />| Forward-Port-Of: odoo/odoo#236847
Gift cards sold through Point of Sale will now be linked to the customer selected at checkout when no customer was already assigned. This makes it easier for staff to identify who bought a specific gift card while keeping the previous behavior when no customer is selected.
Original PR description
When buying a gift card from a POS, the gift card is created without a partner. This is an issue for users who want to see who bought a specific gift card. In…
When buying a gift card from a POS, the gift card is created without a partner. This is an issue for users who want to see who bought a specific gift card. In [`pos_loyalty/models/pos_order.py`](https://github.com/odoo/odoo/blob/0bf53e6b2ab8c4c1705ebbb776102d493ac7445c/addons/pos_loyalty/models/pos_order.py), the `coupon_data` passed to the `confirm_coupon_programs` method does not contain the `partner_id`. This happens because the *Gift Card* program is not considered "nominative", failing the following condition from `pos_loyalty/static/src/overrides/models/pos_store.js`: https://github.com/odoo/odoo/blob/0bf53e6b2ab8c4c1705ebbb776102d493ac7445c/addons/pos_loyalty/static/src/overrides/models/pos_store.js#L795-L801 In fact, the conditions for nominative programs are defined in the `loyalty` module: https://github.com/odoo/odoo/blob/0bf53e6b2ab8c4c1705ebbb776102d493ac7445c/addons/loyalty/models/loyalty_program.py#L196-L200 This fix uses the customer's id when there's no `partner_id` in the `coupon_data` coming from the Javascript side. If there's no customer selected when buying the gift card from the POS, `self.partner_id.id` evaluates to `False`, leading to the original behavior: a gift card with no partner. ### Steps to reproduce: 1. Install Point of Sale (`point_of_sale`) 2. In Settings > Point of Sale, toggle *Promotions, Coupons, Gift Card & Loyalty Program* 3. In the POS, open a register 4. On the product screen, select the *"Gift Card"* product and click *Payment* 5. On the payment screen, set the Customer to any customer, pay, and click *Validate* 6. In the POS backend, go to Products > Gift cards & eWallet, click the *Gift Cards* program, and click the *Gift Cards (1)* smart button 7. The gift card we just sold in the POS appears in the list, but there's no Partner assigned to it. opw-5261991 Forward-Port-Of: odoo/odoo#237807
This fix corrects how selected values and placeholder text appear in select menus used on frontend pages, including website slide upload dialogs. Users should now see clear, consistent input styling instead of blank or hard-to-read selected options.
Original PR description
*: website_slides This commit fixes the 'selected' display of the SelectMenu component in some frontend implementations. Previously, the visual style would be broken since the 'active' class was set on the element, having a blank text and background on selected items. The right 'selected' class is now used, to avoid difficulties to read the value, while still having some frontend specific styles working as expected. Also, the form-control and form-select classes are set using the togglerClass props. In future versions, we might be able to remove extension of the component in other modules (e.g. hr_contract_salary), ensuring the same style and behaviors accross all places. Before: <img width="1566" height="1115" alt="image" src="https://github.com/user-attachments/assets/6265c615-bd7a-47f6-9353-c503dd934fed" /> After: <img width="791" height="350" alt="image" src="https://github.com/user-attachments/assets/939b7109-a32f-4991-a169-13f501f29eb4" />
Updated the calendar behavior so it continues to work correctly when browser event handling changes in newer Chrome versions. This prevents a calendar-related automated flow from failing and aligns behavior across Chrome, Firefox, and Safari.
Original PR description
Tour "knowledge_calendar_command_tour" fails since Chrome 143 with an error "Cannot read properties of null (reading 'querySelectorAll')". This is due to the fix in Chromium "Fix target/relatedTarget…
Tour "knowledge_calendar_command_tour" fails since Chrome 143 with an error "Cannot read properties of null (reading 'querySelectorAll')". This is due to the fix in Chromium "Fix target/relatedTarget clearing logic during dispatch" [^1] introduced in Chrome 143, to actually match the spec [^2]. To quote the Chromium commit message: > According to the spec, only if the top node is in a shadow tree, both > the target and relatedTarget should be cleared. > However, if the top node is not in a shadow tree and not a document, > the target and relatedTarget are always cleared. Because the current > implementation only checks whether the top node is not a document. > So, this patch fixes the bug by checking whether the top node is in a > shadow tree. In practice, this means that events are now properly dispatched when the FullCalendar container's element is not connected to the document but still to the shadow tree. As a result, the OWL reference to this container can not exist anymore when the event handler is called but FullCalendar's API still has the right reference to this element. Note: Firefox and Safari already implemented the spec properly (aka. it was already broken for them...) [^1]: https://chromium.googlesource.com/chromium/src/+/63178146cd776eae2b466983f0835e86c314d051%5E%21/ [^2]: https://dom.spec.whatwg.org/#concept-event-dispatch Forward-Port-Of: odoo/odoo#240920
Video call permission prompts now show only the access options relevant to the user's action, such as microphone-only or camera-only. This reduces confusion by showing the combined microphone and camera option only when both permissions are still needed.
Original PR description
**Description of the issue/feature this PR addresses:** ---------------------------------------------- Currently, when requesting microphone permission in video calls, the "Use microphone and camera"…
**Description of the issue/feature this PR addresses:** ---------------------------------------------- Currently, when requesting microphone permission in video calls, the "Use microphone and camera" button is shown even though only microphone access is needed, or vice-versa. This creates confusion as users see an option to request permissions that aren't relevant to their current action. **Current behavior before PR:** ---------------------------------------------- - When clicking the microphone button in a video call, the "Use microphone and camera" button is shown if camera permission is not explicitly denied. - Users see permission options that don't match what they're actually trying to do (e.g., microphone button shows camera options). **Desired behavior after PR is merged:** ---------------------------------------------- - The "Use microphone and camera" button is only shown when neither camera nor microphone permissions have been granted yet. - When users click the microphone button, they only see microphone-related options unless they also need camera permissions. - When users click the camera button, they only see camera-related options unless they also need microphone permissions. - Permission dialogs are contextual and only show relevant options for the action being performed. Task-5367786 ---------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at https://www.odoo.com/submit-pr
This update fixes an issue where UrbanPiper orders were incorrectly displaying a payment difference after completion. The change ensures that the final payment amount is accurately reflected as $0.00, resolving a potential discrepancy and improving order accuracy for UrbanPiper transactions.
Original PR description
In this commit, The amount difference should be 0.0 after the Urbanpiper order has been paid. task-5441252 Forward-Port-Of: odoo/enterprise#102894 Forward-Port-Of: odoo/enterprise#102872
This update resolves an error that occurred when users removed the end date from a planning slot. The fix ensures the system handles the absence of an end date correctly, preventing a technical error and maintaining smooth slot management. This improves the user experience and prevents disruptions to planning workflows.
Original PR description
Currently an error occurs when user tries to remove end date on slot. Steps to replicate: - Install `planning`. - Create a new planning slot and click on a slot template at the top. - Remove the end…
Currently an error occurs when user tries to remove end date on slot.
Steps to replicate:
- Install `planning`.
- Create a new planning slot and click on a slot template at the top.
- Remove the end date (rightmost) and click elsewhere.
Error:
```
File /home/odoo/odoo18/enterprise/planning/models/planning.py, line 423, in _compute_template_id
if slot._different_than_template():
File /home/odoo/odoo18/enterprise/planning/models/planning.py, line 439, in _different_than_template
slot_time = self[slot_field].astimezone(pytz.timezone(self._get_tz()))
AttributeError: 'bool' object has no attribute 'astimezone'
```
Cause:
- When the end date was removed, [compute] was triggered, calling the `_different_than_template()` method, which iterates through the fields in the slot template.
- Since the user removed `end_datetime`, `self['end_datetime']` became false and caused the error at line [1].
Solution:
- Returned from the function call when `end_datetime` is false.
[compute]: https://github.com/odoo/enterprise/blob/745c1cc0e06f5e0578ec4383439f8be2419adb6b/planning/models/planning.py#L418-L426
[1]: https://github.com/odoo/enterprise/blob/745c1cc0e06f5e0578ec4383439f8be2419adb6b/planning/models/planning.py#L438
No ID
Forward-Port-Of: odoo/enterprise#102762This update fixes an issue where Sendcloud delivery address parsing incorrectly handled addresses with multiple dashes or slashes, such as those common in Austria. The change updates a key pattern to accurately capture address numbers with multiple separators, ensuring correct delivery address formatting and preventing potential delivery errors.
Original PR description
Issue ----- When creating a sendcloud delivery, addresses containing multiple dashes or slashes (eg Austrian addresses) have their number incorrectly parsed. Examples: Innsbruck Straße 8/1/13 -> 8/11 (should be 8/11/13) 7-3/11A Hochköning Straße -> 7-3 (should be 7-3/11A) Fix ----- Update part of the regex pattern from `\d+[-\/]?\d*` to `\d+(?:[-\/]?\d+)*` in order to match multiple occurences of one of '-', '\' or '/' followed by some number. ----- Ticket: opw-5366863 Forward-Port-Of: odoo/enterprise#101594
This update resolves an issue where users with basic employee management rights couldn't access employee appraisals. The fix ensures that only appraisers and administrators can access this feature, preventing errors and improving stability. This change aligns with security best practices by restricting access to sensitive appraisal data.
Original PR description
An error occurs when a user with `Employee Management` rights, but without any appraisal rights, tries to open an employee’s appraisals. **Steps to Reproduce:** 1) Install Appraisals App.(with Demo).…
An error occurs when a user with `Employee Management` rights, but without any appraisal rights, tries to open an employee’s appraisals. **Steps to Reproduce:** 1) Install Appraisals App.(with Demo). 2) Log in as admin, open Marc Demo in Settings > Users & Companies > Users, and set `Employees: Officer (Manage all employees)` under HR section. 3) Log in as Marc Demo and open any employee profile (e.g., Anita Oliver). 4) Click on `Appraisals smart button`. **Error:** `IndexError: tuple index out of range` **Root Cause:** When a user has only employee management rights, `self.appraisal_ids` received in the method at [1] becomes an empty tuple. Accessing `self.appraisal_ids[0].id` therefore raises an `IndexError`. **FIX:** If no `appraisal_ids` are available, return the list view of appraisals, matching the behavior from previous versions. [1]- https://github.com/odoo/enterprise/blob/3ee1df0b806f9c73d79b8b55fcc7d55b530d9e6b/hr_appraisal/models/hr_employee.py#L169-L180 sentry-7032734789