Daily updates from Odoo
Tuesday, June 23, 2026
249 changes
21 changes
New functionality added to Odoo
This update simplifies connecting to remote SaaS databases. Users can now automatically authenticate when connecting, eliminating the need for manual login steps. This improves the user experience and streamlines access to data hosted on external databases.
Original PR description
## [IMP] databases: SSO smooth connection and setup The aim of this commit is to allow databases_user to be directly connected to any remote SaaS database to which they have access. When they click…
## [IMP] databases: SSO smooth connection and setup
The aim of this commit is to allow databases_user to be directly connected to
any remote SaaS database to which they have access.
When they click the "connect" button, they will bypass the login screen and be
authenticated automatically.
To achieve this, when a user tries to connect to an accessible SaaS database, we
quickly write their `oauth_uid` to that remote database right before the
connection is initiated.
Before this commit:
A user that was created in the remote db using the create user feature from the
databases module wouldn't get automatically authenticated through the Odoo
OAuth SSO feature.
After this commit:
Users attempting to connect to a SaaS database will be directly connected if the
settings was activated.
task-id: 6071808
## TODO:
- [x] check if we always have oauth_uid for saas db
- [x] think about making the oauth module autoinstall (make a bridge module? or overkill?)
- We can avoid that and have everything work in place directly, avoiding an inheritance nightmare at installation time.
- [x] handle cases where it isn't there on both the remote db and the managing one
- [x] write some tests to ensure the code is free from traceback
- [x] add a feature allowing to:
- [x] add it to all server on which the user has access
- [x] add it to a specific server (may require the db list view on `res.users`
- [x] remove the previous and do everything when the user click on "connect"
- [x] would be better to put the code in a new module with auto install => people get auto-install + no "hacky" code.
- The "hacky" code is not so hacky and with that we can directly advertise the installation of `auth_oauth` in an action
- [x] add a config in the settings
Forward-Port-Of: odoo/enterprise#112369Enhancements to existing features
This update clarifies the process for adding a signature within the HTML editor. Previously, users were instructed to 'Insert your signature from Sign'. Now, the system prompts users to 'Insert your handwritten signature', providing a more intuitive and accurate description of the expected input.
Original PR description
Purpose of this PR: - Replace 'Insert your signature from Sign' with 'Insert your handwritten signature'. task-6217718 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#267995
Resolved issues and error corrections
This fix resolves an issue where extra prices were incorrectly added to POS orders when using 'always' attributes for products. The change ensures that extra prices are now set on the combo creation page for 'always' attributes, aligning with the intended product variant behavior and preventing double-counting.
Original PR description
## Steps to reproduce - Create an attribute A, of type always, with 2 values, one should have an extra price - Create an attribute B, of type never, with 2 values - Create a product that has both…
## Steps to reproduce - Create an attribute A, of type always, with 2 values, one should have an extra price - Create an attribute B, of type never, with 2 values - Create a product that has both those attributes - Create a combo with that product with both values for A - Go to the PoS and order that combo with the value that has an extra price for A - The extra price is added ## Why the fix: For variants of type always, a product is created, meaning we can chose which products of this variants to have in our combo. As we can chose this, it means that we can and should chose the extra price on the combo creation page, not on the attribute page. It does not make sense to take the attribute extra price into account, as we do not take the unit price of combo items into account, so this extra price should be set on the combo page and we should ignore the attribute's extra price if the type is "always". The variants are then considered as different products, as they should in this case. If the type of the attribute is never, we can't chose which one gets an extra price on the combo page, so we should still take the attribute's extra price in this situation, as we have no other way to set it. We need to have both an always and a never attribute in order to reproduce this bug because if we only have "always" values, the configuration of the combo item is bypassed and is undefined, so **attribute_value_ids** will be undefined in this code and we won't get any value for the extra price in this code: https://github.com/odoo/odoo/blob/c09e8b2fc24ee75495fc947924e29cf5c601506f/addons/point_of_sale/static/src/app/models/utils/compute_combo_items.js#L44-L49 We now ignore the attribute's extra price if it's type is always, otherwise, it the behavior stays the same. opw-6262431 Forward-Port-Of: odoo/odoo#270894 Forward-Port-Of: odoo/odoo#268567
This update resolves an issue where recurring plans would disappear when updating a subscription product's quantity. The fix ensures that the selected plan is correctly recomputed and displayed after changes, improving the user experience for subscription management. It addresses a conflict arising from checks related to one-time purchase options.
Original PR description
# Introduction note This PR fixes two bugs introduced by the same commit : https://github.com/odoo/enterprise/commit/106d70a1ef0ddbd61a74b7cac82dfce1e316beaa The original commit fixed multiple issues…
# Introduction note This PR fixes two bugs introduced by the same commit : https://github.com/odoo/enterprise/commit/106d70a1ef0ddbd61a74b7cac82dfce1e316beaa The original commit fixed multiple issues regarding the display of recurring plans when the One-time purchase option was enabled, but it also introduced new ones. Theses new issues are due to multiple new checks on `allow_one_time_sale`, but this variable only indicates that the One-time purchase option is available to the user, not that it is actually selected. So the fixes of the original commit works when first loading the page, but fails when the content of the page is updated. # Shared steps - Activate Subscriptions & eCommerce modules - Create a subscription product, enable 'Accept One-Time' and publish it on the website # Bug 1 ## How to reproduce - Add atleast two recurring plans to the product - Go to the product page on the website - Select one of the recurring plans - Increase the quantity of the product ## The problem The recurring plan selection is removed ## Cause The condition `!combination_info.allow_one_time_sale` was added on the `t-att-checked` of the recurring plan selection display. This correctly fixed the issue when first loading the page, but when the user changes the price or the variant, the recurring plan are recomputed and rerendered : https://github.com/odoo/enterprise/blob/0b408acbadb2cfcbc844521f3244a06b7ae7be22/website_sale_subscription/static/src/interactions/product_page.js#L37-L40 When that is the case, that condition blocks the proper display of the selected recurring plan. ## Proposed Solution When loading the recurring plan selection, what defines wich plan is selected is the `subscription_default_pricing_plan_id` variable, which is based on the `plan_id` value given in the request to the server : https://github.com/odoo/enterprise/blob/0b408acbadb2cfcbc844521f3244a06b7ae7be22/website_sale_subscription/models/product_template.py#L222 We make it so if no `plan_id` is sent to the server and `allow_one_time_sale` is enabled, then the server does not give back any `subscription_default_pricing_plan_id` opw-6131532 # Bug 2 ## How to reproduce - Add an attribute with values A & B for the product - Define atleast two recurring plans for the variant with attribute B - Publish the product - Go to the product page - Select the variant with attribute B ## The problem The recurring plan is not displayed. If the order of the attribute is reversed, then it works as expected. ## Cause The pricings are correcly sent to the front-end but they are not added to selection because of the check on `allow_one_time_sale` : https://github.com/odoo/enterprise/blob/0b408acbadb2cfcbc844521f3244a06b7ae7be22/website_sale_subscription/static/src/interactions/product_page.js#L42-L50 opw-6132160 Forward-Port-Of: odoo/enterprise#120873 Forward-Port-Of: odoo/enterprise#115446
This update fixes a bug that prevented website options using composite actions from functioning correctly. Specifically, when a composite action with a 'getValue' was used, it wouldn't properly bind, leading to errors. A new test has been added to ensure correct action binding, improving website configuration stability.
Original PR description
In 18.4 the composite action isn't used extensively, so the problem was unnoticed. However, if you use it with an action that has a `getValue` set, you may get issues, since the action will not be bound. Possible way to reproduce the issue: - Create an option that uses the `composite` action - Set `customizeWebsiteVariable` as a first action in the `actionParam` - Click on an element that has that option => You'll get an error. Note, that testing just this would be useless, so I added a test that tests that the action uses the first `getValue`. Without this fix the test would crash since in `getValue` `this` is unbound. Forward-Port-Of: odoo/odoo#269873
This update resolves an issue where appointment invitations were sometimes sent even when appointments were in a 'requested' or 'cancelled' status. The change ensures invitations are only generated for appointments marked as 'booked', improving the user experience and preventing unnecessary notifications. This was addressed based on a related issue in the Enterprise version.
Original PR description
This PR adapts the code to fix the invitations at the appointments' update. See the enterprise PR to get more information about the issues. Enterprise PR: https://github.com/odoo/enterprise/pull/114304 Task-6139036 Forward-Port-Of: odoo/odoo#271116 Forward-Port-Of: odoo/odoo#260073
This update corrects errors in how appointment invitations are sent, ensuring they're only triggered for 'booked' or 'requested' appointments. Previously, invitations were sent regardless of appointment status, leading to unnecessary emails and incorrect notifications. This ensures accurate and timely appointment confirmations for users.
Original PR description
This PR fix three issues related to the sending of the appointment invitations. Each one has its own commit: - Commit 1 sends invitations only if the event either "booked" or "request". Previously they were sent even if the appointment was cancelled. - Commit 2 prevents the sending of regular invitations and always sends appointment invitation to new attendees of existing booked appointments. - Commit 3 sent appointment invitations if the status of an existing event is set "request". It also add the status change in the log as it would have been if it was done at the creation. Community PR: https://github.com/odoo/odoo/pull/260073 Task-6139036 Forward-Port-Of: odoo/enterprise#121213 Forward-Port-Of: odoo/enterprise#114304
A recent update caused the Point of Sale system to incorrectly add the 'S' variant when scanning a barcode for the 'M' variant of a product with dynamic attributes. This fix ensures that the correct variant is added based on the scanned barcode, improving the accuracy of sales transactions. The change corrects a logic error in how the system handles product variants with dynamic attributes.
Original PR description
Steps to reproduce ------------------ 1. Create a product with two attributes: - Size with values S and M (Variants Creation: "Instantly") - a second attribute with a single value (Variants Creation: "Dynamically") 2. Set a different barcode on the S and the M variant. 3. Open PoS, scan the barcode of M. -> The S variant is added instead. Why the issue ------------- In 390b48a1ba24, when a product has a single-value attribute set to "dynamic", we look for the first variant that has this value and use it instead of the preselected variant. This is wrong when several variants share this value: in our case both S and M have it, so scanning M is overridden by the first variant, S. The fix ------- We now keep the preselected variant if it already has this value, and only look for or create one otherwise. opw-6272739 Forward-Port-Of: odoo/odoo#268590
This update corrects a bug where reordering rules were incorrectly creating purchase orders linked to sales orders. Now, reordering rules will always generate new, separate purchase orders, ensuring accurate inventory management and preventing duplicate purchase orders. This improves order fulfillment efficiency.
Original PR description
Steps to reproduce the bug: - Go to contact: - azure interior: - Group RFQ: On Order - Create two storable products P1 and P2, both with the Buy route and Azure interior as vendor - Confirm a sale…
Steps to reproduce the bug:
- Go to contact:
- azure interior: - Group RFQ: On Order
- Create two storable products P1 and P2, both with the Buy route and Azure interior as vendor
- Confirm a sale order with P1 (MTO+Buy):
- a purchase order PO1 is created, linked to the sale order via reference_ids
- Create a reordering rule for P2 and trigger it
Problem:
The reordering rule procurement for P2 was merged into PO1 (the sale order's purchase order) instead of creating a new separate PO.
In _make_po_get_domain (purchase_stock/models/stock_rule.py), when group_rfq == 'default' (On Order), the domain only adds a reference_ids filter when the procurement carries reference_ids. When the procurement comes from a reordering rule (no sale order, no reference_ids), no filter was added, so the search matched any draft PO from that vendor, including PO1, which has reference_ids pointing to the sale order.
Solution:
When group_rfq == 'default' and the procurement has no reference_ids, add ('reference_ids', '=', False) to the domain so the search only matches POs that are also not linked to any sale order.
opw-6167835
Forward-Port-Of: odoo/odoo#270735This update resolves a bug where overtime was incorrectly generated when using timing rules with employer tolerances. The fix ensures that attendance limits are properly considered during overtime calculations, preventing unnecessary overtime charges. This improves accuracy and reduces potential payroll discrepancies.
Original PR description
**Version:** - 19.0 **Steps to reproduce:** - Create a rule of Timing type. - Add a tolerance for the employer. - Set the ruleset on the employee. - Add an attendance of less than the tolerance. **Issue:** - When using a Timing type rule with employer tolerance, overtime is still created even if the attendance is below the tolerance limit. **Cause:** - The timing rule calculation was missing the tolerance check that exists in the quantity rule calculation. **Fix:** - Added the missing tolerance check in the timing rule calculation. - Removed employee tolerance from view for timing rules. **Task-6064081** Forward-Port-Of: odoo/odoo#257079
This update ensures that the chatter within Odoo accurately reflects the employee who made changes to tracked orders. Previously, the system incorrectly attributed changes to the original order cashier. This fix uses the current session employee to provide accurate tracking, improving order management and reporting.
Original PR description
**Steps to reproduce:** - Enable "Track orders edits" in the settings - Enable "Log in with Employees" - Go to the Restaurant, log in with employee A - Go to a table, order 3 Sushis - Go back to the…
**Steps to reproduce:** - Enable "Track orders edits" in the settings - Enable "Log in with Employees" - Go to the Restaurant, log in with employee A - Go to a table, order 3 Sushis - Go back to the floor plan and change to employee B - Go back to the table and change the qty of 3 Sushis to 2 Sushis - Go to the order in the backend and check the chatter - It will indicate that employee A did the change, but it was employee B **Why the fix:** We always used the cashier set on the order to determine who should be put in the chatter, regardless of who is actually connected at that point. We now use the session's current employee to write who did the change in the chatter. We do not change the order's employee, because it will be done once the order has been paid. In the case where we are not logged in but pos_hr is installed, the employee_id might be the id of a res.user, and browsing it might return the wrong value. To avoid this, we check if the value exists as a hr.employee before assigning the name. The way we return the value has been changed because the linter wasn't happy about it. opw-6213504 Forward-Port-Of: odoo/odoo#270768 Forward-Port-Of: odoo/odoo#265582
This update clarifies the budget report by replacing generic labels like 'Budget 2026 x' with more specific names that include the associated analytic accounts. This makes budget lines easier to understand and differentiate, improving reporting accuracy and user experience.
Original PR description
Budget report grouping by budget line displayed the budget name for every line, which made different lines indistinguishable and produced labels like "Budget 2026 x", "Budget 2026 x (2)", etc. Compute a more specific display name for budget lines by appending the analytic accounts concerned by the line to the budget name. Also expose Budget Line as a first-class group-by in the Budget Report search view and apply it by default when opening the report. task-6293065 Forward-Port-Of: odoo/enterprise#121204
This update removes a restriction on phone number formatting during event registration. This simplifies the user experience and allows for more flexible input when signing up for events within the Point of Sale system. The change was made to address a minor technical issue and improve usability.
Original PR description
Following this commit: ===== - '+' constraint from number validation is removed while user register for any new event. task-6194962
This pull request updates the core spreadsheet component with several improvements and bug fixes. It addresses issues related to chart rendering, viewport behavior, and formula parsing, ensuring a more stable and reliable spreadsheet experience for users. These changes were made to enhance performance and address reported user issues.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/da121002d2 [REL] 19.3.8 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/da121002d2 [REL] 19.3.8 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/9c9ea4006a [FIX] viewport: fix viewport jump with frozen pane [Task: 6292764](https://www.odoo.com/odoo/2328/tasks/6292764) https://github.com/odoo/o-spreadsheet/commit/8c5b03b36e [FIX] composer_tokenizer: fix argument separator in formulas [Task: 6303210](https://www.odoo.com/odoo/2328/tasks/6303210) https://github.com/odoo/o-spreadsheet/commit/4a9480b602 [IMP] node: add script to run the model in node [Task: 6088515](https://www.odoo.com/odoo/2328/tasks/6088515) https://github.com/odoo/o-spreadsheet/commit/b9dd4f4ae4 [FIX] package.json: Update Node.js and npm engine requirements [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/5856475544 [FIX] carousel: custom color don't use carousels [Task: 6263128](https://www.odoo.com/odoo/2328/tasks/6263128) https://github.com/odoo/o-spreadsheet/commit/396acb35d2 [FIX] charts: pie chart shows empty chart for text entries [Task: 6275525](https://www.odoo.com/odoo/2328/tasks/6275525) https://github.com/odoo/o-spreadsheet/commit/ed39af1898 [FIX] charts: pass `onDataSetHover` to chart config [Task: 6233312](https://www.odoo.com/odoo/2328/tasks/6233312) https://github.com/odoo/o-spreadsheet/commit/3baf99b853 [FIX] table: correctly insert table on static pivots [Task: 6204984](https://www.odoo.com/odoo/2328/tasks/6204984) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update corrects a previous issue where the invoice status cron job only processed invoices for the main company within an Odoo instance. Now, it correctly fetches and updates the status of invoices across all companies within the system. This ensures accurate invoice tracking and reporting.
Original PR description
The invoice status cron was only fetching the main company's invoices. Fetch all companies' invoice statuses. Reference: https://github.com/odoo/odoo/pull/267144#discussion_r3441968099 no-task Forward-Port-Of: odoo/odoo#271227
This update resolves a crash that occurred when users tried to view Instagram videos within Odoo. The fix now displays the video link instead of attempting to render the video as an image, ensuring a stable preview experience. This improves usability and prevents disruptions for users accessing Instagram content.
Original PR description
Purpose ======= When we have a real on Instagram, we try to show the video as an image. When clicking on the broken image, the previewer crash. To fix that issue, we know show the link of the video in the message. Task-5491124 Forward-Port-Of: odoo/enterprise#121176 Forward-Port-Of: odoo/enterprise#113487
This update fixes an issue where bank verification timestamps were incorrectly interpreted, leading to display errors for users in Poland. The change converts timestamps from the local Polish timezone to UTC, ensuring accurate display and preventing incorrect time conversions.
Original PR description
The gov API returns a 'requestDateTime' in str format in PL timezone. This commit converts it back to UTC timezone for a better display in payment form. fields.Datetime assume the value is in UTC time and so when a field of this type is displayed, it's converted to the user timezone. This cause issue with the PL API call because the API will send us 9:25 PL TZ but if we store it directly, it will be interpreted by the ORM as 9:25 UTC and displayed to the user that's in UTC+2 as 11:25 task-6314380 Forward-Port-Of: odoo/odoo#270839
This update fixes an issue where scanning an unknown barcode in the POS system didn't automatically open the product creation form. The fix removes a redundant check for API keys, ensuring the form opens correctly regardless of whether a key is configured. Users can now seamlessly create products by scanning barcodes.
Original PR description
When scanning an unknown barcode in POS, the product creation form was never opened because `barcode_lookup()` was called with no barcode as an implicit API key check. Commit 0c8019a4aa7 ([FIX] product_barcodelookup: avoid crash on invalid image URLs) standardized `barcode_lookup_request()` to always
return a `requests.Response` object, removing the `{'authenticated': True}` dict it previously returned for HTTP 404 responses. As a result the JS check `response?.authenticated` was always falsy and the form never opened.
Fix: remove the API key check entirely. `allowProductCreation()` already gates on the user having product create rights, which is the only condition that matters. If a Barcode Lookup API key is configured the `_onchange_barcode` on the form will auto-fill product data; if not, the user can fill it in manually. Either way the form is always usable.
opw-6295221
Forward-Port-Of: odoo/enterprise#120256This update resolves a problem where users were incorrectly denied access to WhatsApp templates within the Event management system. The fix prevents users from creating new WhatsApp templates, which was causing the 'User does not have access' error. This ensures proper WhatsApp template functionality for events.
Original PR description
Issue: 1) User goes to Event.event Form -> communication tab -> add line 2) Select whatsapp -> type something -> create and edit -> create new template with any model event.registration -> save ( all the way including the event form) 3) reload page -> whatsapp event.mail displays "User does not have access to this record". Fix: add "'no_create_edit': True" to the associated field in the xml to block creation of new mail.templates opw-6037488 Forward-Port-Of: odoo/odoo#268641 Forward-Port-Of: odoo/odoo#259683
This update fixes an issue where the avatar in the Discuss section was displaying outdated information for archived employees. The fix prioritizes the correct employee data based on active status and user links, ensuring accurate details are shown. This improves the user experience when accessing employee information.
Original PR description
*: hr_holidays,test_discuss_full **Steps to reproduce,** Create an employee linked to a user Archive the employee and remove the link to the user Create another employee for the same user Go to…
*: hr_holidays,test_discuss_full **Steps to reproduce,** Create an employee linked to a user Archive the employee and remove the link to the user Create another employee for the same user Go to Discuss > 'General' channel Open the member list and click on the user's avatar **Before this commit,** Clicking on the avatar opened a popover showing outdated information from the archived employee record instead of the new one. **Cause,** By default, the server sends employee data ordered by name. Since both records have the same name, the order is non-deterministic. The client then attempts to match the employee's company to the current user's company, falling back to the first record in the list if no match is found. **Fix,** Filter out archived records first (treating them as non-existent). Then, sort the remaining employee records to prioritize those that match the current user's active company. In case records share the same company, prioritize employees with a related user. Fall back to descending order of creation for identical results. **After this commit,** Clicking on the avatar shows the correct employee details in the popover. task-6175765 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270546 Forward-Port-Of: odoo/odoo#252170
This update fixes an issue where the partner associated with an invoice was incorrectly overridden by the purchase order during UBL XML imports. Now, the purchase order is the definitive source for the bill's partner, ensuring accurate record-keeping and improved data consistency. This resolves a potential discrepancy in billing information.
Original PR description
Fix a bug where the partner of a bill is overriden by the PO matching The chosen logic here is to say that in the context of a purchase, the purchase order is the single source of truth to set the partner on a bill Steps to reproduce: - Create a partner with is_company = True - Create a contact type 'invoice' for this partner - Create a purchase order for the first partner - Import an XML (UBL) that matches this PO - You can see in the import logs that the partner was correctly found first, and then the PO matching override it to set the contact as the partner task-6289358 Forward-Port-Of: odoo/odoo#271133 Forward-Port-Of: odoo/odoo#269223
14 changes
New functionality added to Odoo
This update streamlines connections to remote SaaS databases for users created through the Databases module. Now, users will automatically authenticate upon connecting, eliminating the need for manual login screens and improving the overall user experience.
Original PR description
## [IMP] databases: SSO smooth connection and setup The aim of this commit is to allow databases_user to be directly connected to any remote SaaS database to which they have access. When they click…
## [IMP] databases: SSO smooth connection and setup
The aim of this commit is to allow databases_user to be directly connected to
any remote SaaS database to which they have access.
When they click the "connect" button, they will bypass the login screen and be
authenticated automatically.
To achieve this, when a user tries to connect to an accessible SaaS database, we
quickly write their `oauth_uid` to that remote database right before the
connection is initiated.
Before this commit:
A user that was created in the remote db using the create user feature from the
databases module wouldn't get automatically authenticated through the Odoo
OAuth SSO feature.
After this commit:
Users attempting to connect to a SaaS database will be directly connected if the
settings was activated.
task-id: 6071808
## TODO:
- [x] check if we always have oauth_uid for saas db
- [x] think about making the oauth module autoinstall (make a bridge module? or overkill?)
- We can avoid that and have everything work in place directly, avoiding an inheritance nightmare at installation time.
- [x] handle cases where it isn't there on both the remote db and the managing one
- [x] write some tests to ensure the code is free from traceback
- [x] add a feature allowing to:
- [x] add it to all server on which the user has access
- [x] add it to a specific server (may require the db list view on `res.users`
- [x] remove the previous and do everything when the user click on "connect"
- [x] would be better to put the code in a new module with auto install => people get auto-install + no "hacky" code.
- The "hacky" code is not so hacky and with that we can directly advertise the installation of `auth_oauth` in an action
- [x] add a config in the settings
Forward-Port-Of: odoo/enterprise#112369Enhancements to existing features
This update allows customers using the self-order system to pay at the counter, even if they've already selected a payment method within the self-order process. This provides greater flexibility for customers and streamlines the checkout experience, particularly in scenarios where a customer wants to pay with cash after selecting a payment method digitally.
Original PR description
pos*: point_of_sale, pos_self_order This commit allows the user to allow his customer to pay at the counter even if they already have payment method set in the self order. task-id: 5960666 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250364
Resolved issues and error corrections
This update resolves an issue where attendees received duplicate email notifications when rescheduling a meeting. The problem stemmed from a technical error in how the system handled date changes, leading to unnecessary email sends. The fix ensures that attendees only receive one notification for meeting updates.
Original PR description
Steps to reproduce: 1. Install CRM, Calendar, and Contacts. 2. Create a contact with an email address you can receive emails on. 3. Configure an outgoing email server. 4. Open a CRM lead and create a…
Steps to reproduce: 1. Install CRM, Calendar, and Contacts. 2. Create a contact with an email address you can receive emails on. 3. Configure an outgoing email server. 4. Open a CRM lead and create a meeting activity using the calendar. 5. Add the created contact as an attendee of the meeting. 6. Return to the lead and click the Reschedule button on the activity. 7. Select the same meeting and change its start date to a future date. Issue: - Attendees receive the meeting date-change email twice. Root cause: - When a calendar event linked to an activity is rescheduled, the event write syncs the new start date to the related activity through `_sync_activities`. That activity write was not marked as calendar-originated after commit https://github.com/odoo/odoo/commit/bc090486bd7810b1b0af1bae398255a2d6615f09, so `mail.activity.write` treated the updated deadline as an activity-originated change and wrote back to the same calendar event. https://github.com/odoo/odoo/blob/8cbb0fe91a35fcdb4a7e4e1a7e8afe40b1691f11/addons/calendar/models/calendar_event.py#L779 https://github.com/odoo/odoo/blob/8cbb0fe91a35fcdb4a7e4e1a7e8afe40b1691f11/addons/calendar/models/mail_activity.py#L24-L33 - This created a nested calendar event write. Both the nested write and the original write then triggered attendee date-change notifications, resulting in duplicate emails. Solution: - Pass the existing `calendar_event_meeting_update` context flag when syncing calendar event changes to linked activities. This prevents the activity sync from writing back to the event while preserving activity-to-event rescheduling. opw-6209956 Forward-Port-Of: odoo/odoo#266675
A recent update caused the Point of Sale system to incorrectly add the 'S' variant when scanning a barcode for the 'M' variant of a product with dynamic attributes. This fix ensures that the correct variant is always added, improving the accuracy of sales transactions. The change corrects a logic error in how the system handles product variants with dynamic attributes.
Original PR description
Steps to reproduce ------------------ 1. Create a product with two attributes: - Size with values S and M (Variants Creation: "Instantly") - a second attribute with a single value (Variants Creation: "Dynamically") 2. Set a different barcode on the S and the M variant. 3. Open PoS, scan the barcode of M. -> The S variant is added instead. Why the issue ------------- In 390b48a1ba24, when a product has a single-value attribute set to "dynamic", we look for the first variant that has this value and use it instead of the preselected variant. This is wrong when several variants share this value: in our case both S and M have it, so scanning M is overridden by the first variant, S. The fix ------- We now keep the preselected variant if it already has this value, and only look for or create one otherwise. opw-6272739 Forward-Port-Of: odoo/odoo#268590
This update fixes an issue where reordering rules were incorrectly creating purchase orders linked to sales orders. Now, reordering rules will always generate new, separate purchase orders, ensuring accurate inventory management and preventing duplicate purchase orders. This improves order fulfillment efficiency.
Original PR description
Steps to reproduce the bug: - Go to contact: - azure interior: - Group RFQ: On Order - Create two storable products P1 and P2, both with the Buy route and Azure interior as vendor - Confirm a sale…
Steps to reproduce the bug:
- Go to contact:
- azure interior: - Group RFQ: On Order
- Create two storable products P1 and P2, both with the Buy route and Azure interior as vendor
- Confirm a sale order with P1 (MTO+Buy):
- a purchase order PO1 is created, linked to the sale order via reference_ids
- Create a reordering rule for P2 and trigger it
Problem:
The reordering rule procurement for P2 was merged into PO1 (the sale order's purchase order) instead of creating a new separate PO.
In _make_po_get_domain (purchase_stock/models/stock_rule.py), when group_rfq == 'default' (On Order), the domain only adds a reference_ids filter when the procurement carries reference_ids. When the procurement comes from a reordering rule (no sale order, no reference_ids), no filter was added, so the search matched any draft PO from that vendor, including PO1, which has reference_ids pointing to the sale order.
Solution:
When group_rfq == 'default' and the procurement has no reference_ids, add ('reference_ids', '=', False) to the domain so the search only matches POs that are also not linked to any sale order.
opw-6167835
Forward-Port-Of: odoo/odoo#270735This update corrects a scheduling issue in manufacturing orders where operations with dependencies were not always processed in the correct order. The fix ensures operations are planned based on their dependencies, preventing delays and improving production efficiency. This resolves a conflict when planning operations with shared blockers.
Original PR description
Bug introduced in: https://github.com/odoo/odoo/commit/cfc5c998035b4268c36f5097782888e18e21b4fe Steps to reproduce the bug: - Create a product with a BoM with operation dependencies enabled - Add 4…
Bug introduced in: https://github.com/odoo/odoo/commit/cfc5c998035b4268c36f5097782888e18e21b4fe
Steps to reproduce the bug:
- Create a product with a BoM with operation dependencies enabled
- Add 4 operations on the same workcenter:
- opA: no blocker
- opB: blocked by opA
- opC: blocked by opA
- opD: blocked by opC
- Confirm a manufacturing order from this BoM
- Click Plan
Problem:
opA was scheduled after opB, violating the dependency.
`_plan_workorders` starts planning from the "leaf" workorders (those
with no dependents). Given the structure above, the initial set is
[opB, opD]. Processing opB first correctly plans opA then opB. But
processing opD triggers a recursive chain opD→opC→opA which calls
`action_unplan(opA)` and replans it from scratch. By then, opB already
occupies the workcenter slot that opA originally held, so opA ends up
scheduled after opB.
Solution:
Add `and not wo.is_planned` to the filter on `blocked_by_workorder_ids` in the recursive call inside `_plan_workorders`. Workorders that are already planned are skipped instead of being unplanned and replanned, preserving the correct order.
opw-6299179This update resolves a bug where clicking gift cards, e-wallets, or discount order lines in the ticket screen incorrectly increased refund quantities. Now, these product types are properly restricted from quantity increments during refunds, ensuring accurate transaction processing.
Original PR description
pos*: point_of_sale, pos_loyalty, pos_discount Before this commit: =================== - Clicking an e-wallet, gift card, discount order line in the ticket screen increased the refund quantity. After this commit: ================== - Gift card, e-wallet and discount products are now restricted from refund quantity increments in the ticket screen. Task-6200888 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a confusing issue in the budget report where budget lines were labeled with unclear identifiers like 'Budget 2026 x'. The report now displays budget lines with more specific names, including associated analytic accounts, making it easier to understand and analyze budget data. This enhancement improves the user experience and reporting accuracy.
Original PR description
Budget report grouping by budget line displayed the budget name for every line, which made different lines indistinguishable and produced labels like "Budget 2026 x", "Budget 2026 x (2)", etc. Compute a more specific display name for budget lines by appending the analytic accounts concerned by the line to the budget name. Also expose Budget Line as a first-class group-by in the Budget Report search view and apply it by default when opening the report. task-6293065 Forward-Port-Of: odoo/enterprise#121204
This update resolves a crash that occurred when users tried to view Instagram videos within Odoo. The fix now displays the video link instead of attempting to render the video as an image, ensuring a stable preview experience. This improves usability and prevents disruptions for users accessing Instagram content.
Original PR description
Purpose ======= When we have a real on Instagram, we try to show the video as an image. When clicking on the broken image, the previewer crash. To fix that issue, we know show the link of the video in the message. Task-5491124 Forward-Port-Of: odoo/enterprise#121176 Forward-Port-Of: odoo/enterprise#113487
This update corrects a bug where the invoice status cron job only processed invoices for the main company. Now, it accurately retrieves and updates the status of invoices across all companies within the Odoo system. This ensures accurate reporting and compliance for all business entities.
Original PR description
The invoice status cron was only fetching the main company's invoices. Fetch all companies' invoice statuses. Reference: https://github.com/odoo/odoo/pull/267144#discussion_r3441968099 no-task Forward-Port-Of: odoo/odoo#271227
This update fixes an issue where bank verification timestamps were incorrectly interpreted, leading to display errors for users in Poland. The change converts timestamps from the local Polish timezone to UTC, ensuring accurate display and preventing misinterpretations during API calls. This improves the reliability of bank verification processes.
Original PR description
The gov API returns a 'requestDateTime' in str format in PL timezone. This commit converts it back to UTC timezone for a better display in payment form. fields.Datetime assume the value is in UTC time and so when a field of this type is displayed, it's converted to the user timezone. This cause issue with the PL API call because the API will send us 9:25 PL TZ but if we store it directly, it will be interpreted by the ORM as 9:25 UTC and displayed to the user that's in UTC+2 as 11:25 task-6314380 Forward-Port-Of: odoo/odoo#270839
This update fixes an issue where scanning an unknown barcode in the Point of Sale (POS) system didn't automatically open the product creation form. The fix removes a redundant check for API keys, ensuring the form opens correctly regardless of whether a barcode lookup key is configured. This streamlines the process for users adding new products via barcode.
Original PR description
When scanning an unknown barcode in POS, the product creation form was never opened because `barcode_lookup()` was called with no barcode as an implicit API key check. Commit 0c8019a4aa7 ([FIX] product_barcodelookup: avoid crash on invalid image URLs) standardized `barcode_lookup_request()` to always
return a `requests.Response` object, removing the `{'authenticated': True}` dict it previously returned for HTTP 404 responses. As a result the JS check `response?.authenticated` was always falsy and the form never opened.
Fix: remove the API key check entirely. `allowProductCreation()` already gates on the user having product create rights, which is the only condition that matters. If a Barcode Lookup API key is configured the `_onchange_barcode` on the form will auto-fill product data; if not, the user can fill it in manually. Either way the form is always usable.
opw-6295221
Forward-Port-Of: odoo/enterprise#120256This update ensures that kiosk orders aren't automatically sent to the blackbox if the payment hasn't been finalized. This change allows for seamless payment at the counter with other payment methods, improving the kiosk experience for customers and streamlining order processing.
Original PR description
This commits adapts the code in confirmation_page.js to not send the order to the blackbox from the kiosk if the order is not in paid state. task-id: 5960666 Forward-Port-Of: odoo/enterprise#117585
This update resolves an issue where the partner associated with a bill was incorrectly overridden during UBL XML import processes. The fix ensures that the purchase order always serves as the primary source for partner information on bills, improving data accuracy and consistency. This prevents errors related to mismatched partner information in invoices.
Original PR description
Fix a bug where the partner of a bill is overriden by the PO matching The chosen logic here is to say that in the context of a purchase, the purchase order is the single source of truth to set the partner on a bill Steps to reproduce: - Create a partner with is_company = True - Create a contact type 'invoice' for this partner - Create a purchase order for the first partner - Import an XML (UBL) that matches this PO - You can see in the import logs that the partner was correctly found first, and then the PO matching override it to set the contact as the partner task-6289358 Forward-Port-Of: odoo/odoo#271133 Forward-Port-Of: odoo/odoo#269223
16 changes
New functionality added to Odoo
This update streamlines connections to remote SaaS databases for users created through the Odoo Databases module. Now, users automatically authenticate upon connecting, eliminating the need for manual login steps and improving the overall user experience. This enhancement ensures seamless access to data for users managing SaaS databases.
Original PR description
## [IMP] databases: SSO smooth connection and setup The aim of this commit is to allow databases_user to be directly connected to any remote SaaS database to which they have access. When they click…
## [IMP] databases: SSO smooth connection and setup
The aim of this commit is to allow databases_user to be directly connected to
any remote SaaS database to which they have access.
When they click the "connect" button, they will bypass the login screen and be
authenticated automatically.
To achieve this, when a user tries to connect to an accessible SaaS database, we
quickly write their `oauth_uid` to that remote database right before the
connection is initiated.
Before this commit:
A user that was created in the remote db using the create user feature from the
databases module wouldn't get automatically authenticated through the Odoo
OAuth SSO feature.
After this commit:
Users attempting to connect to a SaaS database will be directly connected if the
settings was activated.
task-id: 6071808
## TODO:
- [x] check if we always have oauth_uid for saas db
- [x] think about making the oauth module autoinstall (make a bridge module? or overkill?)
- We can avoid that and have everything work in place directly, avoiding an inheritance nightmare at installation time.
- [x] handle cases where it isn't there on both the remote db and the managing one
- [x] write some tests to ensure the code is free from traceback
- [x] add a feature allowing to:
- [x] add it to all server on which the user has access
- [x] add it to a specific server (may require the db list view on `res.users`
- [x] remove the previous and do everything when the user click on "connect"
- [x] would be better to put the code in a new module with auto install => people get auto-install + no "hacky" code.
- The "hacky" code is not so hacky and with that we can directly advertise the installation of `auth_oauth` in an action
- [x] add a config in the settings
Forward-Port-Of: odoo/enterprise#112369Enhancements to existing features
This update enhances the Helpdesk system by adding tests for automated reminder emails and correcting a calculation error in the reminder timer. These changes ensure timely and accurate automated reminders for support tickets, improving the overall efficiency of the support process.
Original PR description
- add tests for the auto reminder email before auto-closing tickets - fix issue with the reminder timer calculation --- task-5438678
Resolved issues and error corrections
This update resolves a confusing warning message that appeared during bill editing, related to vendor history. The fix prevents the warning from appearing while a bill is being edited, instead recomputing it when the bill is saved. This creates a smoother and less disruptive user experience.
Original PR description
Abnormal bill warnings are based on vendor history read from the saved move in the db, while a bill is being edited the form uses a temporary record; after changing the vendor, that temporary value differs from the vendor still stored on the saved move. This makes the warning use the old vendor's history while showing the new vendor's name. Only compute these warnings for saved records, while editing hide them and let them be recomputed once the bill is saved. task-6263829 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270515
This update resolves an issue that prevented efficient processing of invoices with multiple related documents (specifically those involving Mexican tax cancellations). By using a different database index, the system now handles a greater volume of invoices without performance slowdowns, ensuring smoother operations for our Mexican customers. This change improves the reliability of the l10n_mx_edi module.
Original PR description
The field `l10n_mx_edi_cfdi_origin` can contain a large number of associated UUIDs, especially in complex cancellation scenarios. The default B-tree index fails when this field exceeds 2704 bytes, which occurs after approximately 20 UUIDs. By switching to a trigram index, we avoid the entry size limit of PostgreSQL's B-tree nodes. This ensures that invoices with many related documents can be processed while maintaining efficient search performance for partial matches on this field. **Video before the fix:** https://youtu.be/24u0HbxwIH8 **Video after the fix:** https://youtu.be/sUelv1HZMvI Forward-Port-Of: odoo/enterprise#118868
This update corrects a previous issue where Odoo was incorrectly selecting unavailable couriers from Shiprocket. The change now filters out 'blocked' couriers, ensuring only valid options are considered for shipping rates and selections. Additionally, the system is more robust to handle unexpected data from Shiprocket, preventing errors in pricing.
Original PR description
Shiprocket provides an odablock flag in the courier serviceability response. Couriers with odablock=True are not serviceable for the requested route and should not be considered for rate calculation or selection. Before this change, Odoo selected the first courier returned by Shiprocket regardless of its ODA status. As a result, unavailable couriers could be proposed to users and selected for shipments. The fix filters out ODA-blocked couriers before evaluating available services, ensuring that only serviceable couriers are considered. Additionally, freight charge parsing is hardened to gracefully handle non-numeric values returned by Shiprocket, preventing errors during AWB assignment and price computation. FYI: Shiprocket uses odablock=False for serviceable routes and odablock=True for routes that are blocked for a given courier. opw-6288768,6152279 Forward-Port-Of: odoo/enterprise#120374
This update corrects a technical issue within the Odoo’s Danish accounting module (l10n_dk) where an account was listed twice. Removing this duplication ensures accurate financial reporting and avoids potential errors in Danish tax compliance. This change improves the reliability of the accounting system for Danish businesses using Odoo.
Original PR description
In the list 'dk_coa_7630 ', the account has been used in the list twice. Removing the duplication from the list. [Reference](https://github.com/odoo/odoo/blob/17.0/addons/l10n_dk/migrations/1.4/end-migrate.py#L14) 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#270865 Forward-Port-Of: odoo/odoo#270573
This update resolves a crash that occurred when users attempted to view Instagram videos within Odoo. The fix now displays the video link instead of the image, ensuring a smooth user experience when accessing Instagram content. This improves stability and prevents disruptions for users.
Original PR description
Purpose ======= When we have a real on Instagram, we try to show the video as an image. When clicking on the broken image, the previewer crash. To fix that issue, we know show the link of the video in the message. Task-5491124 Forward-Port-Of: odoo/enterprise#121176 Forward-Port-Of: odoo/enterprise#113487
This update corrects a technical issue where the system incorrectly rejected zero measurement values received from caliper devices via IoT. This change ensures accurate data capture, preventing potential disruptions to work order tracking and quality control processes. A minor typo was also addressed.
Original PR description
Fix a check on the IoT response that incorrectly rejected valid measurements of 0 from caliper devices Also fix a typo opw-6184669 Forward-Port-Of: odoo/enterprise#121116
This update resolves an issue where changes to roles for duplicated sign templates were unintentionally reflected across all instances. Now, each duplicated sign template has its own dedicated set of roles, ensuring data consistency and preventing conflicts when managing sign items. This improves the stability and accuracy of sign workflows.
Original PR description
When duplicating a sign template, its sign items were copied but their `responsible_id` was kept as a reference to the same `sign.item.role` records. As a result, editing a role on one template (e.g. assigning a partner through `assign_to`) leaked to the other template sharing it. Copy the role when copying a sign item so each template owns its own roles. task-6288951 Forward-Port-Of: odoo/enterprise#119864
This update corrects a technical issue where new version creations were inadvertently duplicating notes, which should be specific to each version. The change ensures that each version has its own unique note, streamlining version management and preventing data inconsistencies. This improves the accuracy and reliability of our version tracking system.
Original PR description
When we create a new version, we don't want to copy the note which should be version specific task-6304034 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#270110
A recent update caused the Point of Sale system to incorrectly add the 'S' variant when scanning a barcode for the 'M' variant of a product with dynamic attributes. This fix ensures that the correct variant is added based on the scanned barcode, improving the accuracy of sales transactions. The change corrects a logic error in how the system handles product variants with dynamic attributes.
Original PR description
Steps to reproduce ------------------ 1. Create a product with two attributes: - Size with values S and M (Variants Creation: "Instantly") - a second attribute with a single value (Variants Creation: "Dynamically") 2. Set a different barcode on the S and the M variant. 3. Open PoS, scan the barcode of M. -> The S variant is added instead. Why the issue ------------- In 390b48a1ba24, when a product has a single-value attribute set to "dynamic", we look for the first variant that has this value and use it instead of the preselected variant. This is wrong when several variants share this value: in our case both S and M have it, so scanning M is overridden by the first variant, S. The fix ------- We now keep the preselected variant if it already has this value, and only look for or create one otherwise. opw-6272739 Forward-Port-Of: odoo/odoo#268590
This update corrects a bug where reordering rules were incorrectly creating purchase orders linked to sales orders. Now, reordering rules will always generate new, separate purchase orders, ensuring accurate inventory management and preventing duplicate purchase orders. This improves order fulfillment efficiency.
Original PR description
Steps to reproduce the bug: - Go to contact: - azure interior: - Group RFQ: On Order - Create two storable products P1 and P2, both with the Buy route and Azure interior as vendor - Confirm a sale…
Steps to reproduce the bug:
- Go to contact:
- azure interior: - Group RFQ: On Order
- Create two storable products P1 and P2, both with the Buy route and Azure interior as vendor
- Confirm a sale order with P1 (MTO+Buy):
- a purchase order PO1 is created, linked to the sale order via reference_ids
- Create a reordering rule for P2 and trigger it
Problem:
The reordering rule procurement for P2 was merged into PO1 (the sale order's purchase order) instead of creating a new separate PO.
In _make_po_get_domain (purchase_stock/models/stock_rule.py), when group_rfq == 'default' (On Order), the domain only adds a reference_ids filter when the procurement carries reference_ids. When the procurement comes from a reordering rule (no sale order, no reference_ids), no filter was added, so the search matched any draft PO from that vendor, including PO1, which has reference_ids pointing to the sale order.
Solution:
When group_rfq == 'default' and the procurement has no reference_ids, add ('reference_ids', '=', False) to the domain so the search only matches POs that are also not linked to any sale order.
opw-6167835
Forward-Port-Of: odoo/odoo#270735This update fixes a confusing issue in the budget report where budget lines were labeled with repetitive 'Budget 2026 x' names. The change now includes relevant analytic accounts in the budget line display, making it much easier to distinguish between different budget lines. This improves report readability and data understanding.
Original PR description
Budget report grouping by budget line displayed the budget name for every line, which made different lines indistinguishable and produced labels like "Budget 2026 x", "Budget 2026 x (2)", etc. Compute a more specific display name for budget lines by appending the analytic accounts concerned by the line to the budget name. Also expose Budget Line as a first-class group-by in the Budget Report search view and apply it by default when opening the report. task-6293065 Forward-Port-Of: odoo/enterprise#121204
This update addresses several minor issues and improvements within the Odoo spreadsheet component. It includes fixes for visual glitches, formula parsing problems, and updates to the underlying technology (Node.js and npm). These changes ensure a smoother and more reliable spreadsheet experience for users.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/dce4ae7d4f [REL] 19.1.24 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/dce4ae7d4f [REL] 19.1.24 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/b09fce3cc8 [FIX] viewport: fix viewport jump with frozen pane [Task: 6292764](https://www.odoo.com/odoo/2328/tasks/6292764) https://github.com/odoo/o-spreadsheet/commit/28177797ff [FIX] composer_tokenizer: fix argument separator in formulas [Task: 6303210](https://www.odoo.com/odoo/2328/tasks/6303210) https://github.com/odoo/o-spreadsheet/commit/f70fba15e9 [FIX] rolldown: Fix cjs file extension [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/8377e1112a [IMP] node: add script to run the model in node [Task: 6088515](https://www.odoo.com/odoo/2328/tasks/6088515) https://github.com/odoo/o-spreadsheet/commit/458bba3f53 [FIX] package.json: Update Node.js and npm engine requirements [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/60cc12db7c [FIX] carousel: custom color don't use carousels [Task: 6263128](https://www.odoo.com/odoo/2328/tasks/6263128) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update fixes an error in the generation of CFDI documents when payments are made in foreign currencies. Previously, the CFDI document incorrectly displayed the payment rate. The fix ensures the correct payment amount and rate are reflected in the generated CFDI document, improving accuracy for Mexican businesses.
Original PR description
The rate and payment amount shown on the CFDI document generated after updating payments was wrong when the payment was made in a foreign currency. Steps to reproduce: ------------------- * Create a journal that use USD as currency and set the rate to 20 MXN for 1 USD * Create an invoice in MXN and make sure it is set to PPD * Add any product to the invoice for 300$ and post it * Send the invoice to CFDI (a first document should be generated) * Create a payment of 15 USD in the new journal and reconcile it with the invoice * Go back to the invoice and click on "Update payments" to generate the second CFDI document > Observation: The payment document shows an amount of 300 USD with a rate of 1 instead of 15 USD with a rate of 20. Why the fix: ------------ We make sure to use the amount from the statement line when there is one. opw-5974519 Forward-Port-Of: odoo/enterprise#120934 Forward-Port-Of: odoo/enterprise#115779
This update resolves an issue where the invoice status cron job only processed invoices for the primary company within Odoo. The fix ensures that all companies within an Odoo instance are now correctly updated, improving invoice tracking and reporting accuracy. This change was made to align with best practices for multi-company environments.
Original PR description
The invoice status cron was only fetching the main company's invoices. Fetch all companies' invoice statuses. Reference: https://github.com/odoo/odoo/pull/267144#discussion_r3441968099 no-task Forward-Port-Of: odoo/odoo#271227
3 changes
Resolved issues and error corrections
This update fixes an error in the generation of CFDI documents for payments made in foreign currencies. Previously, the rate used was incorrect, leading to inaccurate amounts displayed on the CFDI. The fix ensures the correct payment amount and rate are used, improving the accuracy of financial reporting for Mexican businesses.
Original PR description
The rate and payment amount shown on the CFDI document generated after updating payments was wrong when the payment was made in a foreign currency. Steps to reproduce: ------------------- * Create a journal that use USD as currency and set the rate to 20 MXN for 1 USD * Create an invoice in MXN and make sure it is set to PPD * Add any product to the invoice for 300$ and post it * Send the invoice to CFDI (a first document should be generated) * Create a payment of 15 USD in the new journal and reconcile it with the invoice * Go back to the invoice and click on "Update payments" to generate the second CFDI document > Observation: The payment document shows an amount of 300 USD with a rate of 1 instead of 15 USD with a rate of 20. Why the fix: ------------ We make sure to use the amount from the statement line when there is one. opw-5974519 Forward-Port-Of: odoo/enterprise#120934 Forward-Port-Of: odoo/enterprise#115779
This update fixes an issue where scanning an unknown barcode in the Point of Sale (POS) system didn't automatically open the product creation form. The fix removes a redundant check for API keys, ensuring the form opens correctly regardless of whether a barcode lookup key is configured. This improves the user experience and allows staff to quickly add new products via barcode scanning.
Original PR description
When scanning an unknown barcode in POS, the product creation form was never opened because `barcode_lookup()` was called with no barcode as an implicit API key check. Commit 0c8019a4aa7 ([FIX] product_barcodelookup: avoid crash on invalid image URLs) standardized `barcode_lookup_request()` to always
return a `requests.Response` object, removing the `{'authenticated': True}` dict it previously returned for HTTP 404 responses. As a result the JS check `response?.authenticated` was always falsy and the form never opened.
Fix: remove the API key check entirely. `allowProductCreation()` already gates on the user having product create rights, which is the only condition that matters. If a Barcode Lookup API key is configured the `_onchange_barcode` on the form will auto-fill product data; if not, the user can fill it in manually. Either way the form is always usable.
opw-6295221
Forward-Port-Of: odoo/enterprise#120256This update resolves a technical issue that caused the restaurant order tour to fail intermittently. By ensuring the tour waits for asynchronous order updates, we've eliminated a race condition that led to duplicate order requests. This improves the reliability of the tour and the overall testing process.
Original PR description
The tour could fail because `sendOrderInPreparationUpdateLastChange` is asynchronous when sending the order to the kitchen. The test was continuing to the next steps before the request was fully resolved, which could lead to sending the order again while the previous call was still in progress. This commit updates the tour to explicitly wait for the async call to complete before continuing, by adding a delay step after clicking the order button. This prevents race conditions during the test. --- Runbot Error: https://runbot.odoo.com/odoo/runbot.build.error/181846 Forward-Port-Of: odoo/enterprise#121237 Forward-Port-Of: odoo/enterprise#110909
6 changes
Resolved issues and error corrections
This update resolves an issue where commands like `/table` were accidentally executed within code blocks in the HTML editor. The fix prevents commands and markdown shorthands from appearing inside code blocks, ensuring a cleaner and more predictable editing experience for users. This improves the stability and usability of the ToDo module.
Original PR description
### Steps to reproduce: - Go to ToDo. - Create a code block using `/code`. - Place the cursor inside the code block. - Type `/table` and select the table command. - A traceback occurs. ### Purpose of this PR: - Commands and markdown shorthands should not be available inside code blocks. However, typing `/` inside a `<pre>` opened the command palette, allowing structural commands such as `/table` to be executed and causing a traceback. Similarly, markdown shorthands such as `* ` and `1.` were still active, unexpectedly transforming code content into lists. ### This PR fixes the issue by: - Disabling the command palette when the cursor is inside a `<pre>` element. - Disabling markdown shorthands inside `<pre>` elements by registering an `is_shorthand_available_predicates` predicate. task-6292231 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270858 Forward-Port-Of: odoo/odoo#269430
This update significantly speeds up the calculation of future timesheets based on public holidays. The previous process was slow and inefficient, especially when many holidays were defined. This change optimizes the calculation, resulting in faster timesheet generation and improved system performance.
Original PR description
**Problem:** When creating a new employee, the future timesheets due to public holidays are computed. If the number of public holidays is large (i.e. if the user creates them for each year, several…
**Problem:** When creating a new employee, the future timesheets due to public holidays are computed. If the number of public holidays is large (i.e. if the user creates them for each year, several years in the future), then it takes excessively long and the action may not complete. **Cause:** The pytz method `localize` and comparing times with non-static timezones is done repeatedly and unnecessarily which becomes costly with more records. **Solution:** Only localize the time when absolutely necessary (determining the date of the leave in the calendar timezone). **Performance Stats:** |Record count|Time before|Queries before|Time after|Queries after| |------------|-----------|--------------|----------|-------------| |100 |3.1s |393 |0.8s |117 | |1,000 |22.3s |2,090 |1.5s |183 | |10,000 |Timeout |N/A |6.7s |541 | opw-6087422 Forward-Port-Of: odoo/odoo#269876 Forward-Port-Of: odoo/odoo#263953
A test within the Odoo email system failed on the pg18 database version. This fix addresses a change in how database constraints are handled, specifically a 'RESTRICT_VIOLATION' error instead of a 'FOREIGN_KEY_VIOLATION' error. The test has been updated to use a more general error type for better reliability.
Original PR description
This commit is kind of a follow up of
odoo/odoo@39cd4ea856fe00f5674f8c44b2b66cbf2705426d (in 18.0).
In a nutshell, following a standard-compliance fix (postgres/postgres@086c84b) has led to `RESTRICT_VIOLATION` being emitted in cases which formerly emitted `FOREIGN_KEY_VIOLATION`. One such case is specifically being tested for by `test_alias_domain_setup`, leading to this test failing systematically when running pg18:
psycopg2.errors.RestrictViolation: update or delete on table "mail_alias_domain" violates RESTRICT setting of foreign key constraint "mail_alias_alias_domain_id_fkey" on table "mail_alias"
DETAIL: Key (id)=(191) is referenced from table "mail_alias".
This commit updates the test to use the more generic `IntegrityError` as it's probably more than sufficient for our purposes.
Forward-Port-Of: odoo/odoo#271302This update resolves an issue where Android 14 users couldn't access their camera when uploading images through the Odoo web interface. The fix ensures users can now select photos from their device, improving usability on this popular operating system. This enhancement addresses a compatibility problem identified by Google and other developers.
Original PR description
Since Android 14 we don't have option to take a photo on clicking on file input in Chrome.
This for example will allow only images but no option "Camera"
```html
<input type="file" accept="image/*/>
```
A workaround is to use a dummy mimetype (`*/*`), example `dummy/allowAndroidCamera` The fix will be applied on image widget in addition to the original `acceptedFileExtensions` to not override the existing `accept` attribute
Linked url
- https://blog.addpipe.com/html-file-input-accept-video-camera-option-is-missing-android-14-15/
- https://stackoverflow.com/questions/77876374/html-input-type-file-not-working-to-pull-up-camera-for-pixel-android-14-comb/79163998#79163998
- https://issues.chromium.org/issues/40937303
opw-6040375
backport of https://github.com/odoo/odoo/pull/265750
Forward-Port-Of: odoo/odoo#268584
Forward-Port-Of: odoo/odoo#266850This update resolves a problem where the kitchen printer was incorrectly sending duplicate orders after merging table orders. Specifically, when identical products were combined, the system would re-send quantities that had already been printed. This fix ensures that quantities are accurately reflected in the kitchen printouts, improving order fulfillment efficiency.
Original PR description
When transferring an order to a table that already has an open order, identical products are merged into a single line. If both orders were already sent to the kitchen printer, the merged line was incorrectly marked as new and had to be sent again. Steps to reproduce: ------------------- * Open table 1, add product A (2 units) and product B, send to kitchen * Open table 2, add product A (3 units) and product C, send to kitchen * On table 2, transfer/merge the order to table 1 > Observation: product A shows 2 units as new and must be sent to the kitchen printer again, although all quantities were already sent. Why the fix: ------------ When merging preparation history for identical lines, handlePreparationHistory overwrote the destination sent quantity with the source one instead of summing both. The kitchen diff then treated the missing quantity as new changes. A unit test will be added in 18.3. opw-6246470 Forward-Port-Of: odoo/odoo#267915
Miscellaneous changes
This pull request introduces a deliberate error injection into the Odoo runbot environment for testing purposes. The goal is to trigger and diagnose potential issues within the system. This is a preliminary (wip) effort to ensure robust error handling and stability.
Original PR description
wip to force error on runbot --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
1 change
Resolved issues and error corrections
This update resolves an issue preventing sales users with 'Own Documents Only' access from adding components to production orders. The fix adjusts security rules to grant necessary read access, ensuring sales users can correctly manage production orders created within their sales documents.
Original PR description
### Steps to reproduce: - Ensure `sale_stock_renting` is installed - Enable Multi-Steps Routes > Unarchive MTO - Create a product P with a BoM and the routes MTO + manufacture - Create anc confirm a…
### Steps to reproduce: - Ensure `sale_stock_renting` is installed - Enable Multi-Steps Routes > Unarchive MTO - Create a product P with a BoM and the routes MTO + manufacture - Create anc confirm a sale order for A unit of P - Log in with an other user with with mrp User rights and sales User: Own Documents Only (he should not have access to the SO) - Open the MO, add a component line and save #### > Access Error: Blame the following rule: - Personal Order ### Cause of the issue: Writing on the `move_raw_ids` will trigger a call of the `_autoconfirm_production` in order to confirm the newly created move: https://github.com/odoo/odoo/blob/e447f4849056a0aab35966fb6ba595ebaadb79ab/addons/mrp/models/mrp_production.py#L990-L991 https://github.com/odoo/odoo/blob/e447f4849056a0aab35966fb6ba595ebaadb79ab/addons/mrp/models/mrp_production.py#L1422-L1423 During this confirmation process, one calls the `_merge_moves` method in order to merge this new move (if relevant) to any already existing one. https://github.com/odoo/odoo/blob/e447f4849056a0aab35966fb6ba595ebaadb79ab/addons/stock/models/stock_move.py#L1575-L1576 Now, the issue is that, `sale_stock_renting` module overrides the method `_prepare_merge_moves_distinct_fields` determining the fields relevant to the merge by requiring a read access to the `is_rental_order` compute field of the `sale_order` linked to the MO: https://github.com/odoo/enterprise/blob/b66097122ba3a758734ac6fb2b26579c35cb72c2/sale_stock_renting/models/stock_move.py#L34-L40 However, due to the 'Personal Orders' ir.rule, the user does not have a read access to this record: https://github.com/odoo/odoo/blob/e447f4849056a0aab35966fb6ba595ebaadb79ab/addons/sale/security/ir_rules.xml#L44-L49 Community: https://github.com/odoo/odoo/pull/271017 opw-6275658 Forward-Port-Of: odoo/enterprise#121135
25 changes
New functionality added to Odoo
This update adds support for Belgium's new payroll regulations by mapping key codes (DMFA, eGov3, and salary categories) to the correct work entry types within the Odoo system. This ensures accurate and compliant payroll processing for Belgian businesses using the Enterprise edition.
Original PR description
Map DMFA codes, daily eGov3 codes, and salary categories to the new work entry types. Task: 6275946
This update consolidates SMS functionality into a new 'frontdesk_sms' module, improving organization and maintainability. It moves key SMS-related data and logic, and introduces a helper function to prevent code duplication, streamlining the frontdesk visitor management process.
Original PR description
In this PR we have moved all the sms related stuffs from **frontdesk** to **frontdesk_sms** Task-6068563
Enhancements to existing features
This update removes the outdated 'reception report' feature and integrates changes from the community to improve barcode scanning and product allocation tracking. Specifically, it highlights unusual product locations and adds a button to print operation reports for allocated items, ensuring accurate inventory management.
Original PR description
*: industry_fsm_stock, stock_barcode, stock_barcode_picking_batch This commit adapts code to changes made in community: - Remove `stock.group_reception_report`; - Set `auto_show_reception_report` in picking type if needed. task-4894566 **Community PR:** odoo/odoo#264299 **Upgrade PR:** odoo/upgrade#10320
This update streamlines the loading process for Odoo's registry, resulting in a 7% performance improvement. The change removes an unnecessary check that slowed down loading times, particularly for the planning module. This translates to a quicker startup experience for the system.
Original PR description
has_group for superuser during module loading is slow and unnecessary (``@api.depends(lambda self: self._display_name_fields())``) This commit bypasses the check and improves the loading time by 7% for the registry (assume all modules are loaded in other registries) <img width="1504" height="382" alt="image" src="https://github.com/user-attachments/assets/94da0b4a-f728-4783-8883-5d7925dcb34b" />
This update streamlines the process for filing the 273S report, aligning with government regulations. It introduces a clear lifecycle for reports and proactive warnings to ensure accurate data submission, reducing potential errors and improving compliance.
Original PR description
This commit introduces a comprehensive management system for the 273S report, enhancing its lifecycle, data integrity, and user experience. It's important to note that filing a 237S report can…
This commit introduces a comprehensive management system for the 273S report, enhancing its lifecycle, data integrity, and user experience. It's important to note that filing a 237S report can involve one of the following declarations: 1. Initial declaration 2. Modification declaration 3. Cancellation declaration **After contacting the Service Public Federal (SPF) Finances, we have clarified that only Initial declarations are used in practice, and that modification and cancellation declarations are not used.** **Initial Declarations are used to modify reports that have already been declared** Ideally, a maximum of 12 Initial declarations should be used, but since modifications can also happen, a system is implemented to report the payslips of the year using the minimal amount of declared and corrected reports possible throughout the year by reporting each payslip that's not included in any ready/done report that exists in the period starting from the beginning of the year until the end of the month of the report. **Lifecycle & Structure** * 273S reports are now persistent documents with a clear lifecycle (Draft, Ready, Done, Cancelled) rather than transient pop-ups. * In the draft state, all fields are editable except Year and Month in the type `correction` since they are inherited from the original report. The original report is a required field for the correction type. Payslips are auto-populated if any of the fields (Year, Month, Original, Type) are updated. Populating a report differs based on its type; if it's an original declaration, then the report is populated by all payslips that are in a ready/done state that were issued starting from the current year and until the end of the declared month; if it's a correction report, then it's populated with payslips that aren't in a **finalised report**. **A finalised report is a report that is in a ready/done state and not one of its parent correction reports. Once the report has payslips in it, a button appears to generate the PDF (for the user) and XML (to be submitted) files.** * Once generated, the report moves to the Ready state, allowing users to review the data before final submission. In this state, all fields become non-editable except for the Reference field, which should be used to add the reference of the declaration received from the government after submission. The report can be set back to draft if any changes are needed. If a report that needs to be corrected was set to draft, it will no longer be considered in the first warning type since its `is_correction_needed` will be set to False. * Done state is the next state after Ready, which is achieved by the action `Mark as done` and requires the Reference field to be filled. Since the Reference field is important for the traceability of the declaration report, it's set to be tracked in the chatter. Done state and Ready state are alike except for the fact that Done state is for reports that are already declared to the government and have the reference of the declaration while Ready state is for reports that are generated but not yet declared to the government that's why a `Set to draft` action is allowed for Ready state and the Done state cannot be reached without filling the Reference field. The action `Correct` is shown for Done reports to allow creating a new correction report with the same period and payslips as the original report. * Cancelled state is the last state in the lifecycle and can be reached from any of the previous states. Once a report is cancelled, it cannot be set back to any other state, and all its data becomes non-editable except the Reference field. **UI & Proactive Warnings** * Two warnings are also added to the dashboard to alert the user when some reports are outdated and need to be corrected, or when some payslips are missing from the declaration of the previous year. * For the first warning, a report is considered outdated when one of its payslips has been cancelled after the report was generated. * For the second warning, a payslip is considered missing from last year's declaration when it belongs to the previous year and is not included in any ready/done report of the previous year. Missing payslips will be declared in December's Initial Declaration report of the previous year or a correction report if December's report is already declared. The warning for missing payslips of only one previous year is shown. Task: 5473528
This update enhances the accuracy of withholding tax calculations for Belgian employees. The changes incorporate more detailed criteria, such as residency status and employment duration, to ensure compliance with Belgian tax regulations and improve the precision of tax deductions.
Original PR description
In this commit, we improved the bareme computation in withholding tax, by taking into consideration more conditions (Resident, Frontalier, contract covering the full year, works in belgium for >= 75%, ..) task-6231497
This update allows administrators to directly adjust the total amounts for individual lines within payroll calculations. Previously, these totals were fixed, leading to potential discrepancies. This change improves payroll accuracy and provides greater control for financial teams.
Original PR description
Task: 6292521
This update enhances the timesheet assistant by allowing administrators to precisely control which employees receive suggestions based on new 'Applies To' settings. It also introduces a threshold feature, ensuring activity suggestions are only displayed when a specific usage level is reached, optimizing efficiency. This change improves the relevance and usability of the timesheet assistant.
Original PR description
- Replace the "Shared With" mechanism with an "Applies To" field to control which employees a rule applies to. - Add threshold support so activity suggestions are only displayed when the configured threshold is reached. task-6186073
This update enhances employee record management by adding a certificate column to employee profiles, allowing easy viewing and download. Additionally, uploaded certificates are now automatically stored in the Documents folder, streamlining the process for both new and existing certificates.
Original PR description
This PR includes some changes related to the certificates in hr_skills. First of all, we add a column in the list view found in the Certificates tab on the employee profile that shows the certificate that has been uploaded. This also allows the downloading of the certificate. Secondly, we make it so that if documents is installed, the uploaded certificates are uploaded to the Certificate folder in Documents. Task: 6210153
This update enhances the visual design of the call debrief transcription layout, making it more user-friendly. Specifically, it adds an 'active' state to the timeline markers, providing clearer visual cues for key moments during the call. This improves clarity and usability of the call debrief feature.
Original PR description
This commit refines the design of the call debrief transcription layout. It also adds an active state to the timeline markers. task-6119464 Requires: - https://github.com/odoo/odoo/pull/271103 --- |…
This commit refines the design of the call debrief transcription layout. It also adds an active state to the timeline markers. task-6119464 Requires: - https://github.com/odoo/odoo/pull/271103 --- | Header | Header | |--------|--------| | <img width="955" height="440" alt="Screenshot 2026-06-19 at 16 38 12" src="https://github.com/user-attachments/assets/114819c7-8bec-4a65-af13-9f834e692053" /> | <img width="947" height="820" alt="Screenshot 2026-06-19 at 16 39 24" src="https://github.com/user-attachments/assets/62374140-6819-4557-8181-6fd36b006cc5" /> | | <img width="960" height="247" alt="Screenshot 2026-06-19 at 16 38 28" src="https://github.com/user-attachments/assets/b25368c8-b545-4fc7-8211-907faed28926" /> | <img width="954" height="368" alt="Screenshot 2026-06-19 at 16 39 45" src="https://github.com/user-attachments/assets/1836c801-c383-43cb-aa11-ef2ec3e496cb" /> | | <img width="955" height="449" alt="Screenshot 2026-06-19 at 16 38 49" src="https://github.com/user-attachments/assets/983dd118-a3dd-4055-8af4-703217047e8b" /> | <img width="957" height="614" alt="Screenshot 2026-06-19 at 16 40 08" src="https://github.com/user-attachments/assets/5b22f3e4-9af7-4ce9-b3fd-b997964c5794" /> |
Resolved issues and error corrections
This update fixes a bug where changes to employee data didn't correctly update past payslips. The fix ensures that all affected payslips are accurately corrected when a user manages them, preventing discrepancies in payroll calculations. This improves data accuracy and payroll processing reliability.
Original PR description
Steps to reproduce: 1. Make sure you have an employee with a contract 2. Create 2 payslips for this employee 3. Change any field of the employee (ex: job position) 4. Go to one of the payslips…
Steps to reproduce: 1. Make sure you have an employee with a contract 2. Create 2 payslips for this employee 3. Change any field of the employee (ex: job position) 4. Go to one of the payslips created before 5. Click on the "Manage Payslips" link appearing because of the change of data Problem: When the data of an employee has been modified and past payslip are affected, the popup currently states 0 payslip has been affected. When clicking the "Correct" button, the correct amount briefly shows before we are sent to the payslip page where only one payslip gets corrected. Source of the problem: - The `employee_id` field was missing from the wizard form view. Since it was not referenced anywhere in the view, the web client did not include it in the initial payload / default_get calls. As a result, the wizard was initialized without `employee_id`, causing the payslip computation to use an empty employee and return a count of 0. - The window action did not explicitly call the intended wizard form view. Odoo therefore selected an unintended inherited view (salary increase wizard) due to view resolution rules (inheritance and priority ordering). This inherited view specifically replaces the description and the correction choice with nothing, which explains why it didn't show before. Fix: - Add an invisible `employee_id` field in the form view to ensure it is included in the initial form payload and properly initialized from context defaults. - Explicitly specify the correct view in the `views` parameter of the window action to prevent fallback to an inherited or unintended view. - Add an explicit priority on the salary increase wizard view to avoid ambiguous view selection in the future. Task-6304311
This update resolves an issue where the 281.XX report generation failed due to missing employee first and last names. The fix adds a check to ensure these fields are populated, preventing errors and ensuring accurate report creation. This improves the reliability of payroll reporting.
Original PR description
Steps to reproduce: 1. Create a Belgian company with a full address, phone and VAT 2. Create an employee of this company with a full private address, valid NISS (or "/"), and give him a contract. 3. Make sure the employee doesn't have a first name or a last name set. 4. Create some payslips for the employee (one is enough). 5. Go to Reporting > 281.XX Sheets and try creating a new report for the corresponding year. Problem: When pressing "Compute", you will see a traceback indicating us that an error occured because of the first name not being set. Fix: Adding a check to make sure that the first and last name are set, and raising an error if it is not the case. Task-6318024
This update resolves a crash that occurred when users viewed real Instagram videos within Odoo. The fix now displays the video link instead of attempting to show the video as an image, preventing the previewer from failing. This ensures a smoother user experience when viewing Instagram content.
Original PR description
Purpose ======= When we have a real on Instagram, we try to show the video as an image. When clicking on the broken image, the previewer crash. To fix that issue, we know show the link of the video in the message. Task-5491124 Forward-Port-Of: odoo/enterprise#121176 Forward-Port-Of: odoo/enterprise#113487
This update strengthens the testing process for the AI call debrief feature in Odoo Enterprise. Previously, the test relied on a quick trigger, which wasn't reliable due to the time it takes for browsers to complete audio seeking. This fix adds a deliberate wait, ensuring the test accurately reflects real-world scenarios and improves the overall stability of the AI call debrief functionality.
Original PR description
Before (in the test), we trigger the media loading by manually dispatching the loadeddata event. Once loadeddata runs, our component updates the <audio> element with the new time and triggers the seek. But because the actual seek in the browser takes time, we cannot just do a simple animationFrame(). We must explicitly wait for the browser to finish seeking and that's what we do in this fix. task-6321435 **community counter-part** https://github.com/odoo/odoo/pull/271300
This update corrects a bug where RCM entries for service imports were missing from the GSTR2B report. The team added a necessary section to the report's domain, ensuring accurate reporting of import service charges as required by Indonesian tax regulations. This ensures compliance and accurate financial reporting.
Original PR description
In commit https://github.com/odoo/odoo/commit/16c0ef65b3b755ddb8256914d8f16ecf48e36409, a new section purchase_imp_services_rcm was introduced, but it was not added to the GSTR2B domain. As a result, RCM entries for import of services were missing from the GSTR2B report. This commit adds the new section to the GSTR2B report line domain.
This update resolves an issue where opening attendance records from the Gantt view was failing. The fix removes a redundant process that caused a system deadlock, ensuring that attendance records can now be opened as expected. This improves the usability of the attendance tracking feature.
Original PR description
Steps To Reproduce: Try to open any existing attendance record from gantt view. It doesn't open the Dialog. Issue: onPillClicked wraps `openDialog` in mutex.exec(), but openDialog() already calls mutex.exec() internally, causing a deadlock — the inner exec waits for the outer to finish, while the outer awaits the inner. Fix: Remove redundant mutex.exec() wrapper in onPillClicked. task-6317228
This update prevents users who aren't designated approvers from directly accepting or rejecting approval requests through the system's activity interface. Previously, this allowed unintended actions, creating a potential security risk. This change ensures that approval workflows remain controlled and secure.
Original PR description
Currently when a user submits an approval request, an activity is created for the approver who can validate or refuse the request directly from the activity, however these options are also visible to other users who will trigger an error if interacting with the options. This commit removes these options for users who are not the approver. **Steps to reproduce:** - Log in as admin - Go to approvals - Select dropdown menu of General Approval and Edit - Change documents to optionnal - Make sure admin is in the approvers list - Log in as demo - Go to approvals -> General Approval -> New Request - Submit the request - You'll see an activity be created for admin, with Accept and Refuse options - If you select any of these options you will get an access error opw-5423528 Forward-Port-Of: odoo/enterprise#120767 Forward-Port-Of: odoo/enterprise#109047
This update improves the security of ESG management by separating ESG user access from accounting data. Previously, ESG users automatically had full accounting access, creating potential risks. Now, ESG users have restricted access, allowing organizations to control data visibility and adhere to confidentiality requirements.
Original PR description
Purpose: In some corporate structures, the ESG manager should not have the rights to access all details in the accounting apps (bank journals, invoices etc), for reasons of confidentiality. The idea is to let the user decide whether the ESG manager should have all rights (then put him as ESG Administrator) or restricted/read only rights (then put him as ESG User). Before this PR, once a user got the ESG user role, they also got the accounting user role, which gave them access to all the accounting features. This was not ideal, as it could lead to security issues. After this PR, the ESG user role no longer inherits from the accounting user role by default. It involves that we make some adjustments to the ESG dashboard and emissions views to ensure that they still work correctly without the accounting user role. task-6127245
This update addresses a technical change within the ChatGPT plugin for Odoo Enterprise. The plugin's formatting functionality has been updated to align with a recent API change, ensuring continued compatibility and proper operation. This ensures the plugin continues to function correctly.
Original PR description
The format plugin's shared removeFormats was renamed to removeSelectionFormats. task-6216233 community: https://github.com/odoo/odoo/pull/266372
This update resolves an issue where recurring plans were incorrectly removed from the website when updating product quantities. The fix ensures that recurring plan selections remain active even after changes to the product's price or variant, improving the subscription experience for users. This was caused by a misinterpretation of the 'allow_one_time_sale' flag.
Original PR description
# Introduction note This PR fixes two bugs introduced by the same commit : https://github.com/odoo/enterprise/commit/106d70a1ef0ddbd61a74b7cac82dfce1e316beaa The original commit fixed multiple issues…
# Introduction note This PR fixes two bugs introduced by the same commit : https://github.com/odoo/enterprise/commit/106d70a1ef0ddbd61a74b7cac82dfce1e316beaa The original commit fixed multiple issues regarding the display of recurring plans when the One-time purchase option was enabled, but it also introduced new ones. Theses new issues are due to multiple new checks on `allow_one_time_sale`, but this variable only indicates that the One-time purchase option is available to the user, not that it is actually selected. So the fixes of the original commit works when first loading the page, but fails when the content of the page is updated. # Shared steps - Activate Subscriptions & eCommerce modules - Create a subscription product, enable 'Accept One-Time' and publish it on the website # Bug 1 ## How to reproduce - Add atleast two recurring plans to the product - Go to the product page on the website - Select one of the recurring plans - Increase the quantity of the product ## The problem The recurring plan selection is removed ## Cause The condition `!combination_info.allow_one_time_sale` was added on the `t-att-checked` of the recurring plan selection display. This correctly fixed the issue when first loading the page, but when the user changes the price or the variant, the recurring plan are recomputed and rerendered : https://github.com/odoo/enterprise/blob/0b408acbadb2cfcbc844521f3244a06b7ae7be22/website_sale_subscription/static/src/interactions/product_page.js#L37-L40 When that is the case, that condition blocks the proper display of the selected recurring plan. ## Proposed Solution When loading the recurring plan selection, what defines wich plan is selected is the `subscription_default_pricing_plan_id` variable, which is based on the `plan_id` value given in the request to the server : https://github.com/odoo/enterprise/blob/0b408acbadb2cfcbc844521f3244a06b7ae7be22/website_sale_subscription/models/product_template.py#L222 We make it so if no `plan_id` is sent to the server and `allow_one_time_sale` is enabled, then the server does not give back any `subscription_default_pricing_plan_id` opw-6131532 # Bug 2 ## How to reproduce - Add an attribute with values A & B for the product - Define atleast two recurring plans for the variant with attribute B - Publish the product - Go to the product page - Select the variant with attribute B ## The problem The recurring plan is not displayed. If the order of the attribute is reversed, then it works as expected. ## Cause The pricings are correcly sent to the front-end but they are not added to selection because of the check on `allow_one_time_sale` : https://github.com/odoo/enterprise/blob/0b408acbadb2cfcbc844521f3244a06b7ae7be22/website_sale_subscription/static/src/interactions/product_page.js#L42-L50 opw-6132160 Forward-Port-Of: odoo/enterprise#120873 Forward-Port-Of: odoo/enterprise#115446
This update resolves a crash that occurred when creating payslips for employees in Belgium with overtime. The issue stemmed from a data structure mismatch during payslip generation, specifically related to overtime calculations. The fix removes a problematic function and corrects the data handling to ensure accurate overtime pay processing.
Original PR description
When creating a payslip for an employee in the Belgian localization with an hourly wage and an attendance-based work entry source contract, a traceback occurs if there is an attendance with overtime.…
When creating a payslip for an employee in the Belgian localization with an hourly wage and an attendance-based work entry source contract, a traceback occurs if there is an attendance with overtime. This happens because the overridden `_preprocess_work_hours_data_split_half` method in `l10n_be_hr_payroll_attendance` attempts to unpack `work_entries` assuming it is a list of triplets, but it is passed as a `defaultdict` with composite keys instead. This data structure mismatch results in a `ValueError: not enough values to unpack (expected 3, got 2)`. Even if updated to handle the `defaultdict` structure, `_preprocess_work_hours_data_split_half` would improperly delete the overtime line hours without adding them back elsewhere (the code responsible for adding them back seems to have been removed). Since this function serves no purpose anymore, we omit the call to it. However, because `saas-19.2` is a stable version Task Id: 6253707 Forward-Port-Of: odoo/enterprise#119177 Forward-Port-Of: odoo/enterprise#118676
This update resolves a problem where validating rental orders for kit products (specifically, products with a component BOM) would trigger an error. The fix ensures that the system correctly handles the explosion of the kit BOM during validation, preventing the 'record does not exist' error. This ensures rental orders involving kit products function as expected.
Original PR description
### Steps to reproduce: - Enable rental transfer - Create a rentable product R - Create and confirm a rental order for 1 unit of R - Create a kit bom for R: 1 x COMP - Validate the delivery of your…
### Steps to reproduce:
- Enable rental transfer
- Create a rentable product R
- Create and confirm a rental order for 1 unit of R
- Create a kit bom for R: 1 x COMP
- Validate the delivery of your unit of R
#### > Missing Error: Record does not exist or has been deleted.
### Cause of the issue:
Confirming your rental order will generate a confirm moves of R. However, since at this point the product was not a kit, these will not be exploded. Now, the issue is that at validation The move will be exploded and deleted in the super call:
https://github.com/odoo/enterprise/blob/7cceddaf086d849b8e2121e1023ef3479397534f/sale_mrp_renting/models/stock_move.py#L10-L13 https://github.com/odoo/odoo/blob/0f2f222a431627a672daf10c86ec2578a27f97bb/addons/mrp/models/stock_move.py#L550-L555 https://github.com/odoo/odoo/blob/0f2f222a431627a672daf10c86ec2578a27f97bb/addons/mrp/models/stock_move.py#L591-L593 However, since the overrides of the sale_{mrp,stock}_renting modules call self rather than the result of the super call, they still expect to work with the original move rather than its exploded result: https://github.com/odoo/enterprise/blob/7cceddaf086d849b8e2121e1023ef3479397534f/sale_mrp_renting/models/stock_move.py#L10-L13 https://github.com/odoo/enterprise/blob/7cceddaf086d849b8e2121e1023ef3479397534f/sale_stock_renting/models/stock_move.py#L61-L65
opw-6191841
Forward-Port-Of: odoo/enterprise#120866
Forward-Port-Of: odoo/enterprise#120051This update fixes an issue where the 'Consolidation' filter wasn't visible on multi-company General Ledger reports. The change ensures the filter appears by defaulting to the report's grouping settings, improving reporting accuracy and providing a more complete view of financial data.
Original PR description
The Consolidation filter doesn't appear on the General Ledger, even in multi-company. Since `user_groupby` can also be defined on the `account.report`, this commit adapts the logic for `show_consolidation`, to fallback to the report's groupby. no-task Forward-Port-Of: odoo/enterprise#120533
Features or functions removed from Odoo
This change removes a flag used to track production environments within the VoIP system. Previously, call records were always created, regardless of whether the system was initialized with demo data. This update ensures that call records are only created when demo data is present, streamlining the system and improving efficiency.
Original PR description
`is_production` is not very useful in a production database. Remove it. When a database is initiated without demo data, we don't create voip.call record for any call made in demo mode. When a database is initiated with demo data, no change, we still create voip.call record in all cases. Task-[6304061](https://www.odoo.com/odoo/5778/tasks/6304061)
Code cleanup and technical improvements
This update replaces an outdated JavaScript class (`Deferred`) with a modern equivalent (`Promise.withResolvers()`) across the Odoo codebase. This change improves code efficiency and aligns with current JavaScript standards, ensuring the system remains up-to-date and performs optimally.
Original PR description
…lvers()` The custom `Deferred` class is now obsolete. This commit replaces all instances and calls of `Deferred` across the codebase with the native, modern JavaScript equivalent: `Promise.withResolvers()`. task-5258181
3 changes
Resolved issues and error corrections
This update fixes an error in the CFDI invoice generation process when payments are made in foreign currencies (like USD). Previously, the CFDI document incorrectly displayed the payment amount and rate. The fix ensures the correct USD amount and corresponding MXN rate are used, accurately reflecting the payment details on the CFDI document.
Original PR description
The rate and payment amount shown on the CFDI document generated after updating payments was wrong when the payment was made in a foreign currency. Steps to reproduce: ------------------- * Create a journal that use USD as currency and set the rate to 20 MXN for 1 USD * Create an invoice in MXN and make sure it is set to PPD * Add any product to the invoice for 300$ and post it * Send the invoice to CFDI (a first document should be generated) * Create a payment of 15 USD in the new journal and reconcile it with the invoice * Go back to the invoice and click on "Update payments" to generate the second CFDI document > Observation: The payment document shows an amount of 300 USD with a rate of 1 instead of 15 USD with a rate of 20. Why the fix: ------------ We make sure to use the amount from the statement line when there is one. opw-5974519 Forward-Port-Of: odoo/enterprise#120934 Forward-Port-Of: odoo/enterprise#115779
This update corrects a bug that caused overtime intervals to overlap, particularly during overnight shifts. The fix ensures accurate back-projection of work entries by preventing calculated start times from falling outside the intended timeframe. This improves the reliability of time tracking for employee hours.
Original PR description
__Issue:__ `duration` is rounded to 3 decimals (~1.8s drift) while `time_stop` is exact, so the back-projected start could land before midnight on overnight overtime or middle of the day causing overlaps with the previous line Example: - time_start = 03/05 00:00:00 - time_stop = 03/05 07:07:14 actual duration 7h07m14s gets stored as `duration = 7.121` (= 7h07m15.6s) after `round(_, 3)`. Back-projection yields `datetime_start = 07:07:14 - 7.121h = 02/05 23:59:58`, overlapping by ~2s with the prior line ending at `02/05 23:59:59.999`. __Fix:__ Sort lines by `time_stop` within each date and clamp `datetime_start` to the previously emitted interval's stop when the two intervals genuinely intersect. opw-6170828
This update fixes an issue where scanning an unknown barcode in the POS system didn't automatically open the product creation form. The fix removes a redundant check for API keys, ensuring the form always opens correctly regardless of whether a key is configured. Users can now seamlessly create products by scanning barcodes.
Original PR description
When scanning an unknown barcode in POS, the product creation form was never opened because `barcode_lookup()` was called with no barcode as an implicit API key check. Commit 0c8019a4aa7 ([FIX] product_barcodelookup: avoid crash on invalid image URLs) standardized `barcode_lookup_request()` to always
return a `requests.Response` object, removing the `{'authenticated': True}` dict it previously returned for HTTP 404 responses. As a result the JS check `response?.authenticated` was always falsy and the form never opened.
Fix: remove the API key check entirely. `allowProductCreation()` already gates on the user having product create rights, which is the only condition that matters. If a Barcode Lookup API key is configured the `_onchange_barcode` on the form will auto-fill product data; if not, the user can fill it in manually. Either way the form is always usable.
opw-6295221
Forward-Port-Of: odoo/enterprise#1202566 changes
Resolved issues and error corrections
This update fixes an issue where partial dropship quantities weren't accurately reflected in stock valuation reports. The change ensures that SVL quantities and associated debit/credit amounts align with the actual partial dropship quantities, improving inventory accuracy. This impacts the financial reporting related to dropshipping operations.
Original PR description
**Problem:** partial quantities in a dropship picking is not taken into account for the svl quantity (it's always the full initial quantity) **Steps to reproduce:** - create a storable product with…
**Problem:** partial quantities in a dropship picking is not taken into account for the svl quantity (it's always the full initial quantity) **Steps to reproduce:** - create a storable product with dropship route - set the category as avco auto - set a vendor in the purchase tab with a price of 10 - confirm a SO for a quantity of 2 - confirm the related PO with a unit price of 10 - on the dropship picking change the quantity to 1 - validate without backorder - click on the valuation smart button **Current behavior:** - the svls have quantities of 2 and -2 - the related amls have debit/credit of 20 **Expected behavior:** - the svls should have quantities of 1 and -1 - the related amls should have debit/credit of 10 **Cause of the issue:** when creating the svls we use the move's product_qty instead of its quantity https://github.com/odoo/odoo/blob/c97629d5efb82aed191de211593c539686cae65b/addons/stock_account/models/stock_move.py#L290 **fix:** product_qty is expressed in the uom of the product and quantity in the uom of the move so we need to add a uom conversion to the fix opw-6113031
This update fixes a display issue in the Helpdesk module where ticket labels in list and form views didn't always reflect the most recent state selection. The change removes outdated reference fields, ensuring all views show the correct, up-to-date state labels, improving data consistency.
Original PR description
Steps to reproduce: ------------------------ 1. Install Helpdesk 2. Go to All Tickets and check the kanban state selection value 3. Go to Settings > Field Selection and search for kanban_state in…
Steps to reproduce:
------------------------
1. Install Helpdesk
2. Go to All Tickets and check the kanban state selection value
3. Go to Settings > Field Selection and search for kanban_state in `helpdesk.ticket` model
4. Change one of the state selection values (e.g., "Ready" to "Testing Ready")
5. Go back and check the state selection value in list and form views
Current behavior:
-----------------------
Kanban view correctly shows the updated label (e.g., "Testing Ready"),
but list and form views still display the old default value (e.g., "Ready").
Root cause:
---------------
The [state_selection](https://github.com/odoo/odoo/blob/c09cefdb0ed68b1b7367b77b18a5ee5d66c94900/addons/web/static/src/views/fields/state_selection/state_selection_field.js#L57-L65) widget uses `legend_${state}` field values when available.
Since list and form views included these legend fields, the widget resolved labels from them
instead of the actual selection values, causing inconsistent display.
Fix:
-----
Remove `legend_normal`, `legend_blocked`, and `legend_done` fields from the list and form views,
So the widget falls back to the real selection labels, consistent with how the kanban view behaves.
Reference commit: https://github.com/odoo/enterprise/commit/65f3b88254e3a66e2c5dcb5142d30f6b1996d999
opw-6238765This update resolves an issue where outdated cluster bubbles remained visible on the company map after zooming. The fix corrects a technical error in how the map's clustering functionality was implemented, ensuring that cluster icons are properly removed when zoomed out or panned, improving the map's visual clarity and performance.
Original PR description
Steps to reproduce: =================== 1. Install website_customer, set a Google Maps API key and publish a few companies with coordinates 2. Open /customers 3. Open the map and zoom in a few times…
Steps to reproduce: =================== 1. Install website_customer, set a Google Maps API key and publish a few companies with coordinates 2. Open /customers 3. Open the map and zoom in a few times => stale blue cluster bubbles remain on the map Cause: ====== On the partner map, zooming or panning left old cluster bubbles behind: the blue count icons piled up and never disappeared, even at the closest zoom level. `ClusterIcon` is meant to be a google.maps.OverlayView. The bundled `markerclusterer.js` wires that up by copying every enumerable https://github.com/odoo/odoo/blob/aed1619c34b1f65bd9a3d155fe76a82d404ef5e7/addons/website_google_map/static/src/lib/markerclusterer.js#L213-L221 OverlayView.prototype member onto ClusterIcon.prototype. Google Maps now ships its own OverlayView.prototype.remove, and that copy overwrites ClusterIcon's own `remove()` with it, As a result, when a cluster icon is removed, `ClusterIcon.remove()` is never executed. Consequently, `ClusterIcon.prototype.onRemove()` is not triggered, the cluster icon's DOM element is never detached from the map, https://github.com/odoo/odoo/blob/aed1619c34b1f65bd9a3d155fe76a82d404ef5e7/addons/website_google_map/static/src/lib/markerclusterer.js#L1167 and stale cluster bubbles accumulate after every redraw, zoom, or pan operation. Solution: ========= Inherit from OverlayView through the prototype chain instead of copying it, so ClusterIcon's own remove() is kept and actually detaches the icon. opw-6128531 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a problem in the MZ demo company setup where a valid NUIT number was missing. Newer versions of the stdnum library now check for this number, and this change ensures the demo company meets current requirements. This prevents potential errors when using the MZ localization module.
Original PR description
Newer versions of stdnum (2.2) also test the number for MZ We did not have a valid NUIT number in the MZ demo company. Runbot error: https://runbot.odoo.com/runbot/build/114118067 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#271299
This update resolves an issue where creating new contacts with CUIT values containing special characters (like hidden characters) would cause an error and prevent contact creation. The fix uses regular expressions to extract the numeric part of the VAT number, allowing for correct CUIT validation regardless of these special characters.
Original PR description
Avoid traceback when there is special hidden characters on the VAT numer, compact() method from stdnum does not process it. We use regex to get only the number part for all the doc types ###…
Avoid traceback when there is special hidden characters on the VAT numer, compact() method from stdnum does not process it. We use regex to get only the number part for all the doc types ### Description of the issue/feature this PR addresses: 1. Create new contact 2. add cuit value (in the vat field). This one is copy from an external program with special hidden characteres ### Current behavior before PR: There is a traceback and the user can not create the contact ``` Traceback (most recent call last): ... File "/home/odoo/src/odoo/addons/l10n_ar/models/res_partner.py", line 123, in _get_id_number_sanitize res = int(stdnum.ar.cuit.compact(self.vat)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ValueError: invalid literal for int() with base 10: '\u206030717808599' The above server error caused the following client error: RPC_ERROR: Odoo Server Error RPC_ERROR at makeErrorFromResponse (https://brunetti.adhoc.ar/web/assets/1/debug/web.assets_web.js:30061:19) at XMLHttpRequest.<anonymous> (https://brunetti.adhoc.ar/web/assets/1/debug/web.assets_web.js:30124:27) ``` ### Desired behavior after PR is merged: Will let us to create the contact and validate the cuit no matter if it has or not an special character --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where GSTR-2B reports incorrectly flagged foreign currency vendor bills as 'Partially matched'. The fix ensures accurate reconciliation by comparing GSTR-2B amounts (in INR) with the bill's values, regardless of the bill's currency.
Original PR description
**Steps to reproduce:** * Install the **l10n_in_reports** module. * Go to **Accounting → Configuration → Settings**, and enable **Multi-Currencies**. * Activate a foreign currency (e.g., USD) and set…
**Steps to reproduce:** * Install the **l10n_in_reports** module. * Go to **Accounting → Configuration → Settings**, and enable **Multi-Currencies**. * Activate a foreign currency (e.g., USD) and set an exchange rate. * Create a new vendor bill for an Indian vendor, setting the currency to USD. * Add lines to the bill and apply IGST/GST taxes, then confirm the bill. * Go to **Accounting → Reporting → GST Return Period** and initiate GSTR-2B matching for the period corresponding to the bill (using a valid JSON payload where the amounts are correctly reported in INR). **Observed behavior:** * The vendor bill is incorrectly marked as "Partially matched" instead of "Fully matched", accompanied by an exception stating that the total amount as per GSTR-2B does not match. **Cause:** * The GSTR-2B data fetched from the GST portal always reports values in the company's base currency (INR). * The `match_bills` method was directly comparing the GSTR-2B INR amounts ( `bill_total` and `bill_taxable_value`) against the bill's `amount_total` and `amount_untaxed` fields. * Because these fields return values in the document's foreign currency (e.g., USD), the mismatch triggers an exception and flags the bill as partially matched. **Fix:** * Modified the matching logic to compare GSTR-2B values against `abs(amount_total_signed)` and `abs(amount_untaxed_signed)`. * This ensures that the amounts evaluated during reconciliation are always correctly converted and compared in the company's base currency (INR). opw-6311097 Forward-Port-Of: odoo/enterprise#120967
5 changes
Enhancements to existing features
This update adjusts Odoo's tax settings to reflect a VAT change in Austria. Starting July 1, 2026, the standard VAT rate for certain food categories will shift from 10% to 4.9%. This change impacts tax calculations, chart of accounts, and tax reporting within the Odoo system.
Original PR description
From first of July 2026, the VAT will change from 10% to 4.9% for some food categories. Adapt the taxes, the CoA and the tax return accordingly. task-6273259 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This update ensures that sales orders with recurring products always have a valid subscription plan. Previously, adding a recurring product without a subscription plan didn't trigger a warning, leading to potential errors. This fix introduces a consistent validation process for both manual and catalog product additions, improving order accuracy.
Original PR description
Steps to reproduce: --------------------------------------- 1. Install Subscription Module 2. Create and Confirm SO with no recurring plan and a non-recurring product 3. Add a recurring product >…
Steps to reproduce: --------------------------------------- 1. Install Subscription Module 2. Create and Confirm SO with no recurring plan and a non-recurring product 3. Add a recurring product > Save SO > Observe the User Error 4. Now add the same recurring product through Catalog View Observation: --------------------------------------- No User Error raised stating 'You cannot save a sale order with recurring product and no subscription plan.' Issue: --------------------------------------- When you manually add a line and click 'Save', the constraint (`_constraint_subscription_plan`) is triggered and raised `UserError` https://github.com/odoo/enterprise/blob/434d88960abb5e424fdc1106fc93935d328bff78/sale_subscription/models/sale_order.py#L176-L177 When you add a product via the catalog view, it calls `_update_order_line_info` which directly creates/updates order lines, Which do not trigger the python constraint. https://github.com/odoo/odoo/blob/ef9772bba1515bdaf5410c3af5a3e395f562d513/addons/sale/models/sale_order.py#L1926-L1933 Solution: --------------------------------------- Two private helpers are introduced: * `_is_exempt_from_subscription_plan_check`: single source of truth for all exempt states (draft, cancelled, upsell, and legacy upgrade orders). * `_check_recurring_plan_mismatch`: raises a `UserError` when the order has or will have a recurring product but no subscription plan, reusing the exemption helper so both call sites stay in sync. `_constraint_subscription_plan` is refactored to delegate to these helpers, and `_update_order_line_info` is overridden to call `_check_recurring_plan_mismatch` before the catalog update is applied, ensuring consistent validation across both entry points. opw-6194865
This update corrects a technical issue in the Spanish VAT (l10n_es) module. It ensures that certain taxes are categorized correctly as 'Not Subjected' instead of 'Not Subjected by Location Rules,' aligning with existing tax configurations. This ensures accurate VAT reporting and compliance.
Original PR description
Both should be under the type "Not subjected" instead of "Not subjected by location rules", as we have the other taxes for that goal. @Tecnativa
This update fixes a visual issue where the flag image for Mauritania was incorrectly displayed in the Odoo system. The change ensures that users are presented with the accurate national flag, improving the overall user experience and data consistency. This is a minor update with no impact on functionality.
Original PR description
[task-6320443](https://www.odoo.com/odoo/project.task/6320443)
Documentation and clarification updates
This update formally adds Djody Kort from Codeforward B.V. to Odoo's contributor list through a Corporate Legal Agreement (CLA). This ensures proper authorization for Codeforward to contribute to the project and precedes a planned bug fix. The CLA documentation has been updated to reflect this addition.
Original PR description
Adds me (Djody Kort) to the contributor list of the existing Codeforward B.V. Corporate CLA (`doc/cla/corporate/codeforward.md`). This precedes an upcoming `[FIX] service/server` bug-fix contribution. Codeforward's Corporate CLA v1.0 is already on file (signed by Sander Lienaerts), and I am authorized to contribute on Codeforward's behalf.