Thursday, October 30, 2025
26 changes · 19.0
Resolved issues and error corrections
Assets created from vendor bills with partially deductible lines now use only the deductible portion to calculate their original value. This prevents overstated asset values and helps keep depreciation and accounting records accurate.
Original PR description
We allow the user to create an asset from a bill with lines which are not fully deductible but the created asset's original value is the based on the entire balance of the journal item. It should be only the deductible part. task-5156256 Forward-Port-Of: odoo/enterprise#97505
Batch payments now show a clear warning when SEPA Credit Transfer partners are missing required country or city information for structured addresses. This helps users fix affected partner records before generating payment XML files that would become invalid under the upcoming SEPA rules.
Original PR description
Starting from November 15th, 2026, SEPA Credit Transfer (SCT) payments require both the partner's country and city to be defined when using structured addresses. If missing, the generated XML file will be invalid. This change adds a non-blocking red banner on the batch payment form to warn users and provide a link to review the affected partners. task-5156613 Forward-Port-Of: odoo/enterprise#97598
Requests for quotation created from approvals now use the currency configured for the selected vendor instead of defaulting to the company currency. This keeps purchasing amounts consistent with other RFQ creation flows and avoids currency mismatches when updating existing purchase orders.
Original PR description
Issue: When creating an RFQ from an approval, the created purchase order does not use the currency set on the vendor of the product. Rather, it uses the currency of the company, with the value converted based on the vendor's currency to get the price. This is not consistent with other ways we create RFQs, which all respect the vendor currency. Solution: Pass the vendor's currency into the values sent when creating the purchase order. In the case of modifying an existing purchase order, only modify purchase orders matching vendor's currency. opw-4549937 Forward-Port-Of: odoo/enterprise#97069
Restoring a database could fail if the built-in Odoo OAuth provider had been deleted. This fix makes the restore process handle that missing provider gracefully, avoiding an unnecessary restore error.
Original PR description
**Description of the issue/feature this PR addresses:** When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database. **Current behavior before PR:** You'll get this…
**Description of the issue/feature this PR addresses:**
When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database.
**Current behavior before PR:**
You'll get this error:
```
odoo.service.db.restore_db(dbname, backup, copy, **extra_kwargs)
File "<decorator-gen-27>", line 2, in restore_db
File "/opt/ou/odoo/odoo/service/db.py", line 44, in if_db_mgt_enabled
return method(self, *args, **kwargs)
File "/opt/ou/odoo/odoo/service/db.py", line 360, in restore_db
env['ir.config_parameter'].init(force=True)
File "/opt/ou/odoo/addons/auth_oauth/models/ir_config_parameter.py", line 13, in init
oauth_oe = self.env.ref('auth_oauth.provider_openerp')
File "/opt/ou/odoo/odoo/api.py", line 611, in ref
res_model, res_id = self['ir.model.data']._xmlid_to_res_model_res_id(
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2059, in _xmlid_to_res_model_res_id
return self._xmlid_lookup(xmlid)[1:3]
File "<decorator-gen-43>", line 2, in _xmlid_lookup
File "/opt/ou/odoo/odoo/tools/cache.py", line 90, in lookup
value = d[key] = self.method(*args, **kwargs)
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2052, in _xmlid_lookup
raise ValueError('External ID not found in the system: %s' % xmlid)
ValueError: External ID not found in the system: auth_oauth.provider_openerp
Error: External ID not found in the system: auth_oauth.provider_openerp
```
**Desired behavior after PR is merged:**
No error will occur
The afflicted versions are AFAIK, **16.0**, **17.0**, **18.0**, and **19.0**
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#233633Odoo now blocks attempts to unbuild manufacturing orders created through subcontracting. This prevents incorrect accounting entries and helps keep stock valuation and financial records balanced.
Original PR description
**Problem:** unbuilding a Manufactring order created through a subcontracting process gives the wrong account move lines **Steps to reproduce:** - create a storable product (the comp) and set a cost…
**Problem:** unbuilding a Manufactring order created through a subcontracting process gives the wrong account move lines **Steps to reproduce:** - create a storable product (the comp) and set a cost - create a storable product (the final product), set a cost and set a vendor - for the final product set the category as avco and automated - for the final product create a bill of materials subcontracted and set the same vendor - for the components add the comp for a quantity of 1 - create a Purchase order for the final product and the same vendor and confirm - validate the receipt - From the receipt click on the valuation smart button and click on the book widget of the line of the final product - notice how there is 3 journal items line including one crediting "stock interim (Received)" - unarchive the operation type "subcontracting" - open Manufacturing/Manufacturing Orders, delete the "to do" filter and search for a Manufacturing order with your final product - unbuild it - Open accounting/journal entries and select the journal entry for the unbuild **Current behavior:** There is only two account lines. There is no line balancing the "Stock Interim" line of the manufacturing order. **Cause of the issue:** The override of _generate_valuation_lines_data in mrp_subcontracted_account adds the stock interim line on the manufacturing order. However when unbuilding, the qty is negative so we exit the function https://github.com/odoo/odoo/blob/1358f93a4c73de5a28cda72ec78769625c863efd/addons/mrp_subcontracting_account/models/stock_move.py#L20 **fix** Because subcontracted Manufacturing orders are not meant to be unbuilt, we prevent it opw-4998137 Forward-Port-Of: odoo/odoo#230062
Appointment shared links now handle incorrectly formatted booking URLs without causing an error. This prevents users from hitting a crash when an invalid extra link is entered, improving reliability for appointment setup.
Original PR description
This error occurs when a user provides an invalid URL (e.g., one containing characters like “:”, “..”, etc.) in the link field. Steps to reproduce: --- - Install `appointment` module - Appointment >…
This error occurs when a user provides an invalid URL (e.g., one containing characters like “:”, “..”, etc.) in the link field. Steps to reproduce: --- - Install `appointment` module - Appointment > Shared Links > New - Fill `Appointment Types` > Link: `testurl:` (provide wrong link in Extra link) Traceback: --- `ValueError: Extra URL must use same scheme and host as base, and begin with base path` At [1], this error occurs because during computation, the method calls `urljoin`. If the URL contains a colon (e.g., ‘:’), it is compared with the base URL, and when they differ, a `ValueError` is intentionally raised at [2]. This leads to the observed error. This commit resolves the issue by catching the error when an invalid URL is provided. [1]: https://github.com/odoo/enterprise/blob/fc931c81ca7b2ebad220cf057e15583e046810b9/appointment/models/appointment_invite.py#L280 [2]: https://github.com/odoo/odoo/blob/9900375bc0bac2754150fd8cd6a1e45ecad8da83/odoo/tools/urls.py#L55-L58 sentry-6941171133
This change removes an outdated upgrade step that could block database upgrades for French point-of-sale certification. The needed sequence update is already handled elsewhere, so upgrades can proceed without hitting missing-field errors.
Original PR description
- In Odoo 19, the pos.config fields sequence_id and sequence_line_id were renamed to order_seq_id and order_line_seq_id. The removed migration script…
- In Odoo 19, the pos.config fields sequence_id and sequence_line_id were
renamed to order_seq_id and order_line_seq_id. The removed migration script
https://github.com/odoo/odoo/commit/2ead34e974f55dadf791ff6b2924edbf43442b34#diff-4c6e412c7d8f4df2a05831547e7df93d0b91f510d03b7b3ed0d689a18f5dae44R98-L132
still referenced the old field names, causing UndefinedColumn errors during
upgrade. The logic is already handled by the main migration script using the
https://github.com/odoo/upgrade/pull/8197/files#diff-d415d26b86040ad22ab82c184e6db20ec4e9a61058d9a9dbf3668ca21bcbaf19R42-R50
new field names, so this file is no longer required.
```python3
Traceback (most recent call last):
File "/home/odoo/src/odoo/19.0/odoo/service/server.py", line 1509, in preload_registries
registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update'], reinit_modules=config['reinit'])
File "/home/odoo/src/odoo/19.0/odoo/tools/func.py", line 88, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/19.0/odoo/orm/registry.py", line 185, in new
load_modules(
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 449, in load_modules
load_module_graph(
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 217, in load_module_graph
migrations.migrate_module(package, 'post')
File "/home/odoo/src/odoo/19.0/odoo/modules/migration.py", line 220, in migrate_module
exec_script(self.cr, installed_version, pyfile, pkg.name, stage, stageformat[stage] % version)
File "/home/odoo/src/odoo/19.0/odoo/modules/migration.py", line 257, in exec_script
mod.migrate(cr, installed_version)
File "/home/odoo/src/odoo/19.0/addons/l10n_fr_pos_cert/upgrades/1.1/post-sequence-no-gap.py", line 2, in migrate
cr.execute("""
File "/home/odoo/src/odoo/19.0/odoo/sql_db.py", line 426, in execute
self._obj.execute(query, params)
psycopg2.errors.UndefinedColumn: column pconfig.sequence_id does not exist
LINE 9: AND (pconfig.sequence_id = iseq.id or pconfig.sequen...
^
```
opw-5152559
upg-3179288
tbg-2205
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe mailbox search panel now uses the full screen width on mobile instead of appearing squeezed beside the message list. This makes searching inbox, starred, and history messages easier and more usable on phones.
Original PR description
Before this commit, the search panel in mailboxes (inbox, starred, history) took only part of the screen in mobile. This happens because the template being used in mobile for mailbox is the same as…
Before this commit, the search panel in mailboxes (inbox, starred, history) took only part of the screen in mobile. This happens because the template being used in mobile for mailbox is the same as desktop UI for discuss app. This component `DiscussContent` is used because mailboxes are not supported in chat windows, and full-screen conversations in discuss on mobile are actually chat windows. Reusing the `DiscussContent` component is almost the desired UX/UI. The side panel however was not designed for small screen, thus action panel is very narrow and is hard to use in mobile. This commit fixes the issue by making the action panel mutually exclusive to message list in mobile, so that when search panel is open it takes the whole width of screen. We don't need to see message list in mobile, and thanks to chat window also using search panel that takes the whole screen, the search panel is already designed to auto-close itself and jump to a message. Part of Task-4967066 Before / After <img width="383" height="672" alt="Screenshot 2025-10-28 at 18 16 10" src="https://github.com/user-attachments/assets/f7a0bd0d-33ff-4e65-8b0e-0d3a0611b82c" /> <img width="382" height="673" alt="Screenshot 2025-10-28 at 18 15 52" src="https://github.com/user-attachments/assets/79f85cf1-e758-43fd-bc02-8e809e9795e3" />
Lithuanian payroll now avoids charging the pension contribution twice when an employee participates in the pension accumulation system. This helps ensure payslips reflect the expected employee social security contribution and prevents overstated deductions.
Original PR description
**Issue**
When generating a payslip for an employee with the `l10n_lt_pension` setting enabled on the contract ("Participate to pension accumulation system"):
- the SSC is raised from 19.5% to 22.5%
- a 3% pension contribution ("Pension Scheme") is added This effectively doubles the expected contribution.
Various sources (e.g. https://taxsummaries.pwc.com/lithuania/individual/other-taxes) seem to show this is not correct.
opw-5067664
Forward-Port-Of: odoo/enterprise#98276
Forward-Port-Of: odoo/enterprise#95880Users can now open the inventory valuation report for future dates without hitting an error. This matters for businesses reviewing projected or forward-dated inventory values, especially when purchases use lot tracking and average costing.
Original PR description
Currently, an error occurs when a user attempts to access the stock valuation report for a date beyond today. **Steps to replicate:** - Install `stock_account`, `purchase_stock`, `accountant`. - Go…
Currently, an error occurs when a user attempts to access the stock valuation report for a date beyond today. **Steps to replicate:** - Install `stock_account`, `purchase_stock`, `accountant`. - Go to settings, set `Inventory Cost Method` to Average Cost(AVCO) and Turn on `Lots and Serial Numbers`. - Go to Products and create a new one with name `test`, set `Track Inventory` - `by lots`. - On the `Inventory` page turn on `Valuation by Lots/Serial`. - Open RFQs, Create a new one with test product and Click `Confirm Order` > Click `Receive`. - Set the Lot name by clicking the `Details` button on the move lines. - Click `Validate`, go to `Purchase > Orders > Purchase Orders`. - Select the currently made Purchase Order (It will be in the `Waiting Bills` state) and Click on the `Create bills` Button, Confirm it (it should be in the paid state now). - Now go to `Accountant > Review > Inventory Evaluation` and select and date ahead of today, the error will occur. **TL;DR:** - Install `stock_account, purchase_stock, and accountant`. - Create a product tracked by lots with AVCO costing and `Valuation by Lots/Serial` enabled. - Create a Purchase order and receive it (assign a lot), then create and confirm the bill for the same. - Finally, go to `Accountant > Review > Inventory Valuation`, select a future date — the error occurs. **Error:** `TypeError: can't compare datetime.datetime to datetime.date` **Cause:** - The error occurs because of recent commit [PR] where `aml.date` is typecasted from `datetime.date` to `datetime.datetime`, but the `at_date` is received as `datetime.date` [1] and this causes the error. - The `at_date` is converted to `datetime.date` from string at line [2]. **Solution:** - Now we don't convert `aml.date` to datetime since both `aml.date` [3] and `at_date` [4] are instances of `datetime.date`. Additionally, `account.move` are based on date rather than datetime. [PR]: https://github.com/odoo/odoo/pull/227567/commits/aec7d3244aa25af626cefd875f021d0d24ce418d [1]: https://github.com/odoo/odoo/blob/7e0cc5ec686a52b8c1f8270213acac54575ed469/addons/purchase_stock/models/stock_move.py#L157 [2]: https://github.com/odoo/odoo/blob/7e0cc5ec686a52b8c1f8270213acac54575ed469/addons/stock_account/report/stock_valuation_report.py#L32 [3]: https://github.com/odoo/odoo/blob/385d8473952eeaa9dcc7740bacfc2c9cbdc2d1e2/addons/account/models/account_move_line.py#L69-L73 [4]: https://github.com/odoo/odoo/blob/385d8473952eeaa9dcc7740bacfc2c9cbdc2d1e2/addons/stock_account/report/stock_valuation_report.py#L32 sentry-6933268158 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes electronic invoicing settings so required Peppol services can no longer be disabled, reducing the risk of compliance issues. It also corrects invoice format labels and restores some print menu entries so users see the expected invoice actions.
Original PR description
#### [FIX] account_peppol: disallow disabling services Currently it is possible to disallow any services in the configuration. This can lead to complicance issues; i.e. if someone disables "BIS…
#### [FIX] account_peppol: disallow disabling services Currently it is possible to disallow any services in the configuration. This can lead to complicance issues; i.e. if someone disables "BIS Billing 3.0". 1. Ensure Peppol is activated (test mode or production; not demo) 2. Settings -> Accounting -> PEPPOL Electronic Invoicing -> Configure Peppol Services 3. Any service can be disabled. This commit hides the button to open the service wizard. (Also in the wizard it is now not possible to disable services anymore.) #### [FIX] account: generation of print-related entries in cog menu Before this commit: The dynamic generation of the print related entries in the cog menu does not work correctly. Problem / Solutions: There is a check in the javascript that does not work as intended. Thus the entries are not added to the cog menu in all cases. The check was intended to only block it for "new" records (not saved yet); to avoid issues in case the move has no id yet. After this commit we just check the id directly. #### [FIX] account_edi_ubl_cii: missing parenthesis in invoice_edi_format Follow-up to commit 860c0974f9b541be63f4079ef52366f91c1994ce . There we improved the eInvoice format labels for clarity. But 2 label were formatted differently than the others. This commit fixes that. #### References task-4737164 Forward-Port-Of: odoo/odoo#233629 Forward-Port-Of: odoo/odoo#233382
This fix ensures landed costs applied to manufacturing orders are reflected in the finished product's unit cost and stock move value. Businesses using average cost and perpetual valuation get more accurate inventory valuation for manufactured goods, matching the behavior already available for purchase receipts.
Original PR description
**Problem:** landed cost does not work with MO **Steps to reproduce:** - in settings, enable the landed cost setting - create two storable product (the final prod and the comp) - set a positive cost…
**Problem:** landed cost does not work with MO **Steps to reproduce:** - in settings, enable the landed cost setting - create two storable product (the final prod and the comp) - set a positive cost on both - set an on hand quantity for the comp - set the category of the final product as avco perpetual - create a BOM for the final prod where the component is the comp product. - create a third product (the landed cost) - for the product type select service - in the purchase tab check 'is landed cost' - create a manufacturing order for the final product - confirm and produce all - navigate to Inventory/reporting/stock, search for your product and notice the unit cost. - open landed costs and click on New - select the manufacturing order and add the landed cost - validate - navigate to Inventory/reporting/stock **Current behavior:** the unit price of your product has not changed. I you navigate to Inventory/reporting/move analysis and check the move with the reference of the MO, the value of the move has not changed either. **Expected behavior:** Both these value should have been impacted by the landed cost like they would have if we were adding the landed cost to a picking. **Cause of the issue:** When calling _get_value_data on a move, - If there is no production_id, the return value is computed in the super method. There, when _get_value_from_account_move is called, https://github.com/odoo/odoo/blob/385d8473952eeaa9dcc7740bacfc2c9cbdc2d1e2/addons/stock_account/models/stock_move.py#L299 the override in sotck_landed_costs adds the landed costs to 'value' https://github.com/odoo/odoo/blob/385d8473952eeaa9dcc7740bacfc2c9cbdc2d1e2/addons/stock_landed_costs/models/stock_move.py#L18-L22 - But if the move has a production_id the return is computed in the mrp_account override. https://github.com/odoo/odoo/blob/385d8473952eeaa9dcc7740bacfc2c9cbdc2d1e2/addons/mrp_account/models/stock_move.py#L14-L19 But there is no mechanism to take into account the landed cost. opw-5170554
The scheduled SAT status check for Mexican electronic invoices now avoids repeatedly processing the same first batch of invoices. This helps ensure all eligible received invoices are checked over time, so cancellations or status changes from SAT are less likely to be missed.
Original PR description
Currently one of the domains returned by the method `_get_update_sat_status_domains` is `[('state', '=', 'invoice_received'), ('move_id.state', '=', 'posted')]`. This domain is used to always return…
Currently one of the domains returned by the method `_get_update_sat_status_domains` is `[('state', '=', 'invoice_received'), ('move_id.state', '=', 'posted')]`. This domain is used to always return l10n_mx_edi_documents that have been imported from somewhere and whose invoice has been posted. This is because Odoo needs to always checked the value of the originator of an EDI document, in case it has been cancelled from the SAT Portal for instance.
Both `state = 'invoice_received'` and `'move_id.state = 'posted'` are mostly fixed value. The state needs to stay `invoice_received` as Odoo needs to always check the originator document's value. And once an invoice is posted, it's stays as so except in the case of cancellation.
This leads to an issue when the database contains more than 100 documents that are both `invoice_received` and `move_id.state = 'posted'`. In this case, the cron `_fetch_and_update_sat_status` will always process the same 100 documents. Once the limit of 100 is reached, the cron retriggers itself before terminating. Then on the next execution, the search call with the domain coming from `_get_update_sat_status_domain` will return the same 100 documents again.
This commit fixes this issue by ordering the documents in the cron method by `write_date asc`. Even if the SAT value of the documents does not change, the `write_date` should be updated as their is still a write that is triggered via `_update_document_sat_state`. This prevents the cron from always processing the same documents over and over again.
Forward-Port-Of: odoo/enterprise#93205Creating an application from a talent record no longer removes the talent's existing skills. This ensures recruiters can convert talents into applicants without losing important profile information.
Original PR description
Steps to reproduce: - In recruitment, go to any talent pool - Create a new talent and add skills - Click on the "Create Applications" button - The applicant will have the skills but the talent will lose them Reason: When the application is created from the talent, the transmitted skills were treated as duplicates of the new ones and thus deleted to preserve the working logic of skills. How it was fixed: By correcting the create function, the skills are not considered duplicates anymore, allowing the talent to keep their skills. Task ID: 5083085
Electronic invoices now use enough decimal precision for unit prices so line totals stay consistent, especially when prices include tax. This prevents Peppol validation errors that could block or delay invoice exchange.
Original PR description
At the moment, the UBL's Price/PriceAmount node is rounded to the same number of decimals as the database's product price precision. This causes a Peppol schematron validation error due to rule PEPPOL-EN16931-R120 in the case where the user uses tax-included prices. For example, if you have a tax-included unit price of 12.95, a quantity of 8 and a 21% tax, then the tax-excluded subtotal is 85.62. Divide 85.62 by 8 and you get a raw unit price of 10.7025. But if we round to 2 decimal places, we get 10.7 but `10.7 * 8 = 85.6 != 85.62`. Solution: We need to round the unit price to enough decimal places to ensure that unit price * quantity ~= line subtotal (with a tolerance of less than 0.02) opw-5072134 Forward-Port-Of: odoo/odoo#226869
Recruitment applicant matching no longer crashes when a job has no measurable skill expectations. In that case, the system treats the applicant as a full match, keeping hiring workflows usable for affected job positions.
Original PR description
**Traceback :** ``` File "/home/odoo/src/odoo/19.0/addons/hr_recruitment_skills/models/ hr_applicant.py", line 72, in _compute_matching_skill_ids matching_score = round(applicant_total / job_total *…
**Traceback :** ``` File "/home/odoo/src/odoo/19.0/addons/hr_recruitment_skills/models/ hr_applicant.py", line 72, in _compute_matching_skill_ids matching_score = round(applicant_total / job_total * 100) ZeroDivisionError: float division by zero ``` **Steps to Reproduce:** - Install recruitment app. - For any job position, select all expected skill level such that level_progress is 0 and no expected degree . **Description:** - While calculating matching score for applicants here https://github.com/odoo/odoo/blob/19.0/addons/hr_recruitment_skills/models/hr_applicant.py#L72 a ZeroDivisionError occurs if 'job_total' is zero. - This situation occured because in 19 version new feature to calculate applicants matching score was introduced in https://github.com/odoo/odoo/commit/164b55c324e63c45339088823e3d55dfe2147b61 and job_degree,applicant_degree, level_progress in skills for job and applicants were not present in older versions making job_total as 0 causing above traceback - This commit adds a safety check to ensure the division only occurs if 'job_total' is non-zero . and if job_total is 0 , there is no expectation required for this position which makes matching score 100 .
The Italian point of sale flow now handles deleted product lines without crashing. This keeps shop operations running smoothly when cashiers remove items from an order using Italian fiscal printer settings.
Original PR description
Currently POS crashes with the Italian localization if they delete a product line. Steps to reproduce: ------------------- * Install l10n_it_pos and switch to the IT company * Create a pos and…
Currently POS crashes with the Italian localization if they delete a product line. Steps to reproduce: ------------------- * Install l10n_it_pos and switch to the IT company * Create a pos and configure Italian printer * Open shop * Add a product to cart * On the numpad try deleting the line > Observation, pos crashes Traceback: TypeError: Cannot read properties of undefined (reading 'tax_details') Why the fix: ------------ When first hitting the delete button we will put the price unit to 0. With that we have ``` const reduced_base_lines = Object.values(base_line_map).filter( (base_line) => !floatIsZero(base_line.price_unit, base_line.currency_id.decimal_places)); ``` returning an empty list. Utlimately making `reduce_base_lines_to_target_amount` return an empty list. `[][0]` returns `undefined` and we were passing `[undefined]` in parameters of `fix_base_lines_tax_details_on_manual_tax_amounts`, we enter the loop with undefined and try to access some variables. We also set `l10n_it_epson = False` in order to avoid recursively looping. opw-5184113 Forward-Port-Of: odoo/enterprise#98229
Users can now split multiple manufacturing orders from the list view without encountering an error. This prevents an interruption in manufacturing workflows when handling several orders at once.
Original PR description
Currently, an error occurs when trying to split multiple manufacturing orders at once from the list view. **Steps to Reproduce:** 1. Install the MRP module with demo data. 2. Select multiple manufacturing orders from the list view. 3. Click on the "Split" option under the Action button. **Error:** `ValueError - Expected singleton: mrp.production.split(1, 2, 3, 4, 5, 6, 7, 8, 9)` **Cause:** The `_compute_num_splits` method referenced `self.max_batch_size` directly, which expects a single record. When multiple records were processed at once, this caused a singleton error. **Fix:** This commit handles multiple manufacturing order splits to prevent the error. sentry-6951925545
This update brings the spreadsheet component to the latest version and fixes several chart display issues. Business users should see more reliable number formatting in charts, including clearer shortened numbers and decimals, with minor documentation improvements included.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/559e4e57f0 [REL] 19.0.8 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/559e4e57f0 [REL] 19.0.8 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/270e6371f1 [FIX] upgrade: half-versions are missing in mapping [Task: 5116401](https://www.odoo.com/odoo/2328/tasks/5116401) https://github.com/odoo/o-spreadsheet/commit/f13f6475c5 [IMP] doc: add links to data model documentation [Task: 5194507](https://www.odoo.com/odoo/2328/tasks/5194507) https://github.com/odoo/o-spreadsheet/commit/45c4b96cac [FIX] doc: better formatting for data model [Task: 5194507](https://www.odoo.com/odoo/2328/tasks/5194507) https://github.com/odoo/o-spreadsheet/commit/76a1f8f365 [FIX] charts: wrong padding for humanize number section [Task: 5155591](https://www.odoo.com/odoo/2328/tasks/5155591) https://github.com/odoo/o-spreadsheet/commit/688d7f86c8 [FIX] charts: missing `humanizeNumbers` checkbox in some panels [Task: 5155591](https://www.odoo.com/odoo/2328/tasks/5155591) https://github.com/odoo/o-spreadsheet/commit/b44c716107 [FIX] charts: correctly humanize decimal numbers [Task: 5155591](https://www.odoo.com/odoo/2328/tasks/5155591) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
Calendar events created across multiple days in week view now show the right start and end times on each day. This prevents misleading times such as midnight or noon from appearing on event segments, making scheduling clearer for users.
Original PR description
When creating an event in week view spanning over multiple days, all parts of the event display 12pm as end date (except the last one) and 00am as the start date (except the first one). This fix allow calendar views to display the correct hour in week view when the event spans multiple days. task-4700158 Forward-Port-Of: odoo/odoo#233642 Forward-Port-Of: odoo/odoo#230624
This fixes an issue where Safari users could see a blank editor after choosing a pre-built email template, preventing them from editing campaigns. The change restores email campaign editing on Safari while keeping safeguards that limit script execution inside the editor frame.
Original PR description
There is an issue with the MassMailingHtmlField on WebKit browsers such as Safari where, once a "mail theme" is selected, the iframe stays blank and the user is not able to edit the mailing. Steps to…
There is an issue with the MassMailingHtmlField on WebKit browsers such as Safari where, once a "mail theme" is selected, the iframe stays blank and the user is not able to edit the mailing. Steps to reproduce: 1. On Safari, got to Email Marketing app. 2. Create a new email campaign. 3. Select any of the pre-built templates (mail theme). Cause: There is an [issue] with the WebKit implementation of `iframe` `sandbox`: - For an iframe with `src="about:blank"` (equivalent to no `src`) with `sandbox="allow-same-origin"`, if the parent document adds event listeners on elements inside the iframe contentDocument, they can not be executed without the flag `allow-scripts`, which defeats the purpose of the `sandbox` in our case. Other JavaScript engines don't have this issue. Resolution: Event listeners set by the parent document currently are an essential feature of the `HtmlBuilder` editor, and are also used to load scss bundles inside the iframe. A major refactoring would be needed to not require them (the only viable solution would be to make an editor endpoint, and enclose the whole editor feature inside the iframe, and communicate with an Odoo view through `postMessage`, sandbox would be set to "allow-scripts" only). To alleviate the Odoo issue in the short term, `script-src` Content-Security-Policy is set to none inside the iframe, and `allow-scripts` flag is added to the sandbox attribute for browsers identifying as Safari. This effectively allows event listeners set by the parent document to run, but still prevents script execution inside the iframe. [issue]: https://bugs.webkit.org/show_bug.cgi?id=218086 opw-5208425 Co-authored-by: Damien Abeloos <abd@odoo.com> Co-authored-by: Maruan Aguerdouh <magm@odoo.com>
Fixed an issue where a live chat stayed open after the final human agent closed the chat window, even after confirming they were leaving. This ensures conversations end as expected, reducing abandoned chats and improving live chat reliability.
Original PR description
*: mail Before this commit, when the last agent from a live chat conversation leave, the live chat conversation did not end. Steps to reproduce: - install "ai" and "im_livechat" modules - have a…
*: mail Before this commit, when the last agent from a live chat conversation leave, the live chat conversation did not end. Steps to reproduce: - install "ai" and "im_livechat" modules - have a visitor initiate a live chat conversation with 1 available human agent - have have human agent open conversation in chat window and close chat window + confirm button => the live chat conversation does not end When live chat agent is about to close the chat window of live chat, there's a warning to tell that this will make him/her leave the conversation and thus end the conversation. When proceeding, it doesn't actually do this. This is a bug caused by overrides of `ChatWindow._onClose()`, which is a function invoked during the closing of chat window, that has an option `notifyState` that determines whether the user leaves the conversation or not. The overridden code had to ensure the param is preserved and passed to `super` calls, but they fail to do this, and thus the closing of chat window is not making the user leave the conversation. This commit fixes the issue by passing `...arguments` to super calls to make sure the params are preserved as expected by original code of the `_onClose` function. Note that we had a test for the good working of the feature, but this test run with `im_livechat` assets and not overrides on top of it such as `ai` module. The main culpit of the problem was caused by the override in `ai` module. To have test coverage for this problem, the test is not executed in both `im_livechat` test suite and the `test_discuss_full_enterprise`, which is a module whose HOOT suite runs code of discuss with all overrides such as `ai` module.
Fixed an issue where overlapping time tracking entries on manufacturing work orders could be removed after saving. This keeps recorded production time accurate and prevents accidental loss of shop floor tracking data.
Original PR description
#### Issue: In this bug, workorder duration inverse is causing some time_ids to be deleted. To reproduce: 1- Create a db with mrp installed, and enable work orders in Setting 2- Create a MO, and…
#### Issue:
In this bug, workorder duration inverse is causing some time_ids to be deleted.
To reproduce:
1- Create a db with mrp installed, and enable work orders in Setting
2- Create a MO, and confirm it
3- Add a new work order to the MO
4- Add two time tracking lines:
- First one 10:00 -> 12:00
- Second one 10:00 -> 11:00
5- As you see, duration reflects duration of first line as it is the interval duration
6- Save and close work center form. Then save MO form.
7- Open work orders again: As you see second line is unlinked
#### Cause:
The reason to this bug, is because in Enterprise, the `_compute_duration` override changes the logic of how duration is computed but the inverse function doesn't reflect the same logic.
To be specific this is the compute function override: https://github.com/odoo/enterprise/blob/3cbe2bbbfd989a3daaa32769a843aeaa09c7ed3e/mrp_workorder/models/mrp_workorder.py#L757-L766
In which duration is calculated using get_duration: https://github.com/odoo/enterprise/blob/3cbe2bbbfd989a3daaa32769a843aeaa09c7ed3e/mrp_workorder/models/mrp_workorder.py#L828-L837
Which doesn't sum the durations, but calculates the intervals duration counting overlaps only once.
However, there is no override of inverse method in Enterprise, meaning that the logic behind inverse will not match with this logic. In the inverse it is assumed duration is sum of all time_ids intervals: https://github.com/odoo/odoo/blob/9b286285a6c66bc2d629eacf651c3439cffb55cc/addons/mrp/models/mrp_workorder.py#L355-L400
As a result, if time_ids overlap:
new_order_duration < old_order_duration
As a result some time_ids will be unlinked and some will have duration changed.
#### Fix:
Inside the inverse function in Community we can do:
```diff
+ old_order_duration = order.get_duration()
- sum(order.time_ids.mapped('duration'))
```
As get_duration in Odoo Community is:
https://github.com/odoo/odoo/blob/9b286285a6c66bc2d629eacf651c3439cffb55cc/addons/mrp/models/mrp_workorder.py#L889-L899
The order.get_duration will be sum of duration of all time_ids in community, hence the logic will be unchanged.
In Enterprise, this is going to reflect the logic implemented in override of get_duration, as a result the duration logic will be consistent in compute and inverse function.
However, this might cause another issue:
If `order.duration` is not computed yet, and inverse method `_set_duration` is called, then `get_duration` inside `_set_duration` will be called before the `get_duration` in compute method. As a result there might be a small unexpected time difference between `old_order_duration` and `new_order_diuration`. To avoid that inside `get_working_duration` we can use cursor now instead:
```diff
+ now = self.env.cr.now()
- now = datetime.now()
```
opw-5082477
Forward-Port-Of: odoo/enterprise#96632Fixed an issue where a live chat conversation could remain open after the final human agent closed the chat window. This ensures customer conversations are properly ended as expected and adds broader test coverage when AI-related chat features are installed.
Original PR description
*: ai_website_livechat, test_discuss_full_enterprise Before this commit, when the last agent from a live chat conversation leave, the live chat conversation did not end. Steps to reproduce: - install…
*: ai_website_livechat, test_discuss_full_enterprise Before this commit, when the last agent from a live chat conversation leave, the live chat conversation did not end. Steps to reproduce: - install "ai" and "im_livechat" modules - have a visitor initiate a live chat conversation with 1 available human agent - have have human agent open conversation in chat window and close chat window + confirm button => the live chat conversation does not end When live chat agent is about to close the chat window of live chat, there's a warning to tell that this will make him/her leave the conversation and thus end the conversation. When proceeding, it doesn't actually do this. This is a bug caused by overrides of `ChatWindow._onClose()`, which is a function invoked during the closing of chat window, that has an option `notifyState` that determines whether the user leaves the conversation or not. The overridden code had to ensure the param is preserved and passed to `super` calls, but they fail to do this, and thus the closing of chat window is not making the user leave the conversation. This commit fixes the issue by passing `...arguments` to super calls to make sure the params are preserved as expected by original code of the `_onClose` function. Note that we had a test for the good working of the feature, but this test run with `im_livechat` assets and not overrides on top of it such as `ai` module. The main culpit of the problem was caused by the override in `ai` module. To have test coverage for this problem, the test is not executed in both `im_livechat` test suite and the `test_discuss_full_enterprise`, which is a module whose HOOT suite runs code of discuss with all overrides such as `ai` module.
This fix keeps manufacturing work order time tracking entries from being removed when their time ranges overlap. It aligns how Odoo calculates and saves work order duration, helping preserve accurate production time records.
Original PR description
Issue: In this bug, workorder duration inverse is causing some time_ids to be deleted. To reproduce: 1- Create a db with mrp installed, and enable work orders in Setting 2- Create a MO, and confirm…
Issue:
In this bug, workorder duration inverse is causing some time_ids to be deleted.
To reproduce:
1- Create a db with mrp installed, and enable work orders in Setting
2- Create a MO, and confirm it
3- Add a new work order to the MO
4- Add two time tracking lines:
- First one 10:00 -> 12:00
- Second one 10:00 -> 11:00
5- As you see, duration reflects duration of first line as it is the interval duration
6- Save and close work center form. Then save MO form.
7- Open work orders again: As you see second line is unlinked
Cause:
The reason to this bug, is because in Enterprise, the `_compute_duration` override changes the logic of how duration is computed but the inverse function doesn't reflect the same logic.
To be specific this is the compute function override:
https://github.com/odoo/enterprise/blob/3cbe2bbbfd989a3daaa32769a843aeaa09c7ed3e/mrp_workorder/models/mrp_workorder.py#L757-L766
In which duration is calculated using get_duration:
https://github.com/odoo/enterprise/blob/3cbe2bbbfd989a3daaa32769a843aeaa09c7ed3e/mrp_workorder/models/mrp_workorder.py#L828-L837
Which doesn't sum the durations, but calculates the intervals duration counting overlaps only once.
However, there is no override of inverse method in Enterprise, meaning that the logic behind inverse will not match with this logic. In the inverse it is assumed duration is sum of all time_ids intervals:
https://github.com/odoo/odoo/blob/9b286285a6c66bc2d629eacf651c3439cffb55cc/addons/mrp/models/mrp_workorder.py#L355-L400
As a result, if time_ids overlap:
new_order_duration < old_order_duration
As a result some time_ids will be unlinked and some will have duration changed.
Fix:
Inside the inverse function in Community we can do:
```diff
+ old_order_duration = order.get_duration()
- sum(order.time_ids.mapped('duration'))
```
As get_duration in Odoo Community is:
https://github.com/odoo/odoo/blob/9b286285a6c66bc2d629eacf651c3439cffb55cc/addons/mrp/models/mrp_workorder.py#L889-L899
The order.get_duration will be sum of duration of all time_ids in community, hence the logic will be unchanged.
In Enterprise, this is going to reflect the logic implemented in override of get_duration, as a result the duration logic will be consistent in compute and inverse function.
opw-5082477
Forward-Port-Of: odoo/odoo#230328Website translations could fail to save when editing the full text of a mega menu item in another language. This fix keeps translation markers intact so translated menu content is saved reliably.
Original PR description
Scenario: - install second language on website - add mega menu item to menu - translate full span (from first to last letter) - save Result: nothing is saved Cause: The mega menu is in a node with…
Scenario: - install second language on website - add mega menu item to menu - translate full span (from first to last letter) - save Result: nothing is saved Cause: The mega menu is in a node with [data-oe-model] attribute that receives the o_editable class from SetupEditorPlugin. Its content is in a `section > .container` that receives contenteditable="true" from BuilderContentEditablePlugin. Because the container zone is contenteditable, the editor allows to select outside of <span data-oe-translation-…/> elements and when we replace the whole content, the node is removed because it is an empty SPAN and we lose the translation reference, so the translation are lost when saved. Fix: There is already a code that disable wrapping editable since d4f8aebea8cc7eba1517575302e072e0d5e2e406. This was not taking this case where the content is not in '.o_editable' but in '.o_editable section > .container'. With this fix, we only add o_editable class to nodes that matches [data-oe-model][data-oe-translation-source-sha]. opw-5045798 opw-5159026 Forward-Port-Of: odoo/odoo#232675