Daily updates from Odoo
Navigate
Branch
Tuesday, October 7, 2025
229 changes
20 changes
Enhancements to existing features
The Brazilian AvaTax product form now shows “LC116 Code” instead of “Mercosul NCM Code” when configuring services. This reduces confusion by using the correct terminology for service tax codes while keeping product code labeling unchanged.
Original PR description
Purpose:- - In Brazil, NCM is a code that has an acronym to specify the Mercosul Common Name for products, and for services, the right name is LC116 (Complementary Law 116), which specifies the federal code for a service. - But we have the same field `l10n_br_ncm_code_id` to configure both NCM for goods and LC116 for services and the same table can be used for both the cases. - So while configuring fiscal information for a service, user don't understand why it still shows the NCM label instead of LC116. Before this commit:- - Label `Mercosul NCM Code` was displayed for services confusing users. After this commit:- - Label `Mercosul NCM Code` is replaced with `LC116 Code` only for services. - Tooltip is also improved for better understanding. task-5096435 Forward-Port-Of: odoo/enterprise#96228 Forward-Port-Of: odoo/enterprise#95404
Bank reconciliation now creates the accounting entry as soon as an XML file is uploaded. This lets the imported transaction details be linked directly to the bank statement line, making reconciliation smoother and more complete.
Original PR description
When uploading a xml from the bank rec widget, the move will be created directly so we can put the move lines in the bank statement line. task-5107112 Forward-Port-Of: odoo/enterprise#95345
This update streamlines how developers configure website builder options, making related settings easier to keep together and reuse. It mainly affects appointment, online booking, and rental website features, helping future improvements be delivered more consistently with limited direct user impact.
Original PR description
The commit: 1. use static property to configure a builder option 2. introduce the concept of dependencies to access the plugin's shared in builder option 3. make a plugin context the same for Plugin,…
The commit:
1. use static property to configure a builder option
2. introduce the concept of dependencies to access the plugin's shared
in builder option
3. make a plugin context the same for Plugin, BuilderOption and
BuilderAction to have the same API in each class.
Before this commit, to define an option, we had to define a javascript
object that would contain the information of the option within the
`builder_options` resource.
```js
class MyPlugin extends Plugin {
resources: {
builder_options: [
{
selector: "div.selector",
template: "my.owlTemplate",
cleanForSave() {}
// ... other option props
}
]
}
}
// For a custom component
class MyPlugin extends Plugin {
resources: {
builder_options: [
{
selector: "div.selector",
template: MyCustomComponent,
cleanForSave() {}
// ... other option props
}
]
}
}
class MyCustomComponent extends BaseOptionComponent {
// ...
}
```
When building anything for the builder, there is 3 classes that are
important: `Plugin`, `BaseOptionComponent`, `BuilderAction`.
In practice, the option object defined in builder_options feels
strange. On the other hand, making the configuration of the option as
a static property of the component somehow feels simpler as everything
related to that option is defined in the same class.
```js
class MyPlugin extends Plugin {
resources: {
builder_options: [MyCustomComponent]
}
}
class MyCustomComponent extends BaseOptionComponent {
static template = "my.owlTemplate";
static selector = "div.selector";
static cleanForSave(context) {}
// ...
}
```
To have the same mental context in the 3 important class, they all
share the same API (`dependencies`, `dispatchTo`, `getResource`, ...)
(see `Editor.getPluginContext`)
To access a plugin shared method, it's now the same for `Plugin`,
`BuliderAction` and `BaseOptionComponent`:
```js
class MyCustomComponent extends BaseOptionComponent {
static selector = "mySelector";
static dependency = "myPlugin";
myMethod() {
this.dependencies.myPlugin.pluginMethod();
}
}
```
To access a resource, dispatch, ...:
```js
class MyCustomComponent extends BaseOptionComponent {
static selector = "mySelector";
myMethod() {
const resource = this.getResource('myResource');
}
}
```The website HTML builder now uses a cleaner internal structure for configuring editing options and sharing functionality between builder components. This makes future website editing features easier to build and maintain, with little direct impact on end users.
Original PR description
1. use static property to configure a builder option 2. introduce the concept of dependencies to access the plugin's shared in builder option 3. make a plugin context the same for Plugin, BuilderOption and BuilderAction to have the same API in each class. See https://github.com/odoo/odoo/pull/220746
Resolved issues and error corrections
The message shown when fetching bank transactions finds no results now displays correctly instead of showing raw formatting tags. This makes the banking workflow clearer and more professional for users when filters or transaction fetches return no matches.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
This fix prevents the HTML editor from getting stuck and showing an error when users remove formatting from colored table cells. It makes table color handling more consistent, so formatting can be cleared safely without interrupting editing work.
Original PR description
Problem: When having a `table` with `color` and selecting a cell to remove format, we get a traceback: "Infinite Loop in removeAllColor()." Cause: The color is applied on `table`, but we only process `td` for color removal. As the color remains on `table`, each attempt to remove it keeps reapplying, leading to an infinite loop. Solution: When removing color, also remove it from the `table`. Then apply the color to all child `td`. This ensures `td` colors are later removed automatically if selected, avoiding the loop. Steps to reproduce: 1. Add a `color` property to a `table` and `td`. 2. Select the `td`. 3. Click "remove format" from the toolbar. 4. Observe traceback. opw-5112088 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229878
The website profile email validation banner now remains hidden after a user closes it. This prevents confusing repeat messages about email validation and creates a smoother account experience.
Original PR description
### Issue 1: The validated email success banner wasn’t triggering the RPC call because Bootstrap’s `data-bs-dismiss="alert"` removed the element from the DOM before the handler could run. ### Issue 2 Closing the banner previously triggered `/profile/validate_email/close` RPC, which reset `validation_email_done` to false. This mistakenly caused the “email sent” banner to reappear, confusing users. ### Solution - Overwrite Bootstrap’s `close.bs.alert` event to trigger the RPC when the success banner is dismissed. - Set `validation_email_sent = False` so the banner stays hidden after being closed. Task-5049533 Forward-Port-Of: odoo/odoo#229913 Forward-Port-Of: odoo/odoo#225872
Fixes Belgian EC Sales List reporting when a company's VAT number was entered without the country prefix. This prevents incorrect trimming of VAT numbers and ensures Belgian reports consistently use Belgium as the country code.
Original PR description
It could happen that the user set his vat number without the country code before the number. In this case, we removed the two first digits of the vat number. Also changing other occurrence using the company_vat to get the country, since we are in the belgian ec sale list, the country_code should be 'BE' everytime task-5039969 Forward-Port-Of: odoo/enterprise#93377
Live chat visitors are now prevented from starting calls or inviting additional guests from chat threads. This keeps visitor capabilities aligned with intended support workflows and reduces unwanted or confusing actions during live chat sessions.
Original PR description
This commit removes the possibility for live chat visitors to start a call and invite guests. task-4849019 Forward-Port-Of: odoo/odoo#229796 Forward-Port-Of: odoo/odoo#228531
This fix makes Mail channel mention suggestions more reliable when replying in channel threads. It corrects a test setup and mock response format so the issue is consistently covered and future regressions are easier to catch.
Original PR description
Back-port of https://github.com/odoo/odoo/pull/230157 https://runbot.odoo.com/odoo/runbot.build.error/233201 Problematic line introduced: https://github.com/odoo/odoo/pull/209240 Test introduced: https://github.com/odoo/odoo/pull/226563 Test adapted to be more deterministic: remove current user from channel to ensure the channel is always found through the suggestion route. Fixed returned format of mock server.
Reordering rules now calculate purchase quantities correctly when product packaging uses multiples that create repeating decimals. This prevents Odoo from generating purchase orders with slightly inflated quantities, such as 1.02 instead of 1, helping keep purchasing accurate.
Original PR description
**Steps to reproduce:** - enable "units of measure & packagings" settings - navigate to "units and packagings" and create a new one called "pack of 2" - set a quantity of 2 and the reference unit as…
**Steps to reproduce:** - enable "units of measure & packagings" settings - navigate to "units and packagings" and create a new one called "pack of 2" - set a quantity of 2 and the reference unit as "units" - create a new storable product - next to "sale price" change the unit to "pack of 6" - in the sales tab add "pack of 2" in the packagings - in the purchase tab add a vendor - click on the reordering rule smart button and create a new one - set the min and max to 0 and set the replenishment multiple to "pack of 2" (you might have to make this column visible using the filters) - create and confirm a quotation for 1 pack of 6 **Current behavior:** a new Purchase Order is created for a quantity of 1.02 **Expected behavior:** it should be a quantity of 1 **Cause of the issue:** qty_multiple is rounded (in _compute_quantity) before the computation of remainder. https://github.com/odoo/odoo/blob/7a0a246016d50ae80e49f3502a97e82d414ab0b0/addons/stock/models/stock_orderpoint.py#L373-L376 In cases of repeating decimal numbers (like 0.3333333 in our example), this leads to the remainder not being 0 even though it should be 0. opw-5040144 Forward-Port-Of: odoo/odoo#228014
Employees with flexible working hours will no longer see weekends automatically marked as unavailable in the timesheet grid. This prevents misleading greyed-out days for people who can choose when they work, making time entry clearer and more accurate.
Original PR description
To reproduce: ============= 1- Update employee worktime to be flexible 2- Go to timesheets -> saturday & sunday are marked grey Problem: ======== Can't apply https://github.com/odoo/odoo/blob/ce2d134d3e8e5c0d96529c1d0490f1e0c5e28294/addons/resource/models/resource_calendar.py#L511 This logic cannot be applied when an employee's work time is flexible, since they can work whenever they want. Fix: ==== When employee work time is flexible we just return empty list for the unavailable dates. opw-5031144 Forward-Port-Of: odoo/enterprise#96181 Forward-Port-Of: odoo/enterprise#94346
Odoo now handles Gelato cancellation updates without crashing when a removed email template is no longer available. Instead of trying to send that missing notification, it records the cancellation status in the sales order chatter so teams can still see the update.
Original PR description
After an order is canceled on Gelato, we receveive a webhook with an `fulfillmentStatus` of `cancel` and while processing it, it crash with: ``` ValueError: External ID not found in the system: sale.mail_template_sale_cancellation ``` The mail template used to notify the status change has been removed in odoo/odoo@2c858ed15e50, so instead we simplify log the information on the sale order chatter. opw-5110226 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230121
Opening the Helpdesk ticket list with no tickets now works correctly instead of crashing. This improves reliability for teams starting with an empty ticket queue or after clearing all tickets.
Original PR description
When accessing the Helpdesk ticket list view with zero tickets, the view previously crashed due to improper handling of folded sample data. This commit ensures that sample data folding does not trigger errors when the view is empty, improving overall stability. Steps to reproduce: 1. Navigate to Helpdesk > Teams > Tickets. 2. Ensure there are no tickets. 3. Switch to list view. Task-4971510
Users can now create automated actions in Documents that generate journal entries for credit card journals. This fixes a blockage that prevented credit card statement workflows from being set up correctly.
Original PR description
We are unable to create an action to create a credit card statement on a journal with type credit card Allow to create a Server Action to create Journal Entries in journals of type "Credit Card" in Documents. task-5123868 Forward-Port-Of: odoo/enterprise#95905
This fix keeps a cashier’s manually selected tax setup when validating a Spanish point-of-sale order. It prevents incorrect tax amounts from appearing as change on receipts, improving accuracy for shops using Spanish simplified invoicing.
Original PR description
Currently, when you use a default fiscal position in the pos, if you switch to no fiscal position, upon order validation the tax amount is counted as change. Steps to reproduce: ------------------- *…
Currently, when you use a default fiscal position in the pos, if you switch to no fiscal position, upon order validation the tax amount is counted as change. Steps to reproduce: ------------------- * Install l10n_es_pos, switch to es company * In the config of a shop, use fiscal position, set some as available, one as default * Open shop session * Add a product that has taxes * Switch fiscal position to one that has 0% taxes * There should not be taxes in the cart at this point * Go to pay the order (cash or bank) > Observation: On the receipt the previous tax value is counted as change Why the fix: ------------ The issue happens because of the simplified invoice mechanism present in the ES localization. When you validate an order and that order can apply for simplified invoice, if there is no customer on the order the partner is set with the simplified partner. When setting a partner on the order we update the fiscal position and pricelist. https://github.com/odoo/odoo/blob/1358f93a4c73de5a28cda72ec78769625c863efd/addons/point_of_sale/static/src/app/models/pos_order.js#L929 The fiscal position is updated with the partner's fiscal position or the default one if none on the partner. https://github.com/odoo/odoo/blob/1358f93a4c73de5a28cda72ec78769625c863efd/addons/point_of_sale/static/src/app/models/pos_order.js#L986-L995 Instead of the fallback on the default fiscal position in the case it is not set on a partner we fallback on the order current fiscal position. If it is different than the default one is means that it was changed intentionally and there's a high chance we want to keep it, otherwise it will already be the default fp. opw-5051231 Forward-Port-Of: odoo/odoo#229237
Self-order customers will no longer see or select time slots that have already reached their allowed capacity. This prevents overbooking and fixes time zone handling so availability is calculated against the correct slot time.
Original PR description
**Steps to reproduce:** - Have a preset that requires time slots - Make the slots_per_interval 1 and the interval_time long enough - Go to the self order, make a purchase and select a slot - Make…
**Steps to reproduce:** - Have a preset that requires time slots - Make the slots_per_interval 1 and the interval_time long enough - Go to the self order, make a purchase and select a slot - Make another purchase - The slot we chose before is still showing and available **Why the fix:** Once the capacity of a time slot has been reached, we should not allow customer to chose it. This behavior occured for 2 reasons: - In the xml file where we declare this select, we did not take the fact that a slot could be full into account, leading to it always being showed. This is now done using the isFull attribute, like it is done in the regular PoS. - This same isFull was not correctly set, as there was a mismatch in slots timezone and format. When we retrieved them from the server, they were in UTC timezone, but the current slot we were working with was in the locale timezone. It is now converted to UTC to check if we already hit max capacity. Before this, selecting a timezone was actually selecting the one that was two hours earlier (for Belgium). With this commit, the values that reached max capacity will not be displayed on the select for the time slots anymore. opw-5092888 Forward-Port-Of: odoo/odoo#228441
This fixes an issue where users could paste text into protected, non-editable areas while editing website content. The change helps preserve locked content and prevents accidental modifications in the website builder.
Original PR description
When the selection is on text inside an element which is not `contenteditable` and is a inside the editable root, the user could paste text that would get inserted. This commit prevents that by ignoring `paste` events when selection is in a `contenteditable=false`. Steps to reproduce: - On `form/help-1`, open website builder - Select the text of "Help" title - Paste text - Bug: text is inserted task-4367641 Forward-Port-Of: odoo/odoo#228149
This fix makes an automated test for signed document cleanup reliable by avoiding timing edge cases around deletion dates. It helps prevent false test failures without changing how users work with documents.
Original PR description
Steps to reproduce
==================
Launch the test `test_gc_clear_bin` a few times
It will eventually fail:
documents.document(544,) is not false :
trash document should be deleted after gc_clear_bin
Cause of the issue
==================
The domain for wether a record should be deleted contains `('write_date', '<=', fields.Datetime.now() - relativedelta(days=deletion_delay)`
The tests fails when the write_date is in the same second as the test run.
This is because fields.Datetime.now() replaces microseconds by 0.
https://github.com/odoo/odoo/blob/14073faf1fa272b8d3411b4fe6f42c279058459d/odoo/fields.py#L2378
Solution
========
Since records needs to be at least "deletion_delay" old, we add a margin of 30 seconds to make sure they match
runbot-224207
Forward-Port-Of: odoo/enterprise#95926Miscellaneous changes
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
Original PR description
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
11 changes
Enhancements to existing features
The Brazilian AvaTax product setup now shows the correct LC116 label when configuring services instead of referring to Mercosul NCM, which applies to goods. This reduces confusion for users entering fiscal information and improves the supporting tooltip explanation.
Original PR description
Purpose:- - In Brazil, NCM is a code that has an acronym to specify the Mercosul Common Name for products, and for services, the right name is LC116 (Complementary Law 116), which specifies the federal code for a service. - But we have the same field `l10n_br_ncm_code_id` to configure both NCM for goods and LC116 for services and the same table can be used for both the cases. - So while configuring fiscal information for a service, user don't understand why it still shows the NCM label instead of LC116. Before this commit:- - Label `Mercosul NCM Code` was displayed for services confusing users. After this commit:- - Label `Mercosul NCM Code` is replaced with `LC116 Code` only for services. - Tooltip is also improved for better understanding. task-5096435 Forward-Port-Of: odoo/enterprise#96228 Forward-Port-Of: odoo/enterprise#95404
Resolved issues and error corrections
This fix resolves an issue where users could be blocked from validating a backordered delivery in warehouses using a two-step delivery flow. It ensures stock reservations are adjusted correctly when lot-tracked products are split across packages and backorders, helping deliveries proceed without manual workarounds.
Original PR description
# Problem Unreserve issue preventing users from validating a delivery order with 2-step delivery warehouse configuration. Introduced in the following commit:…
# Problem Unreserve issue preventing users from validating a delivery order with 2-step delivery warehouse configuration. Introduced in the following commit: https://github.com/odoo/odoo/commit/13567aa27250f5798bbe42648eeac82241dbb780 # Steps to reproduce on the runbot: - Activate packages - Edit the warehouse to deliver in 2-steps - Create a product tracked by lot - Create two lots with 5 qty each - Create a sale order with 10 qty and confirm - Check the delivery order and assign: => 2 units to lot1 and create a pkg for it => 1 units to lot1 without pkg => 3 to lot2 without package - Validate the delivery and create a backorder - go to pick backorder and try to validate - Unreserve issue pops up - For further details, check: [#225948](https://github.com/odoo/odoo/issues/225948) # Solution: Conditional subtracting limited to new lines only. Task ID: opw-5086289 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229994 Forward-Port-Of: odoo/odoo#229420
The bank journal message shown when no transactions are found now displays correctly instead of showing raw HTML text. This improves clarity for users when fetching bank transactions or changing filters with no matching results.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
Removing formatting from a selected table cell no longer triggers an error when color formatting was applied to the whole table. This makes the HTML editor more reliable for users editing styled tables.
Original PR description
Problem: When having a `table` with `color` and selecting a cell to remove format, we get a traceback: "Infinite Loop in removeAllColor()." Cause: The color is applied on `table`, but we only process `td` for color removal. As the color remains on `table`, each attempt to remove it keeps reapplying, leading to an infinite loop. Solution: When removing color, also remove it from the `table`. Then apply the color to all child `td`. This ensures `td` colors are later removed automatically if selected, avoiding the loop. Steps to reproduce: 1. Add a `color` property to a `table` and `td`. 2. Select the `td`. 3. Click "remove format" from the toolbar. 4. Observe traceback. opw-5112088 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229878
Closing the email validation banner now keeps it hidden instead of making the “email sent” message appear again. This avoids confusing repeat prompts and gives users a smoother profile experience.
Original PR description
### Issue Closing the banner triggered `/profile/validate_email/close` RPC, which reset `validation_email_done` to false. This mistakenly caused the “email sent” banner to reappear, confusing users. ### Solution Set `validation_email_sent = False` so the banner stays hidden after being closed. Task-5049533 Forward-Port-Of: odoo/odoo#229913 Forward-Port-Of: odoo/odoo#225872
Credit notes created after a sales down payment now correctly reverse the cost of goods sold. This keeps inventory and accounting entries accurate when customers are refunded after partial invoicing.
Original PR description
**Problem:** When we do a downpayment on an invoice then pay the rest and do a credit note, the credit note does not reverse the cogs **Steps to reproduce:** - create a storable product invoiced on…
**Problem:** When we do a downpayment on an invoice then pay the rest and do a credit note, the credit note does not reverse the cogs **Steps to reproduce:** - create a storable product invoiced on ordered quantity - set the category of the product as avco and "inventory valuation" of the category as automated - set an onhand quantity and a positive cost - create a SO for 1 quantity of this product and confirm - click on create invoice, select downpayment percentage and 25% - click on create draft and confirm it - click on create invoice, select regular, create draft - confirm and select credit note - write something in the reason field and click on reserve - confirm it **Current behavior:** if you open the "Journal Items" page of the credit note you'll see that there is no line revresing the cogs (there would be if we didn't do a downpayment but invoiced all at once) **Expected behavior:** There should be: - A line crediting "600000 Expenses" (or the account that was debited for the cogs on the original invoice) with the amount being the cost of your product. - A line debiting "110300 stock interim (delivered)"(or the account that was credited for the cogs on the original invoice) with the amount being the cost of your product. **Cause of the issue:** Since this commit https://github.com/odoo/odoo/pull/163251/commits/d7b0510908d341c205461ca18b1730c93b88e445 (slightly modfified for efficieny reasons by this commit https://github.com/odoo/odoo/commit/4f9c52c03c65a497937053530e8d6c775d305e35), when _stock_account_prepare_anglo_saxon_out_lines_vals is called on the account move (the credit note) it calls _get_anglo_saxon_price_ctx. https://github.com/odoo/odoo/blob/76a8d6bc28eb5998bd976b3c41bf9772d325c8bf/addons/stock_account/models/account_move.py#L114 One of the invoice lines of the account move is linked via sale_line_ids attribute to a sale order line that is a downpayment. As a consequence, inside _get_anglo_saxon_price_ctx, move_is_downpayment will be populated with this line. https://github.com/odoo/odoo/blob/76a8d6bc28eb5998bd976b3c41bf9772d325c8bf/addons/sale_stock/models/account_move.py#L136-L139 Then _stock_account_prepare_anglo_saxon_out_lines_vals calls _stock_account_get_anglo_saxon_price_unit. https://github.com/odoo/odoo/blob/76a8d6bc28eb5998bd976b3c41bf9772d325c8bf/addons/stock_account/models/account_move.py#L131 Inside this method, because move_is_downpayment is populated, is_line_reversing will stay false https://github.com/odoo/odoo/blob/76a8d6bc28eb5998bd976b3c41bf9772d325c8bf/addons/sale_stock/models/account_move.py#L163-L164 As a consequence, - qty_to_invoice will become - qty_to_invoice - account_move will be populated - therefore posted_cogs will be populated https://github.com/odoo/odoo/blob/76a8d6bc28eb5998bd976b3c41bf9772d325c8bf/addons/sale_stock/models/account_move.py#L166-L174 So _compute average price will be called with a qty_invoiced of 1 instead of 0 and a qty_to_invoice of -1 instead of 1. So it will return 0 instead of the cost of the product because "missing" will be negative. https://github.com/odoo/odoo/blob/76a8d6bc28eb5998bd976b3c41bf9772d325c8bf/addons/stock_account/models/product.py#L915 **fix** The use case of this commit https://github.com/odoo/odoo/pull/163251/commits/d7b0510908d341c205461ca18b1730c93b88e445 is this one : - SO for qty of 10 (product invoiced on delivered qty). - 100% downpayment. - deliver 6. - invoice. In that case the invoice is actually a credit note but it still has to include the cogs (not reversed), so move_is_downpayment needs to be populated However in our use case the cogs has to be reversed (so move_is_downpayment has to be None). One difference between those two use case is that in our use case the account move has a reversed_entry_id. opw-5041783 Forward-Port-Of: odoo/odoo#229156 Forward-Port-Of: odoo/odoo#226809
Belgian EC sales reports now correctly handle company VAT numbers even when users entered them without the Belgian country prefix. This prevents valid VAT numbers from being shortened incorrectly and helps keep Belgian reporting accurate.
Original PR description
It could happen that the user set his vat number without the country code before the number. In this case, we removed the two first digits of the vat number. Also changing other occurrence using the company_vat to get the country, since we are in the belgian ec sale list, the country_code should be 'BE' everytime task-5039969 Forward-Port-Of: odoo/enterprise#93377
This fixes an inventory valuation issue where FIFO product costs could be updated from the wrong starting value after a manual revaluation. Product costs now stay aligned with the actual stock valuation, improving inventory and accounting accuracy.
Original PR description
**Steps to reproduce:** - create a storable product with fifo category - update the cost to 200 - click on the on hand smart button and add a quant of 1 quantity - update the cost to 300 - click on…
**Steps to reproduce:** - create a storable product with fifo category - update the cost to 200 - click on the on hand smart button and add a quant of 1 quantity - update the cost to 300 - click on the on hand smart button and update the quantity to 2 - the value should be 500, which makes a 250 value per product - open Inventory/valuation and search your product - group by product, select your product and click on "+" icon to open the revaluation widget - add 200 (so +100 per unit) - go back to the product form **Current behavior:** the cost is now at 400 **Expected behavior:** the cost should be at 350 (250 + 100) If we change the standard_price we should change it in accordance with the valuation **Cause of the issue:** In action_validate_revaluation, during the update of the standard_price, the current standard_price (set by the user and disconnected from the valuation) is used in the computation. https://github.com/odoo/odoo/blob/5118f7cb80744f901d7028dc75c29aba9591b83b/addons/stock_account/wizard/stock_valuation_layer_revaluation.py#L127 opw-5028848 Forward-Port-Of: odoo/odoo#228457
Employees with flexible working hours will no longer see weekends incorrectly marked as unavailable in the timesheet grid. This avoids confusion for people who can work on any day and makes time entry reflect their flexible schedule.
Original PR description
To reproduce: ============= 1- Update employee worktime to be flexible 2- Go to timesheets -> saturday & sunday are marked grey Problem: ======== Can't apply https://github.com/odoo/odoo/blob/ce2d134d3e8e5c0d96529c1d0490f1e0c5e28294/addons/resource/models/resource_calendar.py#L511 This logic cannot be applied when an employee's work time is flexible, since they can work whenever they want. Fix: ==== When employee work time is flexible we just return empty list for the unavailable dates. opw-5031144 Forward-Port-Of: odoo/enterprise#96181 Forward-Port-Of: odoo/enterprise#94346
Spanish Point of Sale orders now keep the fiscal position selected by the cashier when the order is validated. This prevents incorrect receipt totals where a previous tax amount could appear as change after switching to a no-tax fiscal position.
Original PR description
Currently, when you use a default fiscal position in the pos, if you switch to no fiscal position, upon order validation the tax amount is counted as change. Steps to reproduce: ------------------- *…
Currently, when you use a default fiscal position in the pos, if you switch to no fiscal position, upon order validation the tax amount is counted as change. Steps to reproduce: ------------------- * Install l10n_es_pos, switch to es company * In the config of a shop, use fiscal position, set some as available, one as default * Open shop session * Add a product that has taxes * Switch fiscal position to one that has 0% taxes * There should not be taxes in the cart at this point * Go to pay the order (cash or bank) > Observation: On the receipt the previous tax value is counted as change Why the fix: ------------ The issue happens because of the simplified invoice mechanism present in the ES localization. When you validate an order and that order can apply for simplified invoice, if there is no customer on the order the partner is set with the simplified partner. When setting a partner on the order we update the fiscal position and pricelist. https://github.com/odoo/odoo/blob/1358f93a4c73de5a28cda72ec78769625c863efd/addons/point_of_sale/static/src/app/models/pos_order.js#L929 The fiscal position is updated with the partner's fiscal position or the default one if none on the partner. https://github.com/odoo/odoo/blob/1358f93a4c73de5a28cda72ec78769625c863efd/addons/point_of_sale/static/src/app/models/pos_order.js#L986-L995 Instead of the fallback on the default fiscal position in the case it is not set on a partner we fallback on the order current fiscal position. If it is different than the default one is means that it was changed intentionally and there's a high chance we want to keep it, otherwise it will already be the default fp. opw-5051231 Forward-Port-Of: odoo/odoo#229237
Miscellaneous changes
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
Original PR description
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
9 changes
Resolved issues and error corrections
The message shown when bank transaction fetching or filtering finds no results now displays correctly instead of showing raw formatting code. This makes the banking workflow clearer and more professional for users when no transactions are available.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
This fix prevents subscription invoices from accidentally overwriting the correct values on combo product sections. It also avoids adding unnecessary information to those sections, helping invoices stay accurate and cleaner for customers.
Original PR description
This commit improve fix of PR https://github.com/odoo/enterprise/pull/90989 to avoid overriding right combo section values and avoid setting unnecessary values on the section. opw-5069278 Forward-Port-Of: odoo/enterprise#94776
Belgian EC Sales reporting now handles company VAT numbers that were entered without the BE country prefix. This prevents incorrect removal of the first two VAT digits and ensures Belgian reports consistently use Belgium as the country.
Original PR description
It could happen that the user set his vat number without the country code before the number. In this case, we removed the two first digits of the vat number. Also changing other occurrence using the company_vat to get the country, since we are in the belgian ec sale list, the country_code should be 'BE' everytime task-5039969 Forward-Port-Of: odoo/enterprise#93377
SEPA Direct Debit payments now correctly validate whether a customer's mandate is still active. This prevents valid future-dated mandates from being rejected incorrectly, reducing avoidable payment failures.
Original PR description
The check to ensure that the mandate used in a token payment is still valid had two issues: - It was comparing a date (the mandate's end date) with a datetime. - It was incorrectly rejecting mandates expiring in the future, while it should have done the opposite. Forward-Port-Of: odoo/enterprise#96263 Forward-Port-Of: odoo/enterprise#96143
The Unrealized Currency Gains/Losses report now correctly creates draft adjustment entries even when users customize how report lines are grouped. This prevents an incorrect “No adjustment needed” error and helps accounting teams complete currency revaluation workflows reliably.
Original PR description
**Steps to reproduce** - Edit "Unrealized Currency Gains/Losses" report configuration as follows: - Lines > Accounts To Adjust, set GroupBy to 'currency_id, partner_id, account_id, id' - Lines > Excluded Accounts, set GroupBy to 'currency_id, partner_id, account_id, id' - In Options, check 'Unfold All' - View the report > Click 'Adjustment Entry' **Issue** Instead of creating a draft journal entry an user error "No adjustment needed" will block the action **Solution** The issue occurs because when retrieving the lines we assume they are grouped as per default, by 'currency_id, account_id' In case users modify the expression line default grouping to something else, like 'currency_id, partner_id, account_id', we no longer collect values correctly. In order to fix the issue we can unfold all and manually group values by currency_id, account_id opw-4792502 Forward-Port-Of: odoo/enterprise#90894
This fixes an intermittent failure in automated tests for signed document cleanup. It adds a small timing margin so documents marked for deletion are consistently recognized as old enough to remove, improving release stability without changing user-facing behavior.
Original PR description
Steps to reproduce
==================
Launch the test `test_gc_clear_bin` a few times
It will eventually fail:
documents.document(544,) is not false :
trash document should be deleted after gc_clear_bin
Cause of the issue
==================
The domain for wether a record should be deleted contains `('write_date', '<=', fields.Datetime.now() - relativedelta(days=deletion_delay)`
The tests fails when the write_date is in the same second as the test run.
This is because fields.Datetime.now() replaces microseconds by 0.
https://github.com/odoo/odoo/blob/14073faf1fa272b8d3411b4fe6f42c279058459d/odoo/fields.py#L2378
Solution
========
Since records needs to be at least "deletion_delay" old, we add a margin of 30 seconds to make sure they match
runbot-224207
Forward-Port-Of: odoo/enterprise#95926Danish banks were rejecting some ISO20022 payment files because a required clearing instruction was missing. This fix lets businesses configure the needed clearing code so payment files can be accepted while leaving files unchanged when no code is set.
Original PR description
The denmark banks were refusing ISO20022 documents because there was a missing field: "//PmtInf/PmtTpInf/LclInstrm/Cd" or "//PmtInf/CdtTrfTxInf/PmtTpInf/LclInstrm/Cd". One of those field should be filled by either 'ONCL' or 'SDCL' which means 'Over Night Clearing' or 'Same Day Clearing'. To fix this we added a config parameter with a key: account_iso20022.local_instrument_code where we can set OCNL or SDCL to add the required field to the iso document. If nothing is set, the field will not be added. opw-5073076 Forward-Port-Of: odoo/enterprise#95903
Users who are allowed to print and send SEPA Direct Debit mandates can now generate, email, and reopen the related PDF attachments without needing an extra accounting read-only permission. This prevents failed mandate emails and avoids blocking users from accessing documents they created.
Original PR description
Removing the groups restriction from the `mandate_pdf_file` field in model `sdd.mandate` because it was causing issues when using the `sdd.mandate.send` wizard. Any user who has access to the `sdd.mandate` model can use this wizard to print and send the record. During this process, the system generates a PDF and stores it in the `mandate_pdf_file` binary field, linking the resulting attachment to the record. The previous group restriction prevented users who were not part of the `account.group_account_readonly` group from sending the email with the attachment. Even if the email was somehow sent, those users still couldn’t access the attachments they themselves had generated and sent. With this change, any user who is allowed to send and print `sdd.mandate` records will also be able to generate and later access the corresponding attachments. Forward-Port-Of: odoo/enterprise#96119
Miscellaneous changes
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
Original PR description
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
24 changes
New functionality added to Odoo
Spanish localization now supports filing returns directly for the relevant tax forms, replacing the separate BOE export flow. This centralizes submission guidance and export steps, adds closing entries for key forms, and folds the temporary 2024 reports module into the main Spanish reports module.
Original PR description
Add the return option on all appropriate modelos. This was the opportunity to : - Remove the BOE export button from the reports (since this is now handled in the returns) - Add the BOE wizards content in the return wizard, along with modelo-specific instructions of submission - Make the 349 report inherit the generic ec sales list, which is correct, thoughit still also inherit the tax report in order to avoid refactoring the whole inheritance line. This will have to be cleaned up in a later refactoring task. - Create specific closing entries for the modelos 111, 115 and 303 - remove the l10n_es_reports_2024 module, which was a temporary fix and can now be merged task-4987796 related : https://github.com/odoo/upgrade/pull/8135
Enhancements to existing features
VoIP call recordings are now saved in mono instead of stereo. This reduces storage usage while preserving the practical quality needed for recorded conversations.
Original PR description
Task-5082457 Forward-Port-Of: odoo/enterprise#96238
The VoIP call history now includes a direct internal link to open the detailed call form. This makes it quicker for users to review call information without extra navigation steps.
Original PR description
Task-4962728
The Brazilian AvaTax product setup now shows the service-specific LC116 Code label instead of Mercosul NCM Code when configuring services. This reduces confusion for users by matching the label and tooltip to the correct Brazilian service tax classification.
Original PR description
Purpose:- - In Brazil, NCM is a code that has an acronym to specify the Mercosul Common Name for products, and for services, the right name is LC116 (Complementary Law 116), which specifies the federal code for a service. - But we have the same field `l10n_br_ncm_code_id` to configure both NCM for goods and LC116 for services and the same table can be used for both the cases. - So while configuring fiscal information for a service, user don't understand why it still shows the NCM label instead of LC116. Before this commit:- - Label `Mercosul NCM Code` was displayed for services confusing users. After this commit:- - Label `Mercosul NCM Code` is replaced with `LC116 Code` only for services. - Tooltip is also improved for better understanding. task-5096435 Forward-Port-Of: odoo/enterprise#96228 Forward-Port-Of: odoo/enterprise#95404
This update changes how AI and WhatsApp conversations identify and manage the person on the other side of a chat. It helps keep chat participant information more consistent across messaging features, reducing the risk of mismatched or duplicated conversation details.
Original PR description
task-4675831
This update streamlines automated checks for the online shop by using more appropriate test helpers and starting tests closer to the relevant product pages. It helps keep eCommerce testing faster, clearer, and easier to maintain without changing the customer-facing shopping experience.
Original PR description
* use the right tour utils * start tours from product page when there is no reason to start from shop page
Bank reconciliation now creates the accounting entry immediately when an XML file is uploaded. This helps the uploaded transaction details flow directly into the bank statement line, reducing manual follow-up and making reconciliation smoother.
Original PR description
When uploading a xml from the bank rec widget, the move will be created directly so we can put the move lines in the bank statement line. task-5107112 Forward-Port-Of: odoo/enterprise#95345
The point of sale integration for UrbanPiper has been adjusted to stay compatible with recent product option changes in Odoo. This helps restaurants keep managing product attributes consistently when syncing menus and orders with delivery platforms.
Original PR description
task-4731792
Emission factor assignation rules can now use product categories, so products in the same category automatically follow the same rule. This reduces manual setup for ESG carbon emissions tracking and helps teams apply consistent rules across similar products.
Original PR description
We want to add "Product Category" to assignation rules so that all products in the same category automatically follow the same rule, reducing manual work (based on several client feedback). Task [link](https://www.odoo.com/odoo/project.task/5107543) task-5107543
Belgian payroll now includes the Dimona employee declaration functionality directly, reducing module separation and simplifying payroll compliance setup. This helps Belgian employers manage required employment declarations in one place with updated records, views, permissions, and automated processing.
The Sign app now uses one shared rule to decide when the PDF upload button appears. This reduces duplicate setup behind the scenes, making the interface easier to maintain without changing how users work.
Original PR description
Before this PR, the upload PDF button used the same logic and conditions in both templates and requests, causing duplicate code. This PR adds a single condition to manage the upload button for both templates and requests, reducing duplication and improving clarity.
Resolved issues and error corrections
A test for the Chilean electronic invoicing module now skips cleanly when optional demo data is not installed. This prevents false test failures in environments that run without demo data, improving reliability without changing customer-facing behavior.
Original PR description
The test `test_demo_certificate_serial_number` failed when running without demo data, since the XMLID `l10n_cl_edi.l10n_cl_demo_certificate` is only present in demo mode. This commit updates the test to use `raise_if_not_found=False` and skip gracefully when the demo certificate is not available. The assertion now only runs if the certificate exists, ensuring the test passes consistently both with and without demo data. [RB-231573](https://runbot.odoo.com/odoo/error/231573) Forward-Port-Of: odoo/enterprise#95917
The message shown when no bank transactions are found now displays correctly instead of showing raw formatting codes. This improves clarity for users when fetching transactions or changing filters produces no results.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
Employees with flexible working schedules will no longer see Saturdays and Sundays incorrectly marked as unavailable in the timesheet grid. This keeps the timesheet view aligned with flexible work arrangements, where employees may work on any day.
Original PR description
To reproduce: ============= 1- Update employee worktime to be flexible 2- Go to timesheets -> saturday & sunday are marked grey Problem: ======== Can't apply https://github.com/odoo/odoo/blob/ce2d134d3e8e5c0d96529c1d0490f1e0c5e28294/addons/resource/models/resource_calendar.py#L511 This logic cannot be applied when an employee's work time is flexible, since they can work whenever they want. Fix: ==== When employee work time is flexible we just return empty list for the unavailable dates. opw-5031144 Forward-Port-Of: odoo/enterprise#96181 Forward-Port-Of: odoo/enterprise#94346
The Belgian EC sales report now correctly handles VAT numbers entered without the Belgian country prefix. This prevents valid VAT numbers from being shortened incorrectly and helps keep Belgian tax reporting accurate.
Original PR description
It could happen that the user set his vat number without the country code before the number. In this case, we removed the two first digits of the vat number. Also changing other occurrence using the company_vat to get the country, since we are in the belgian ec sale list, the country_code should be 'BE' everytime task-5039969 Forward-Port-Of: odoo/enterprise#93377
Users can now open the AI assistant from the Physical Inventory list and send messages without hitting an error. The fix handles pages that do not have a linked action, improving reliability for Inventory users.
Original PR description
Currently an error is generated when a user tries to send a message to AI while the current page is in `Physical Inventory`list view. Steps: - Install `Inventory` - Go to Inventory > Operations >…
Currently an error is generated when a user tries to send a message to AI while the current page is in `Physical Inventory`list view. Steps: - Install `Inventory` - Go to Inventory > Operations > Physical Inventory - Click the AI icon from the systray menu. - Ask anything in AI >>> error generated Error: ```UnboundLocalError:cannot access local variable 'current_action' where it is not associated with a value``` This issue arises because in line [1] of the code, the variable `current_action` is assigned a value inside an `if-elif` block based on `action.type`. However, since the `Physical Inventory` page does not have any associated action, the variable `current_action is` never set. Consequently, attempting to access this variable results in an error. This commit fixes the above issue by initializing the `current_action` variable as `None` outside the `if-elif` block and adding handling for cases when `current_action` is `None`. [1] - https://github.com/odoo/enterprise/blob/2ea15cc9c7c5f114b3786b256c64e269b3e3a313/ai/models/ai_agent.py#L750-L755 sentry-6913801088 Forward-Port-Of: odoo/enterprise#96253
This update adds test coverage for an issue where editing a Sales dashboard list and choosing the Medium field matching could trigger an error. It helps ensure spreadsheet dashboard filters behave reliably and avoids a disruptive traceback for users.
Original PR description
Steps to reproduce: 1. Open the Sales dashboard 2. Edit the first list 3. Try to set the "Medium" field matching => Traceback This commit contains only the test as the fix is in the community PR. Task: 5101093 Forward-Port-Of: odoo/enterprise#95990
The partner ledger now includes reconciled entries that do not have a partner when calculating opening balances for a new reporting period. This prevents mismatches between initial balances and totals, giving finance teams more accurate year-to-year reporting.
Original PR description
### Issue: The partner ledger does consider lines without partners when calculating the initial balance. ### Steps to reproduce: - Create an invoice in 2025 - Create an entry in 2025 without partner…
### Issue: The partner ledger does consider lines without partners when calculating the initial balance. ### Steps to reproduce: - Create an invoice in 2025 - Create an entry in 2025 without partner for the same amount - Reconcile the two - Open the partner ledger for 2025, everything is correct - Change the dates to 2026, the amount of the initial balance ignores the entry but not the totals ### Cause: The method `_get_sums_without_partner` is called for the totals, but not for the initial balance. Its purpose is to add the amounts of the lines without partners that were reconciled with lines with a partner. ### Solution: Call `_get_sums_without_partner()` in `_get_initial_balance_values()` add the results before returning the initial balances. As this is the same logic as `_query_partners()` we create a new method. This method needs to be called with the dates of the initial balance in the options. So we create a duplicate of the options and input the new dates options. opw-5068790 Forward-Port-Of: odoo/enterprise#96341 Forward-Port-Of: odoo/enterprise#95881
Documents can now create server actions for journal entries in journals marked as Credit Card. This removes a blocker for teams that manage credit card statements through Documents and need the same automation available for other journal types.
Original PR description
We are unable to create an action to create a credit card statement on a journal with type credit card Allow to create a Server Action to create Journal Entries in journals of type "Credit Card" in Documents. task-5123868 Forward-Port-Of: odoo/enterprise#95905
This update removes an unused Lithuanian payroll input type and adds safeguards to prevent duplicate payroll input selection keys. It helps keep payroll configuration cleaner and reduces the chance of inconsistent salary rule setup.
Opening a spreadsheet-based quality step in the shop floor workflow now works without displaying a traceback. This removes a distracting error for manufacturing operators while keeping the spreadsheet step behavior unchanged.
Original PR description
To reproduce: - Make a new BOM for new product P, with 1 operation on assembly line 1 - Add a spreadsheet step to the operation - Make a MO for 1x P - Open shop floor, assembly line 1, click on the spreadsheet step Current behaviour: - The spreadsheet step opens correctly, but we get a traceback Expected behaviour: - The spreadsheet step opens correctly, no traceback task-4965313 Forward-Port-Of: odoo/enterprise#94657 Forward-Port-Of: odoo/enterprise#91505
Code cleanup and technical improvements
AI response requests have been rerouted through dedicated web endpoints instead of being called directly in the backend. This makes the AI infrastructure easier to manage and prepares it for future scaling changes, while preserving behavior across chat, website, email, voice, and VoIP use cases.
Original PR description
Prior to this commit, most flows that ended in a long HTTP request to an LLM provider would be routed through the main.py controller except for the `get_direct_response` which was called in an orm…
Prior to this commit, most flows that ended in a long HTTP request to an LLM provider would be routed through the main.py controller except for the `get_direct_response` which was called in an orm call to the ai_agent model. This is problematic because if we want in the future to re-route these calls to the GEVENT server, we couldn't just use the /ai/* path. In this commit we create a new controller endpoint for the `get_direct_response` method and replace the ORM call instances with RPC calls to that endpoint. We also rename the two controller files from `agent.py` and `main.py` to `ai.py` and `thread.py` respectively, to better adhere to the new naming standards. Removing the `get_direct_response` method from the `ai.agent` model meant that it couldn't be used directly from the back-end. Current solution makes the `get_direct_response` only a controller accessible method and turns the `_generate_response` backend method as the method to call directly from the backend. Also the markdown to HTML conversion and the HTML sanitization are now done directly in the end of the `_generate_response` method instead of at the `get_direct_response` and the `_post_ai_response` methods Also, changes to the test files were performed to reflect changes in the business code. Because formatting is now done in the `_generate_response` function, we change the patched methods. Instead of patching generate_response, we now patch only the actual `_request` method. For that, we made some modifications to `test_llm_tool_calling.py` so the mock_request method is now public and we can use it in other files. We also add a sudo when fetching tools inside `_generate_response` since manual template rendering is not done with sudo, and if done by a non admin user, it will crash. (Non-admin users don't have access to tools). Task-5130087
This update standardizes the internal name of a messaging component used by several Enterprise apps. It helps keep the Enterprise codebase aligned with the main Odoo platform and should not change day-to-day user workflows.
Original PR description
\* = account_accountant, ai, ai_website_livechat, documents, hr_recruitment_extract, iap_extract, spreadsheet_edition, whatsapp Enterprise counter-part. https://github.com/odoo/odoo/pull/229944
Miscellaneous changes
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
Original PR description
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
20 changes
Enhancements to existing features
Brazilian service fiscal setup now shows the correct LC116 Code label instead of Mercosul NCM Code. This reduces confusion for users configuring services while keeping product code labeling unchanged.
Original PR description
Purpose:- - In Brazil, NCM is a code that has an acronym to specify the Mercosul Common Name for products, and for services, the right name is LC116 (Complementary Law 116), which specifies the federal code for a service. - But we have the same field `l10n_br_ncm_code_id` to configure both NCM for goods and LC116 for services and the same table can be used for both the cases. - So while configuring fiscal information for a service, user don't understand why it still shows the NCM label instead of LC116. Before this commit:- - Label `Mercosul NCM Code` was displayed for services confusing users. After this commit:- - Label `Mercosul NCM Code` is replaced with `LC116 Code` only for services. - Tooltip is also improved for better understanding. task-5096435 Forward-Port-Of: odoo/enterprise#96228 Forward-Port-Of: odoo/enterprise#95404
Bank reconciliation XML uploads now create the related accounting entry right away. This makes the uploaded transaction details available immediately on the bank statement line, improving reconciliation accuracy and workflow continuity.
Original PR description
When uploading a xml from the bank rec widget, the move will be created directly so we can put the move lines in the bank statement line. task-5107112 Forward-Port-Of: odoo/enterprise#95345
This update adds extension points for the automatic wave process in warehouse batch picking. It makes it easier for businesses with custom warehouse rules to adapt when transfers are automatically grouped, without changing the core process.
Original PR description
This improvement just adds some hook methods that allow to decapsulate the logic of auto waves so its doable to extend the conditions for auto-waving. cc @moduon fyi @Shide TODO: for the sake of clarity I just inserted the hook method logic but a cleaner approach would be to extract the whole logic of each hook into their own separate method --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227873
Point of Sale now shows which communication method was most recently used to connect with an IoT Box, making connection status easier to understand. The old longpolling toggle was removed because WebRTC is now the main communication method.
Original PR description
We updated the IoT Box status icon in PoS to display the last protocol used to communicate with the box. We removed the longpolling enable/disable toggle as the main protocol now is WebRTC. Task: 5116840
Resolved issues and error corrections
This fix prevents crashes when processing incoming emails with XML attachments for Chilean electronic invoicing. It restores stable email handling so users can continue processing documents without interruption after the first message.
Original PR description
Description of the issue/feature this PR addresses: Fixes [#230014](https://github.com/odoo/odoo/issues/230014). Requires #96467 and #96421 under 19.0 approved and merged for a full fix. Please also forward to saas-18.4 along with #96421 , issue is also present there. (DO NOT FORWARD #96467 TO saas-18.4). Current behavior before PR: Crashes after processing first email with XML due to a savepoint implementation which is not working. Desired behavior after PR is merged: No crash. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents crashes in the Chilean electronic invoicing integration when processing incoming emails. It keeps the module compatible with recent internal mail handling changes, helping related automated workflows run reliably.
Original PR description
Description of the issue/feature this PR addresses: Found while investigating [#230014](https://github.com/odoo/odoo/issues/230014) Current behavior before PR: Crashes because of not being aligned with new name of task-4982132. Desired behavior after PR is merged: No crash. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The help message shown when no bank transactions are found now displays correctly instead of showing raw formatting tags. This makes the bank synchronization experience clearer when fetching transactions or changing filters returns no results.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
Users who close the email validation message will no longer see a confusing follow-up banner reappear. This keeps the profile page experience clearer after an email has already been validated or the notice has been dismissed.
Original PR description
### Issue 1: The validated email success banner wasn’t triggering the RPC call because Bootstrap’s `data-bs-dismiss="alert"` removed the element from the DOM before the handler could run. ### Issue 2 Closing the banner previously triggered `/profile/validate_email/close` RPC, which reset `validation_email_done` to false. This mistakenly caused the “email sent” banner to reappear, confusing users. ### Solution - Overwrite Bootstrap’s `close.bs.alert` event to trigger the RPC when the success banner is dismissed. - Set `validation_email_sent = False` so the banner stays hidden after being closed. Task-5049533 Forward-Port-Of: odoo/odoo#229913 Forward-Port-Of: odoo/odoo#225872
This update aligns automated tests with the newer editor behavior for selection placeholders. It helps keep quality checks accurate without changing what business users see or do.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/225576 Since the introduction of selection placeholders, we don't need to ensure an empty paragraph after a trailing table. This adapts a test to this new behavior. task-4129699
This fix stops the HTML editor from getting stuck when users remove formatting from a colored table cell. It makes formatting cleanup more reliable, preventing an error that could interrupt content editing.
Original PR description
Problem: When having a `table` with `color` and selecting a cell to remove format, we get a traceback: "Infinite Loop in removeAllColor()." Cause: The color is applied on `table`, but we only process `td` for color removal. As the color remains on `table`, each attempt to remove it keeps reapplying, leading to an infinite loop. Solution: When removing color, also remove it from the `table`. Then apply the color to all child `td`. This ensures `td` colors are later removed automatically if selected, avoiding the loop. Steps to reproduce: 1. Add a `color` property to a `table` and `td`. 2. Select the `td`. 3. Click "remove format" from the toolbar. 4. Observe traceback. opw-5112088 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229878
This update fixes several visual alignment issues in the HTML Builder option panels, including blurry guide lines, uneven picker padding, and inconsistent picker heights. Users get a more stable and polished editing experience when configuring fonts, shadows, visibility, and background image options.
Original PR description
This PR fixes several options-related issues in the HTML Builder: 1. Improved the vertical sublevel line, which appeared blurry due to the transform property and an incorrect height. You can see the…
This PR fixes several options-related issues in the HTML Builder: 1. Improved the vertical sublevel line, which appeared blurry due to the transform property and an incorrect height. You can see the problem by "zooming out" multiple times. 2. Harmonized the padding of the visibility layout options and the background image position to align with the other pickers. 3. Fixed the height of the font-family picker: when you select a font-family, the height of the picker may change according to your selection (that's the case with Roboto for example - It's more "apparent" in the case of headings when it's next to the delete button as shown in the screenshot.) 4. Fixed the height of the “None” shadow option => these 2 issues where caused by the font metrics. task-4985348 1 & 2 <img width="423" height="500" alt="image (1)" src="https://github.com/user-attachments/assets/a9304b67-607a-424a-94de-dd3dacece84f" /> 3 <img width="1037" height="293" alt="Screenshot 2025-10-02 at 13 14 37" src="https://github.com/user-attachments/assets/d5982d34-2987-49d9-95cf-c78294521995" /> 4 <img width="1542" height="231" alt="image" src="https://github.com/user-attachments/assets/13cbfa8f-dd72-41dc-82f2-c371f6ff2d77" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229086
This fix ensures Belgian EC sales reports handle VAT numbers correctly even when users entered them without the Belgian country code. It prevents valid VAT numbers from being shortened incorrectly and keeps the report country code consistently set to Belgium.
Original PR description
It could happen that the user set his vat number without the country code before the number. In this case, we removed the two first digits of the vat number. Also changing other occurrence using the company_vat to get the country, since we are in the belgian ec sale list, the country_code should be 'BE' everytime task-5039969 Forward-Port-Of: odoo/enterprise#93377
Employees with flexible working schedules will no longer see Saturdays and Sundays incorrectly marked as unavailable in the timesheet grid. This avoids confusion for teams that can record work on any day.
Original PR description
To reproduce: ============= 1- Update employee worktime to be flexible 2- Go to timesheets -> saturday & sunday are marked grey Problem: ======== Can't apply https://github.com/odoo/odoo/blob/ce2d134d3e8e5c0d96529c1d0490f1e0c5e28294/addons/resource/models/resource_calendar.py#L511 This logic cannot be applied when an employee's work time is flexible, since they can work whenever they want. Fix: ==== When employee work time is flexible we just return empty list for the unavailable dates. opw-5031144 Forward-Port-Of: odoo/enterprise#96181 Forward-Port-Of: odoo/enterprise#94346
The IoT box image build process now uses the correct dependency location for Raspberry Pi images. This prevents build failures caused by choosing the wrong package path during the image creation process.
Original PR description
When building an image in v19.0, we try to install `aiortc` from path. The requirements.txt contain two path: one for rpis and one for other linux machines. While building, we `chroot` from the builder's machine to the rpi filesystem, so the plateform is still the host machine's one, but the filesystem is the rpi's. To fix this, we hardcoded the right path in the `init_image` script.
Closing a Picture-in-Picture call window now properly shuts down the related call interface. This prevents errors when users leave or disconnect from calls after using the pop-out window.
Original PR description
**Description of the issue this PR addresses:** When closing a Picture-in-Picture (PiP) window, the app mounted on it was not destroyed. As a result, the `Meeting` component remained mounted even…
**Description of the issue this PR addresses:** When closing a Picture-in-Picture (PiP) window, the app mounted on it was not destroyed. As a result, the `Meeting` component remained mounted even though the call was disconnected, leading to errors. The cleanup of the mounted app only occurred when creating a new PiP window, not when closing one. **Current behavior before PR:** * Closing a PiP window does not destroy the mounted app. * `Meeting` component stays mounted after call disconnect. * Errors occur due to leftover state. **Desired behavior after PR is merged:** * The app mounted on the PiP window is properly destroyed as soon as the PiP window is closed. * No errors occur from a lingering `Meeting` component after closing. **Steps to reproduce:** - Join a call - Open the call in PiP - Disconnect the call either via PiP or from the Discuss app -> traceback OR - Close PiP window, then disconnect the call from the Discuss app -> traceback task-[5112773](https://www.odoo.com/odoo/project/1519/tasks/5112773)
This fix prevents the AI assistant from crashing when users ask for sales results in a pivot view. It improves reliability by checking that report measures are valid before using them, so business users can run AI-powered sales analysis more smoothly.
Original PR description
The system crashes with an error when a user adds a prompt in AI and searches. **Steps to produce:** - Install the `Sales and AI` module with demo data. - Go to sales and click on the AI button on…
The system crashes with an error when a user adds a prompt in AI and searches. **Steps to produce:** - Install the `Sales and AI` module with demo data. - Go to sales and click on the AI button on top. - Add query that used pivot view like `Top 5 sales reps by revenue also make pivot view`. - Try multiple times (error only comes in terminal). **Error:** ValueError: Measure 'price_subtotal:sum' not found in model 'sale.report' for menu ID 331. **Cause:** - Here at [1], we split the measure_str and assign the first element to `measure_name`. - At [2], we try to find a field in the model using this `measure_name`, which fails. - The issue is that `measure_name` can contain both the `field` and its `aggregation` function (e.g., product_qty:sum), which is not a valid field. **Solution:** - In this PR, a new method `validate_measures` has been added to ensure that the provided measures are valid and properly defined. [1] https://github.com/odoo/enterprise/blob/f838bbd0ce425d24444b510e49752c3da8068712/ai/models/ai_agent.py#L1244-L1245 [2] https://github.com/odoo/enterprise/blob/f838bbd0ce425d24444b510e49752c3da8068712/ai/models/ai_agent.py#L1264-L1265 **sentry-6917511363,6915439025**
This fix ensures copied website configurator pages remain connected to the correct website. It prevents build errors and helps website setup flows complete reliably.
Original PR description
This PR resolves the runbot build error https://runbot.odoo.com/odoo/runbot.build.error/232963 Standalone script test_02_theme_default_generate_primary_templates Reason: The issue was introduced by commit [1], which creates a copy of configurator pages but does not set the website_id field on the new copy. As a result, the copied page is missing its website association, leading to error. [1]:https://github.com/odoo/odoo/commit/4231c9e545f
This fixes an error that prevented users of the Spanish accounting localization from opening the VAT Book report. The report now loads as expected while keeping the related chatter or annotation control hidden where needed.
Original PR description
Step to reproduce - setup company for l10n_es i.e. spain localization - Go to Accounting > Reporting > Spain > VAT Book. Observation: - Traceback found Issue: - Template `l10n_es_reports.VatBooksLineName` tries to replace a xpath https://github.com/odoo/enterprise/blob/d0c17835ecc4a911bc8c8c57946eaef9e73245ab/l10n_es_reports/static/src/components/vat_books/line_name.xml#L2-L6 which do not exists, after [1] Fix: - we fix the xpath to hide the chatter/annotation button. [1] odoo/enterprise@8fae6a058bc20732bccc6e3732144d4ea2aafdad opw-5106583
This update adjusts the Sales Subscription area so it remains aligned with related changes in the main Odoo platform. It helps keep subscription behavior reliable after upstream updates, with no expected change to everyday business workflows.
Original PR description
See also - https://github.com/odoo/odoo/pull/227241
Miscellaneous changes
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
Original PR description
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
8 changes
Enhancements to existing features
The Documents folder action menu now opens more quickly by showing available controls while actions continue loading. Users also get faster feedback when pinning or unpinning actions, with fewer background refreshes during repeated changes.
Original PR description
The cogwheel which holds the folder actions was slow to open because it loads the actions at startup. To speedup it up, we backport the fix odoo/enterprise#90124 that allows the cogwheel to be open while loading the actions (instead of waiting that the actions are loaded). We also add a spinner while it is being loaded. When selecting action to embed for the folder, it was slow as well. To solve the problem, we toggle the action immediately (not waiting the answer of the server) and roll it back in case of failure. Finally, to limit the number of calls to the server, we only reload the search model if there are no pending toggle of action. So if you activate for example 5 actions in a row and the connection is slow enough, the search model will only be reloaded once instead of 5 times (when the 5 actions are toggled). Task-4828503
Resolved issues and error corrections
The bank transaction fetch screen now shows its help message correctly when no transactions are found. This avoids confusing raw formatting text appearing to users and makes the banking workflow feel more polished and consistent.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
Barcode package scanning now follows the same “Allow Extra Products” setting as individual product scans. This prevents unintended products from being added to internal transfers and shows users a warning when package contents are skipped.
Original PR description
**Steps to reproduce:** 1. Install *Inventory* and *Barcode* modules. 2. Disable *Allow Extra Products*: - *Configuration* → *Operation Types* → *Internal Transfer*(unarchive if needed) → *Barcode…
**Steps to reproduce:** 1. Install *Inventory* and *Barcode* modules. 2. Disable *Allow Extra Products*: - *Configuration* → *Operation Types* → *Internal Transfer*(unarchive if needed) → *Barcode App* tab → uncheck *Allow Extra Products*. 3. In *Settings*, enable *Packages* and *Storage Locations*. 4. Create two storable products, e.g.: - Product A → put 10 units in Package PKG-A. - Product B → put 15 units in Package PKG-B. 5. Create an *Internal Transfer*: - Add Product A manually. - From the column dropdown, enable *View Buttons*. click on `view` on line and create a stock move. 6. Open the *Barcode* app → *Operations* → *Internal Transfer* → select the transfer created. 7. From the gear icon, in *Enter Barcode*, input PKG-B (the package name of Product B) and click *Apply*. **Observed behavior:** - The products inside the scanned package are added to the transfer, even though *Allow Extra Products* is disabled. - Regular (non-packaged) products are correctly blocked. **Root cause:** - The check for extra products was only applied when scanning individual products. - When scanning a package, its contents bypassed the restriction and created new lines for each product. **Solution:** - Apply the *Allow Extra Products* restriction also when processing package contents in the barcode picking model. - Skip the creation of lines for disallowed products and notify the user with a warning message listing the skipped products. opw-4863621
UK tax report submissions now check the saved HMRC device identifier before sending it. If the stored value is invalid, Odoo clears it so requests are not rejected by HMRC for using a malformed device ID.
Original PR description
There are still Odoo requests that are sent to hmrc with invalid 'Gov-Client-Device-ID' header. They are showing this error: "Submit a UUID which is 128 bits or 32 hex characters long". A possible explanation, is that some users have some garbage value in the localStorage for 'hmrc_gov_client_device_id', that does not correspond to a uuid. This value would then be sent each time in the headers, and get rejected. The fix here is to clear the localStorage value if it is not a uuid. task-4627086 Forward-Port-Of: odoo/enterprise#87335
New user signatures now place the user's name in a layout element that avoids extra spacing when lines are added. This prevents duplicated paragraph spacing in default signatures, while existing signatures remain unchanged unless users update them manually.
Original PR description
Prior to this commit, the default signature for users was their name wrapped in a `p`. This is not what we want, because a `HTMLParagraphElement` natively has a margin-bottom, and when a user creates a newline from a paragraph, it duplicates itself. After this commit: the user name is wrapped in a `div` instead. This does not update existing users signatures. To switch to a `div`, they will have to select the desired lines, and change their type from "Paragraph" to "Normal". task-5149570
This fixes an inventory issue where undoing a completed package move could leave the delivery marked as picked, blocking availability checks and requiring manual correction. It also preserves the picked status when users manually enter done quantities after stock was initially unavailable, keeping warehouse workflows consistent.
Original PR description
### Issue: To reproduce the bug: 1. Activate `Packages` settings in Inventory: 2. Activate `Move entire packages` on picking type `delivery orders` 3. Create new product `Test move package` 4. Update…
### Issue:
To reproduce the bug:
1. Activate `Packages` settings in Inventory:
2. Activate `Move entire packages` on picking type `delivery orders`
3. Create new product `Test move package`
4. Update quantity in `WH/Stock` with a newly created package and a qty (eg 5)
5. Go to the delivery orders and create a new picking with the created product and a quantity of 5
6. Click on `Mark as Todo`, the picking is set as ready and a package level is created automatically to move the quantity we did put in stock in the package.
7. Mark the checkbox `Done` on the package level (this will mark the move line and the move as picked)
8. Unmark the checkbox `Done` on the package level.
The package level is deleted, as well as the stock move line,
but the stock move still has the checkbox picked that is
marked.
The picking is then in waiting state and we cannot check
availability again.
Currently to be able to check the availability, the picked
check should be undone manually.
### Cause of issue
Currently, in `_compute_picked` in `stock_move`, we don't
update value of move.picked if there is `no move_line_ids`
present which is wrong.
### Fix:
In the fix, picked is set to False when there no
`move_line_ids`
### Issue 2
This fix cause another issue, in which the move loses its `picked` status after manually setting the done quantity when no stock was initially available,
### Cause of issue 2
To be more specific this fix on `_compute_picked`
```diff
- elif move.move_line_ids:
move.picked = False
+ else:
move.picked = False
```
has the following side effect:
- On a confirmed picking, pick a move with a quantity of 0 then change the quantity to 10 the move is unpicked -> undesirable.
After you picked the move, when you set the quantity, you will set `move_line_ids` on your move to match the quantity increase here:
https://github.com/odoo/odoo/blob/57c0ce5f0af9b46c037759d85205bc3e88890af7/addons/stock/models/stock_move.py#L2157-L2165
However,`self._set_quantity_done_prepare_vals(qty)` does not return a `stock.move.line` record set but a `Command.create` whose values do not contain any info on the picked value of the move *line*:
https://github.com/odoo/odoo/blob/57c0ce5f0af9b46c037759d85205bc3e88890af7/addons/stock/models/stock_move.py#L1497-L1507
The fact that the `move_line_ids` is set on the move to this command.create, flags the `picked` field of the stock move to dirty and adds it to the field to recompute because of the dependency `move_line_ids.state`:
https://github.com/odoo/odoo/blob/57c0ce5f0af9b46c037759d85205bc3e88890af7/addons/stock/models/stock_move.py#L208-L209
https://github.com/odoo/odoo/blob/57c0ce5f0af9b46c037759d85205bc3e88890af7/odoo/api.py#L795-L800
THEN, the creation of the move.line happends and since the value of the picked was not set in the command.create, we populate it based on the picked value of the move:
https://github.com/odoo/odoo/blob/57c0ce5f0af9b46c037759d85205bc3e88890af7/addons/stock/models/stock_move_line.py#L347-L348
However, at this point since the picked value of the move has been flagged as dirty it is recomputed using the `compute_method` modified in our fix.
And since the move does not have any move line at this stage, it is computed to be picked = False resetting the picked value.
### Fix of Issue 2:
We should set the picked values in the vals here:
https://github.com/odoo/odoo/blob/57c0ce5f0af9b46c037759d85205bc3e88890af7/addons/stock/models/stock_move.py#L1497-L1507
opw-4964561
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prCustomers who are required to sign in before using the online store are now sent back to their cart, shop, or product page after logging in. This prevents interrupted appointment or purchase flows and helps reduce checkout abandonment.
Original PR description
**Steps to reproduce:** - Install eCommerce and Appointment - Set `Ecommerce Access` to `Logged in users` in Settings > Website - Go to the website without logging in - Create an appointment - Proceed to make the payment - You will get redirected to the sign-in page due to the setting - After logging-in the system doesn't redirect back to the checkout form **Issue:** When the user is not logged and the setting is applied, the user is directly sent to the login page without further redirection. **Fix:** Added redirect param to the original url target. opw-4965735 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Unrealized Currency Gains/Losses report now creates adjustment entries correctly even when users customize how report lines are grouped. This prevents an incorrect “No adjustment needed” message and helps accounting teams complete currency revaluation workflows reliably.
Original PR description
**Steps to reproduce** - Edit "Unrealized Currency Gains/Losses" report configuration as follows: - Lines > Accounts To Adjust, set GroupBy to 'currency_id, partner_id, account_id, id' - Lines > Excluded Accounts, set GroupBy to 'currency_id, partner_id, account_id, id' - In Options, check 'Unfold All' - View the report > Click 'Adjustment Entry' **Issue** Instead of creating a draft journal entry an user error "No adjustment needed" will block the action **Solution** The issue occurs because when retrieving the lines we assume they are grouped as per default, by 'currency_id, account_id' In case users modify the expression line default grouping to something else, like 'currency_id, partner_id, account_id', we no longer collect values correctly. In order to fix the issue we can unfold all and manually group values by currency_id, account_id opw-4792502 Forward-Port-Of: odoo/enterprise#90894
8 changes
Resolved issues and error corrections
Appointments created from the backend now automatically use the default location set on the appointment type when no specific location is entered. This keeps backend-created appointments consistent with website bookings and ensures confirmation emails include the expected location details.
Original PR description
Issue: - There is a difference in appointment booked from website and from backend for location field. - Location field is present in `appointment.type` and in `calendar.event` model. - When booking…
Issue: - There is a difference in appointment booked from website and from backend for location field. - Location field is present in `appointment.type` and in `calendar.event` model. - When booking from website, location field is filled from `appointment.type`, https://github.com/odoo/enterprise/blob/f770ea9ff9b56954d8f23bf151b31ca89568969b/appointment/controllers/appointment.py#L806 https://github.com/odoo/enterprise/blob/f770ea9ff9b56954d8f23bf151b31ca89568969b/appointment/models/appointment_type.py#L986-L988 while in case of backend, location field only considers field from `calendar.event`. - In this case, when the mail is sent on event creation, location is not added in mail. Step to reproduce: - Install `website_appointment`. - Book an appointment for "dental care" (demo data). - Open the appointment from backend, check in mail, location info is present in mail. - Create an appointment from backend, keep location field empty. - Notice, location info is not in mail sent. Fix: - Pre-populate location field from `appointment.type`. opw-5062535
Text highlighting added to eLearning articles now displays consistently in both the normal view and fullscreen slide player. This fixes a visual mismatch that could make course content look incomplete or less polished for learners.
Original PR description
**Steps to reproduce:** - Go to eLearning course on the website - Edit an article - Add the highlighting effect on the text - Save the changes - The text is properly displayed in normal article - Go to the fullscreen version - The highlighting is not present in this version **Issue:** This is an ordering issue caused by the dynamic rendering of fullscreen slides. When in normal mode, the content is initialized and then the `TextHighlight` widget is started. But the rendering of the slides in fullscreen mode is delayed and occurs after the widget is applied. **Fix:** Recreate and restart the widget on `_renderSlide` in the `slides_course_fullscreen_player`` opw-4978798 related: https://github.com/odoo/odoo/commit/f64c9f27f1a9106bc009ad2f696845f2c5c58066 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Correcting translated code in the swedish translation of base. Removes js errors if Swedish is used.
Original PR description
Correcting translated code in the swedish translation of base. Removes js errors if Swedish is used.
Invoices can no longer be set up with SEPA direct debit payments when the related mandate is closed. This prevents businesses from accidentally collecting payments using inactive customer authorizations.
Original PR description
**The issue:** It's currently possible to create select SEPA payment for an invoice when the mandate is "closed" instead of "revoked". **Cause:** The search for usable mandates, is not taking into consideration the "closed" state and looking for non draft/revoked. **Fix:** Changed the query to look specifically for "active" mandate. opw-5048748
UPS shipping rates can now be checked during express checkout using only the limited address details available at that stage. This prevents shoppers from being blocked by unnecessary street and phone requirements, making checkout smoother.
Original PR description
Express checkout in ecommerce does an initial rate check with shipping connectors that does not require all of the fields normally required by that shipping connector. For UPS, this meant express checkout was failing due to an unnecessary `street` and `phone` field check since the only required delivery fields for express checkout are: (city, zip, country_code, state_code) For more info, see: https://github.com/odoo/odoo/blob/b403d5d74dd545f926a38a6aa6d18118d34e83b7/addons/website_sale/controllers/delivery.py#L181-L188 opw-[4447700](https://www.odoo.com/web#id=4447700&view_type=form&model=project.task)
Public mail-related pages now correctly show translated text instead of falling back to the original source language. This improves the experience for visitors and portal users who use Odoo in languages other than the default.
Original PR description
Human-readable content defined in public page components isn't translated. This is because we forgot to give Owl a translation function, so it falls back to returning the source terms as they are (identity function). This commit resolves the issue by providing the missing translation function. Task-4493082 Task-5140665
Changing the scheduled date for one stock move no longer unintentionally updates other moves on the same receipt. This helps warehouse users keep individual item schedules accurate and avoids accidental rescheduling when saving a receipt.
Original PR description
Issue Before This Commit: ---------------------------------- Updating the scheduled date of a single move would unintentionally update the dates of all other moves, particularly if the new date was…
Issue Before This Commit: ---------------------------------- Updating the scheduled date of a single move would unintentionally update the dates of all other moves, particularly if the new date was earlier than the picking’s scheduled date. Steps to produce: ---------------------------------- - Install the `stock_delivery` module. - Create a receipt with two moves. - Change the scheduled date of one move to a value earlier than the picking date. - Save the receipt, the date of both moves will be updated. Cause of the issue: ---------------------------------- Changing a move’s date also updated the picking’s scheduled date. When the picking was saved, its inverse method propagated the new date to all associated moves. Fix: ---------------------------------- The override of the `onchange` method to prevent the picking’s `scheduled_date` from being updated when a move's date is modified, as it is recomputed when the form view is saved. This ensures only the intended move date is changed, preventing unintended side effects and giving users more precise control over scheduling. Task ID: [4653516](https://www.odoo.com/odoo/project/966/tasks/4653516)
Code cleanup and technical improvements
This change reorganizes how product revaluation information is prepared in inventory accounting. It makes the process easier for custom add-ons to adapt without changing the standard behavior for users.
Original PR description
This allows to make it hookable by custom addons This was split from https://github.com/odoo/odoo/pull/160527 cc @pfertyk @sys-odoo @Whenrow --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr