Thursday, December 11, 2025
18 changes · master
New functionality added to Odoo
This update improves the handling of Brazil's NFS-e tax reporting by incorporating ISO alpha-3 country code mappings. It also simplifies international transactions by skipping city validation for customers outside of Brazil. This ensures accurate tax calculations and compliance with Brazilian regulations.
Original PR description
In this commit: --- - Added a mapping to convert country codes to ISO aplha-3 format and included it in the Tax Calculation and NFS-e requests - Also updated the city validation to skip it for international transaction (customers outside Brazil). task-3851670
This update introduces support for Hong Kong's new eMPF platform, enabling companies to export CSV files for reporting employee contributions. This simplifies MPF compliance and provides a standardized method for data submission, aligning with evolving labor laws.
Original PR description
Implement support for eMPF in Odoo, with the ability to export csv files compliants with the eMPF. Forward-Port-Of: odoo/enterprise#98144
Enhancements to existing features
This update enhances the email notifications sent after a website is generated, providing a direct link to the newly created website. The email now dynamically adjusts its subject and utilizes the standard Odoo notification template, respecting the user's preferred notification method (inbox or email).
Original PR description
Improved import done email: - Dynamic subject - Uses the mail notification template - Button with url that redirects to the generated website (rather than the default published one). Also used the message_notify to respect the user choice for notification (odoo inbox or email).
Resolved issues and error corrections
This update resolves an issue preventing accountants from accessing invoices due to access rights restrictions within the system. The change allows accountants to process invoices by searching for records in sudo mode, bypassing the need for POS access permissions. This improves usability for a key user group.
Original PR description
The aim of this commit is to allow accountants to open the invoices without getting blocked because they don't own the pos access rights. Context: It seems that the ORM is now checking the access rights over M2M which creates a lot of access rights issues. Before this commit: The computation of `l10n_mx_edi_update_sat_needed` and the method `l10n_mx_edi_cfdi_try_sat` would cause an access right issue. Cause: The method `_get_update_sat_status_domain` could be override in l10n_mx_edi_pos and add a check on `<l10n_mx_edi.document>.pos_order_ids` on which the accountant might not have access. (The same issue would happens to a user processing a stock picking) After this commit: We search the domain in sudo mode and return unsudoed records allowing the user to pursue its task. opw-5263759 opw-5263824 Forward-Port-Of: odoo/enterprise#99590
This pull request improves the Stripe expense card experience by addressing visual issues, adding helpful notifications, and resolving critical bugs related to expense creation, validation, and shipping status updates. These changes enhance usability and ensure accurate expense tracking for users.
Original PR description
- Create Expense at the authorization instead of the capture
- Send a mail when a virtual card is assigned to someone
- Correct text inside card pause dialog
- Improve card look:
- Align date, pin and copy button on the card
- Fix physical card pin number not visible with dark mode
- Fix date horizontal alignment on pending physical cards
- Add Unlimited as placeholder on cards payement limits
task-4860676
Forward-Port-Of: odoo/enterprise#95523This update introduces the ability to apply dynamic surcharges to rental orders based on time periods and days of the week. Users can now configure flat or weekday-specific fees, providing greater flexibility in pricing rental agreements. Note that complex surcharge configurations can result in decimal adjustments to the final rental price.
Original PR description
This commit introduce a new model `product.pricing.surcharges` to enable users to configure additional fees for rental orders during specific periods. Two modes are supported: - 'flat': apply a flat…
This commit introduce a new model `product.pricing.surcharges` to enable
users to configure additional fees for rental orders during specific
periods.
Two modes are supported:
- 'flat': apply a flat surcharge for each day within the specified
period.
- 'per_weekday': define surcharges for specific weekdays within the
period (e.g., add +30% to the rental price every Sunday in December).
Surcharges are computed as the sum of applicable surcharge rates over
the rental period, multiplied by price_per_day. Partial days are
prorated by the fraction of the day reserved (hours / 24). For example,
a 6-hour reservation on a day with a +50% surcharge and price_per_day =
$100 results in (6/24) * 50% * $100 = $12.5.
Full example:
- Rule 1 (June 1st - June 30th): flat +10%
- Rule 2 (July 1st - July 31st): +15% every Monday, +30% every Sunday
For a rental order starting on June 25th @9pm and ending on July 13th
@6pm with a pricing of $700/week:
- Base price: 3x $700/week = $2100
- Price per day: $700 / 7 days = $100/day
- Surcharge breakdown:
- +10% from June 25th to June 30th (9/24 + 5 days)
- +15% on Monday, July 7th (1 day)
- +30% on Sundays, July 6th and 13th (1 + 18/24 days)
- Sum of surcharge: 5.375 * 10% + 1 * 15% + 1.75 * 30% = 121.25%
- Final price: $2100 + $100 * 121.25% = $2221.25
Two points to note:
- The surcharge is not added as a separate order line but is included
with the base rental price.
- Depending on the rental duration and the surcharge configuration, the
computed surcharges can add "unwanted" decimals to the final rental
price (see example above). This is especially true when dealing with
hourly periods.
task-4968689This update optimizes the process of generating account reports by replacing a slow data count with a faster query. The change significantly reduces report generation time, improving performance and responsiveness. This results in a smoother user experience for generating financial reports.
Original PR description
When generating working files, we did a _read_group that counted the number of move lines per account during the period. However we had no use for the number of move, so we can replace this by a query with EXISTS. With about 160000 move lines and 154 accounts, it went down from 2.48s to 4ms. Before: <img width="1919" height="574" alt="Screenshot_20251209_091543" src="https://github.com/user-attachments/assets/247d21f1-6c0b-4d8d-b4a3-5981c3dfde60" /> After: <img width="1920" height="581" alt="Screenshot_20251209_091509" src="https://github.com/user-attachments/assets/5c04e83d-b3ff-4a72-a3f6-c97c0235c3ea" />
This update adds a 'Cancelled' filter to the visitor report, making it easier for users to identify and analyze cancelled visits. This improves usability and allows for more efficient tracking of visitor interactions. It addresses a previous gap in reporting functionality.
Original PR description
Before: - The visitor report lacked a filter to show cancelled visits. After: - Added a "Cancelled" filter in the visitor search view for easier tracking. Impact: Improves usability by allowing users to quickly isolate cancelled visitor entries. Task- 5387265
This update prevents accidental modifications to core return type settings within the Enterprise system, safeguarding critical business processes. Users can still add new return types, but changes to existing master data are now restricted to prevent disruptions. A related fix improves error messaging for international data checks.
Original PR description
Issue: - Users can easily edit return types coming from master data. - Even small experiments (e.g., changing category or states) may break critical behavior. Solution: - For such records, made critical fields (category and states) readonly in the form view. - User added records remain fully editable. Impact: - Prevents accidental or harmful changes to predefined return types. - Still allows users to add their own return types safely. _Also added a fix to replace ValueError to ValidationError for return type’s country and report’s country check._ TaskID-5060125
This update enhances the IoT Box password reset process by integrating with the `iot_http` service via websocket. This change allows for a more secure and efficient method of resetting passwords, improving user convenience and security.
Original PR description
To allow resetting the IoT Box password using websocket, we now use the `iot_http` service. see odoo/odoo#239497 Task: 5169648
This update streamlines article management by introducing a convenient action dropdown in the sidebar and consolidating side panels for a cleaner user experience. It also adds a table of contents for easier navigation within articles, particularly those with multiple headings.
Original PR description
**[IMP] knowledge: add quick-action dropdown menu to article sidebar** This commit introduces an action dropdown in the article sidebar, allowing users to perform common tasks without opening the…
**[IMP] knowledge: add quick-action dropdown menu to article sidebar** This commit introduces an action dropdown in the article sidebar, allowing users to perform common tasks without opening the article. The menu provides options to: - Open the article in a new page - Toggle favorite - Rename article - Copy article - Move article - Open permission panel - Send to trash - View last edit info ---- **[REF] knowledge: merge all side panel into single panel** Previously, panels such as the chatter, comments, and property panels were implemented as separate widgets. As a result, opening multiple panels at once doesn't look good. This commit merges them into a single side-panel widget, allowing only one panel to be displayed at a time, and enabling users to switch between panels using the side-panel toggler. ---- **[IMP] knowledge: add toc panel for ease navigation** This commit adds a table of contents panel to improve article navigation, toggleable from the sidepanel toolbar. The TOC button is visible in the sidepanel toolbar when an article contains more than three headings. If the panel is already open and the user switches to different article that does not meet this condition, the button remains visible so the panel can still be closed. ---- **[IMP] knowledge: adapt tests/tours for sidepanel** This commit fix tests to align with side panel refactor and the addition of the table of contents panel. ---- **[IMP] knowledge: add anchor link overlay on readonly article** This commit add a overlay component to display anchor links in readonly and public articles, matching `HeadingLinkPlugin` behaviour since plugins aren't supported in readonly mode. Task-4813333
This update addresses a change in Facebook's data reporting, specifically the deprecation of the audience trend metric. We've temporarily adjusted our calculations to rely on total page follows, ensuring continued accurate reporting while we investigate a full solution. This change primarily impacts how we track page engagement.
Original PR description
Bug === Facebook deprecated some of the endpoints related to statistics https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics We fixed all metric except the audience trend,…
Bug === Facebook deprecated some of the endpoints related to statistics https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics We fixed all metric except the audience trend, because we needed a fix rapidly, and we wasn't sure about unfollow. And indeed, `page_daily_follows` only count for positive value, unlike the old `page_fan_adds` / `page_fan_removes`, and there's no equivalent of `page_fan_removes`... Example of data for a month: ``` page_follows 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 page_daily_follows 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 page_follows 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 page_daily_follows 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ``` So we now use `page_follows`, so the total value at a given time, and we look for the newest and oldest value (note that if we could do the same for `page_post_engagements`, then we could just make 2 APIs calls for the year stat). Task-5353390 Forward-Port-Of: odoo/enterprise#101625 Forward-Port-Of: odoo/enterprise#100275
This update resolves a problem where global discounts weren't correctly applied when splitting restaurant orders. The fix ensures discounts are consistently calculated and applied, regardless of whether the order is split, except during order transfers. This improves the accuracy of pricing and reduces potential errors for restaurant staff.
Original PR description
Steps to reproduce: - Order some products in a pos restaurant - Add a global discount - Split the order Issue: The global discount can be chosen to be splitted. Fix: The first fix is to apply the global discount each time we add a product. The second fix is to hide the discount when splitting, and recalculate the discount on each splitted order afterwards execpt when tranferring an order. task-5189067 Forward-Port-Of: odoo/enterprise#98222
This update resolves an error that occurred when users tried to link bank statements to invoices. Specifically, the system was failing when dealing with draft invoices that lacked an invoice date. The fix ensures the system correctly compares invoice and statement dates, allowing for accurate reconciliation.
Original PR description
Currently, an error occurs when a user sets the partner on a statement line. **Steps to Reproduce**([video](https://drive.google.com/file/d/1ZQBBh4yjSljeqqL_jT8dh_QJ6LtFZdPb/view)): - Install the…
Currently, an error occurs when a user sets the partner on a statement line.
**Steps to Reproduce**([video](https://drive.google.com/file/d/1ZQBBh4yjSljeqqL_jT8dh_QJ6LtFZdPb/view)):
- Install the `account_accountant` module.
- Go to `Invoices` and create `two invoices` with the `same partner` and the `same total amount` by adding
an `invoice line`.
- Go to the `Dashboard` and click `Last Statement` under the `Bank journal`.
- Create a `new statement line` with the `same amount` as the `invoice amount`.
- Click `Set Partner` and select the `same partner` used in the invoices.
`TypeError: '<=' not supported between instances of 'bool' and 'datetime.date'`
After [this commit], when a user sets the partner on the statement line, the system attempts to automatically reconcile the line. It then searches for a single invoice matching the statement line amount [1] and tries to select the one with the closest prior or equal date. However, draft invoices have not an invoice_date, and when the system attempts to filter on this field, and the error is raised [2].
This commit ensures that the comparison between invoice date and statement date occurs only when the invoice date is present.
[this commit]: https://github.com/odoo/enterprise/pull/98269
[1]- https://github.com/odoo/enterprise/blob/84ccb807852ab6b118466d12c8f02ea4da7fa3db/account_accountant/models/account_bank_statement.py#L585
[2]- https://github.com/odoo/enterprise/blob/84ccb807852ab6b118466d12c8f02ea4da7fa3db/account_accountant/models/account_bank_statement.py#L249
sentry-7063516380
Forward-Port-Of: odoo/enterprise#100576This update fixes an issue where batch barcode scanning wasn't working correctly with multiple pickings. The system now properly handles moves from different pickings within a batch, ensuring accurate tracking of inventory. This improves the reliability of batch management for users.
Original PR description
Steps to reproduce ----- - Enable batch pickings - Create a product - Create 2 receptions for the product (qty > 1) - Create a batch with the 2 transfers - Open the batch in barcode - Scan part of…
Steps to reproduce ----- - Enable batch pickings - Create a product - Create 2 receptions for the product (qty > 1) - Create a batch with the 2 transfers - Open the batch in barcode - Scan part of both pickings - Go back to the barcode main screen - Open the batch again > Both pickings have their demand = partially delivered quantity Cause ----- When leaving the page, we trigger https://github.com/odoo/enterprise/blob/91d6a096e88e4f11d7504d7a4052a57e2cb09ca8/stock_barcode/models/stock_move.py#L65-L68 in which we end up merging the moves together https://github.com/odoo/enterprise/blob/91d6a096e88e4f11d7504d7a4052a57e2cb09ca8/stock_barcode/models/stock_move.py#L51 This has been added by 9753c24 (ade0bef in 17.0) The problem is that `_merge_moves` merges all of the moves into the first of `merge_into` https://github.com/odoo/odoo/blob/26761e04bb648b46cd35697c6cbc8ed1e27fef90/addons/stock/models/stock_move.py#L1086-L1088 This, however, doesn't make much sense for batches because the moves can be from different pickings. ----- Ticket: opw-5163740 Forward-Port-Of: odoo/enterprise#101630 Forward-Port-Of: odoo/enterprise#100940
This update removes outdated code that was previously intended to display a cursor on the mobile keypad. The change directly addresses a usability issue, ensuring the keypad input cursor is correctly displayed for mobile users. This improves the overall user experience when using the VoIP feature.
Original PR description
task-5366961
This update resolves an issue where quickly typing a phone number could result in outdated information being displayed. By canceling old requests, the system now consistently shows the most recent phone number entered by the user, ensuring a better user experience.
Original PR description
Previously, when the user typed quickly, an older RPC request could resolve after a newer one, causing stale data to overwrite the correct result. This change ensures that any pending `parse_phone_number` request is cancelled (aborted) before a new one is started. This guarantees that the UI always displays the result corresponding to the user's latest input.
This update resolves an issue where AvaTax processes would fail if orders lacked at least one line item. This prevented accurate tax calculations and disrupted sales workflows. The change ensures that AvaTax only processes orders with valid line items, improving data accuracy and reliability.
Original PR description
Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the taxes related to MXXX - SOXXX/XXX. Please check the status of `Sales Order XXX` in the AvaTax portal.…
Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the taxes related to MXXX - SOXXX/XXX. Please check the status of `Sales Order XXX` in the AvaTax portal. Transactions must have at least one line. ``` There are various cases this can happen: 1/ if `industry_fsm_stock` is installed, empty orders are confirmed [1], 2/ if you put the `end_date` of a subscription before the `next_invoice_date`, then none of the lines are considered invoiceable [2] and you get the error when viewing the subscription in the portal This commit filters out orders without lines. It's also possible to filter this on the level of the models by doing it in `_get_and_set_external_taxes_on_eligible_records()`. However, this means doing it separately for each model, and requires every implementer do it manually. [1] https://github.com/odoo/enterprise/blob/703e7fd413e93a8287da98286aa93b9699ae3e96/industry_fsm_stock/models/project_task.py#L159 [2] https://github.com/odoo/enterprise/blob/c7bf4367a9bf6757a36a9f34a872a6e35a19a3a5/sale_subscription/models/sale_order_line.py#L475 opw-5214609 opw-5247727 opw-5311132 opw-5385960 Forward-Port-Of: odoo/enterprise#101643