Friday, February 21, 2025
26 changes
4 changes
Enhancements to existing features
Users can now edit report date periods directly instead of repeatedly clicking arrows to move between months, quarters, or years. The date filter dropdown also supports keyboard navigation, making financial reports faster and more accessible to use.
Original PR description
Currently the new date filter widget on reports only allows users to change a period by clicking the `<` and `>` arrows next to the period description. This makes it cumbersome if a user want to switch from a month in one year to the same month in another year. He will have to click the arrow button at least 12 times. In order to simplify this kind of operation, we allow users editing the period text inline on double clicking it. That way they can manually change the month, quarter, or year and the report will reload with the correct period based on that. [task-4284292](https://www.odoo.com/odoo/project.task/4284292) Related to https://github.com/odoo/odoo/pull/190141
Portal ticket lists now show combined time spent versus allocated hours when tickets are grouped, helping customers understand overall work progress more easily. For services billed on validated timesheets only, the displayed time now respects that policy and only includes validated entries.
Original PR description
_*= helpdesk, helpdesk_sale_timesheet, documents_project - In this commit we have enhanced the functionality of displaying effective hours divided by allocated hours of grouped ticket in the portal list view. task-3609050
Project budget columns now use clearer business terms: Forecast, Actual, and Difference. The budget status also avoids incorrectly marking projects as overspent when a budget has been allocated but no spending has occurred, giving teams a more accurate view of project finances.
Original PR description
-Replaced table headers string:
'Allocated', 'Spent', 'Remaining' with 'Forecast', 'Actual', 'Difference'.
Currently, when a project only has the budget allocated without any spending, the project task Kanban incorrectly shows it as 'overspent'.
task-4353191Resolved issues and error corrections
This fix allows businesses using Chilean or Peruvian electronic invoicing with Point of Sale to combine multiple POS orders into a single global invoice. It prevents invoicing errors when restaurants or shops consolidate several orders, improving reliability for daily closing and compliance workflows.
Original PR description
*: [cl, pe] Steps to reproduce: -------------------------- - Install pos_restaurant and any of above localization. - Create multiple orders. - Try to create global invoice of those orders. Issue: -------- - For global invoice feature we allowed multiple orders to be consolidated and can be generated a single invoice which was not handled in l10n modules. Cause: --------- - We were using directly self.field_name to access some values which now can't be supported due to multiple orders in self. Fix: ----- - We adapted the code to have consolidated invoices based on the mapped values. Runbot Error Task: ------------------------- https://runbot.odoo.com/odoo/action-573/134660 https://runbot.odoo.com/odoo/action-573/134661 Related PR: https://github.com/odoo/odoo/pull/198256
22 changes
Enhancements to existing features
This update prevents errors caused by company-specific fields pointing to records that no longer exist. It improves reliability when loading or comparing these values, reducing unexpected disruptions for users working across companies.
Original PR description
When using JSONB for company-dependent many2one fields, references to non-existing records in the comodel can lead to MissingError. This commit introduces validation during fetch and comparison by taking advantage of index-only scan to ensure that referenced records exist. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Customer follow-up reports now use a dedicated statement format that focuses on the current year and only includes customer invoices. The report separates invoices that are due from those that are overdue, making payment follow-up clearer and less confusing for customers.
Original PR description
Instead of sending a confusing customer statement that includes invoices from the last period regardless of their status. Adding a new Partner ledger variant that will be sent as a follow-up report that provides the current year's customer statement including only customer invoices with separating Due and OverDue invoices. task-4454196
After pairing an IoT Box, users can now configure eligible devices for a selected Point of Sale directly from a popup. This reduces manual setup work for barcode scanners, customer displays, and receipt printers, making store onboarding quicker and easier.
Original PR description
To configure IoT Devices in a PoS we needed to pair the IoT Box, then go to PoS configuration and select devices (barcode scanner, customer display, receipt printer) one by one. We now display a popup right after IoT Box pairing, allowing autoconfiguration of eligible devices in the wanted PoS. Task: 4585446
Resolved issues and error corrections
Employees with flexible working hours can now see weekend shifts when opening the planning link from their email. This prevents published weekend assignments from being hidden and helps employees reliably review their full schedule.
Original PR description
### Issue: - When assigning weekend shifts to an employee with flexible hours, the weekend shifts don't appear when clicking on `View Your Planning` of the planning email. ### Steps to reproduce: -…
### Issue:
- When assigning weekend shifts to an employee with flexible hours, the weekend shifts don't appear when clicking on
`View Your Planning` of the planning email.
### Steps to reproduce:
- Create a new employee with flexible hours.
- In the Planning app, create a new shift for the employee on a weekend.-Publish and send the shifts.
- In emails, click on the email sent to the employee, then click `View Your Planning`.
- The weekend shifts don't appear.
### Solutions:
- When clicking on the `View Your Planning` link, the request is processed by the controller at:
`@http.route(['/planning/<string:planning_token>/<string:employee_token>'], type='http', auth="public", website=True)`
- This controller invokes the `_planning_get` method, which in turn calls the `_get_valid_work_intervals` method.
- In the `_get_valid_work_intervals` method, I check if the calendar has flexible hours to return the whole interval.
opw-4378797
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fixes an issue where tax subtotals could be calculated incorrectly when certain taxes were included in the base amount. It helps ensure sales and accounting documents show accurate tax totals for affected scenarios.
Original PR description
… taxes Bug introduced by https://github.com/odoo/odoo/commit/90949cd56da77da3645922f670f86483d7859c2f See tests in this commit for a concrete use case. opw-4571908 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a mobile issue where website visitors lost access to an ongoing live chat after refreshing the page. The chat now remains available as a bubble on mobile, so customers can continue conversations without switching device mode or finding a workaround.
Original PR description
Before this commit, when using livechat by visitor in mobile, any page reload would remove access to the livechat. Steps to reproduce: - access to website with livechat installed on mobile - click on…
Before this commit, when using livechat by visitor in mobile, any page reload would remove access to the livechat. Steps to reproduce: - access to website with livechat installed on mobile - click on livechat button (bubble icon in bottom right) - send a message - reload the page => the livechat is not open, not even as a chat bubble. This prevents visitor from access the livechat again, except if user finds a workaround to open the same page in non-mobile mode (e.g. landscape mode or disabling high-dpi). This happens because livechat relies on discuss chat hub, and there's some code to prevent server-side synchronisation of chat windows and bubbles in mobile. As a reminder, conversation in mobile are shown as fullscreen chat windows. This code was preventing the opening of chat window on livechat for visitor, leading to prevention of continuing to live chat on the device. This commit fixes by adding fold action to chat windows in mobile specifically for livechat visitors, thus allowing to have chat bubbles in mobile. This fixes allow to show chat windows as bubbles to livechat visitors, which is the primary fix of these changes. Due to chat windows being server-synced, we made sure to not sync chat windows in the backend. To do so, we rely on presence of livechat service to determine when the chat bubble feature should work in mobile. opw-4423556 opw-4488830
Users who manage stock can now validate deliveries linked to field service or sales projects even if they do not have Sales app access. This prevents an access-rights error and keeps delivery validation working for operational users without needing extra sales permissions.
Original PR description
Before this commit, when the user validates a stock picking and that user does not have access to sales app, he will get a traceback if `sale_project_stock` module is installed because the `reinvoiced_sale_order_id` field of the project linked to the picking and that field required the user to have sale access to access to it. This commit adds a sudo to generate eventual SOLs to reinvoice the stock move when the user without any access to Sales validates the stock picking. Steps to reproduce the issue: ---------------------------- 1. Create a sales order with a storable product 2. and Service product that creates a task in the Field service project 3. After confirming this SO, a task is created => assign Demo to this task and demo doesn't have Sales access right 4. Login as demo, trying to validate the delivery from this task opw-4590044
This change reverts a previous adjustment to invoice report headers and footers for Latin American invoice documents and Hungarian EDI reports. It helps restore the expected document layout and avoid formatting issues in printed or PDF invoices.
Original PR description
…oter issues" This reverts commit 9d986db17f14c7fcc05ba30df59b07b8c37d0a9d. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a problem on Android Chrome where pressing backspace in the HTML editor could remove unintended text or place the cursor in the wrong position. The editor now restores unexpected browser changes so deleting content behaves consistently, helping users edit pages and rich text without losing content.
Original PR description
On Android Chrome, for some obscure reason (bug?) the beforeinput event of type deleteContentBackward cannot be default prevented. This leads to unpredictable behavior when deleting content,…
On Android Chrome, for some obscure reason (bug?) the beforeinput event of type deleteContentBackward cannot be default prevented. This leads to unpredictable behavior when deleting content, considering the editor handles the delete operation and assumes the default behavior is prevented.
The steps below illustrate one of the possible issues.
Steps 1:
a. Have the following html:
```
<h1><span style="font-size: 36px;">Welcome to the To-do app! </span></h1>
<p>
<span style="font-size: 14px;">
Use it to manage your work</span>
</p>
```
b. On Android Chrome, place the cursor at the beginning of the paragraph and press backspace on the device's virtual keyboard.
As a result, the paragraph is merged with the heading, but the characters "Use it to" disappear:
```
<h1>
<span style="font-size: 36px;">Welcome to the To-do app!</span>
<span style="font-size: 14px;"> manage your work</span>
</h1>
```
This example was taken from the "Welcome Mitchell Admin" task in the To-do app, so it's easily testable.
Steps 2:
a. On Android Chrome, have two paragraphs with some text, and place the cursor at the beginning of the second paragraph. E.g.:
```
<p>abc</p>
<p>[]def</p>
```
b. Press backspace on the device's virtual keyboard.
As a result, the paragraphs are merged (as expected), but the cursor is placed in the wrong position, e.g.: `<p>abcd[]ef</p>`, whilst `<p>abc[]def</p>` was expected.
Since the default behavior cannot be prevented, this commit makes sure that eventual DOM mutations and selection changes occurred after the beforeinput event are reverted, aiming to achieve the same effect as preventing default.
task-4243933This fix restores missing header information in certain invoice report layouts for Latin American invoice documents and Hungarian EDI reports. It prevents invoices from being printed or shared with incomplete branding or layout details after a previous change affected the templates.
Original PR description
Commit 9d986db17f14c7fcc05ba30df59b07b8c37d0a9d introduced a regression that caused `l10n_latam_invoice_document` to lose its header for the striped layout. In addition due to different position of the header img tag in the standard layout template HTML tree, `l10n_hu_edi` also required explicit base standard layout header classes in its attributes. This was caused by the xpath `//img/../..` introduced in f86238d7c872b3f025085831d50f1896168b6274 which thus unintentionally removed these classes opw-4593505
This fix prevents an error that could occur when customers reach the receipt screen after paying online in Point of Sale with discounts, promotions, or loyalty enabled. It updates the payment flow to use the current order identifier, helping checkout complete reliably.
Original PR description
Description of the issue/feature this PR addresses: Steps to reproduce: - Setup a POS - Enable online payment (e.g Demo) - Activate discount, promotion & loyalty in configuration - Place an order in the POS until receipt screen Alternatively, take look at the recording: https://github.com/user-attachments/assets/471e06ae-45d6-4440-a287-7c2433845c26 Current behavior before PR: Odoo will throw an error because the existing field of server_id is not exists anymore, error occurs when post processing loyalty.  Desired behavior after PR is merged: This PR is expected to solve the issue by changing the old server_id with the current id field opw-4584152 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo now recognizes Worldline's payment rejection response as an expected payment outcome instead of treating it as a connection problem. This makes failed subscription payments, such as those caused by expired cards, clearer and more accurate for users and support teams.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have an expired credit card[^1]; 2. have an Odoo subscription; 3. pay subscription with expired credit card. Issue ----- Subscription chatter shows: >…
Versions -------- - 18.0+ Steps ----- 1. Have an expired credit card[^1]; 2. have an Odoo subscription; 3. pay subscription with expired credit card. Issue ----- Subscription chatter shows: > Automatic payment failed. No email sent this time. > Error: Worldline: The communication with the API failed. > Details: Cause ----- When a payment gets rejected for any reason like card expiration, Worldline returns the 402 HTTP response code[^2]. This is a nonstandard response indicating "Payment Required"[^3]. Because the 4xx HTTP status code range is reserved for client errors, we currently interpret the 402 response as a communication failure with the API instead of a rejected payment. Solution -------- Don't `raise_for_status` if the response belongs to one of the "expected" responses according to their API: - 200: Successful - 201: Created - 402: Payment rejected opw-4481602 [^1]: Wordline doesn't provide a way to easily test rejected payments. [^2]: https://apireference.connect.worldline-solutions.com/s2sapi/v1/en_US/json/response-codes.html [^3]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/402
Accounting warning messages can now correctly open review links that include multiple view options. This prevents users from hitting an error when following a warning link from the Secure Entries wizard, helping them complete accounting checks without interruption.
Original PR description
When we show a wizard to the user it is possible to add some warnings and redirects to views. However currently an error message will raise when accessing a view with more than 1 view mode Steps to reproduce: - Have entries already secured with hash - Create unreconciled bank statement - Open Secure Entries wizard (Accounting / Accounting / Secure Entries) - Enter a future date - Warning will raise "There are still unreconciled bank statement lines before the selected date. The entries from journal prefixes containing them will not be secured: BNK1/2025 Review" - Click on the Review Link Traceback ``` Uncaught Promise > View types not defined kanban,list found in act_window action 855 ``` This occurs because multiple view_mode are not correctly handled opw-4571921
Uninstalling an industry module now removes all related records, including those that were previously kept because they had duplicate exclusion references. This helps keep databases clean and prevents leftover demo or industry-specific content from remaining after a module is removed.
Original PR description
Steps to reproduce: - Install any industry module; - Uninstall the module; Current behaviour: Some records from the industry module (like a knowledge article) which have a second xmlid from `__cloc_exclude__` remain in the database after the uninstallation. Expected behaviour: After this commit, all records from the industry and their related `__cloc_exclude__` ir_model_data entries are removed. task-4501067
This pull request fixes website translation handling so customized translated text stored in attributes is preserved correctly. It also includes several business-impacting fixes across imports, login caching, inventory reports, accounting, sales expenses, manufacturing dates, hardware naming, and Belgian tax configuration.
Original PR description
Description of the issue/feature this PR addresses: Personalizaciones en las traducciones del sitio web. Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where landed costs could be counted twice on product lots when multiple lot-valued products were received together. Lot costs now match the product valuation, helping inventory and cost reports show accurate figures.
Original PR description
Steps to reproduce the bug:
- Create two storable products, P1 and P2:
- tracked by: lot
- Valuated by: lot
- Create a service product, S1:
- is landed cost: True
- value: $100
- Create a receipt:
- unit of P1, unit price: $1
- unit of P2, unit price: $1
- Add the landed cost S1, split by quantity.
Problem:
The cost valuation of the products is then $51 each. The product form
and valuation are displayed correctly. However, if we check the lot,
the cost appears as $101.
This issue occurs because, when validating the landed cost, we have a
dictionary mapping lots to values. Then, we iterate over each product,
but we do not filter the lot dictionary for the current product.
Instead, we traverse the entire dictionary, leading to the lot values
being processed twice.
opw-[4509006](https://www.odoo.com/web#id=4509006&view_type=form&model=project.task)This fix restores company-based filtering when users choose accounts on invoices, vendor bills, journal entries, and related expense views. It helps prevent users from accidentally selecting accounts that belong to another company, improving data accuracy in multi-company setups.
Original PR description
In `account.move.line` views, the `account_id` fields that have a `domain` attribute need to filter for `company_ids` in the domain, since the check_company domain is overriden by the domain in the field. We removed these domains in odoo#171079 thinking that check_company=True would automatically add them. But it doesn't, so we must revert that change. Otherwise, the user can select accounts that don't belong to the current invoice / vendor bill / journal entry's company. task-none
Swiss payroll payment reports now offer the correct Swiss ISO 20022 format instead of forcing the standard SEPA format. This ensures generated bank payment files match Swiss banking requirements and reduces payment processing issues for Swiss companies.
Original PR description
### Steps to reproduce: - Install 'l10n_ch' and switch to a Swiss company - Go in Payroll app - Create a contract, go to its payslip - Click on "Create Payment Report" - Select SEPA as Report Format - The generated XML uses pain.001.001.09 but should use pain.001.001.03.ch.02 ### Cause: pain.001.001.03.ch.02 became a payment_method since this [commit](https://github.com/odoo/enterprise/commit/67593e5ff9b3a5187a1535bc8fc89590b4c9401e). But in the payroll app there is only the option to choose SEPA and by doing this it uses the 'sepa_ct' payment method: https://github.com/odoo/enterprise/blob/033b3f7773e0dd41cb1dfcc5542d19b22f5fe609/hr_payroll_account_iso20022/wizard/hr_payroll_payment_report_wizard.py#L26 ### Solution: Add a new value to choose from other than SEPA for the Report Format and make this format use the payment method iso20022_ch. opw-4437968
This fix restores the ability for users to include payments from branch companies in a batch created by the main company. It removes an unexpected company mismatch error, allowing multi-branch payment collection workflows to work as they did before.
Original PR description
Users managing several branch companies may collect in a batch several payments from the branches. However this currently does not work as expected. Steps to reproduce: - Have a [main] company and a [branch] company - Create a payment in [branch] - Create a batch in [main] - Add the payment to the batch Issue: Error will raise ``` Incompatible companies on records: - “PAY00001” belongs to company “Your branch” and “Batch Payment” (batch_payment_id: 'BATCH/IN/2025/0001 (New)') belongs to another company ``` This occurs because now we check that batch and payment belong to the same company It is a change of behavior as in older versions this flows was permitted opw-4574188
This update fixes two issues in the Italian point of sale flow: discounted order lines now show the correct reduced price, and fiscal printer receipt formatting is converted more reliably. This helps prevent incorrect customer-facing totals and improves consistency for Italian POS receipts.
Original PR description
- Fix the tags and attributes html to xml replacement to use longest matching - Fix the price calculations when a discount is added to an order line
Odoo no longer blocks SEPA direct debit batches solely because a first collection date is within the usual 5-day notice period. Users now receive a warning in that case, while payments are only blocked when the date is less than 2 days away, helping companies using imported mandates process payments more smoothly.
Original PR description
By default, SEPA requires a 5 day notification period prior to collecting a payment, if no payment has ever been collected using the related mandate. However, it could be that the company used another software before and imported their existing mandates (that have no payments yet in Odoo). In this case, the 5 day period does not apply and can be relaxes to the default 2 day period for running mandates. Instead of blocking the user when their required payment date is not at least 5 days from today (on first-time mandates), we now only show a warning at the top of the form, with links to the related payments. Blocking the user will only happen if the required payment date is not at least 2 days from today. [task-4472278](https://www.odoo.com/odoo/project.task/4472278)
Features or functions removed from Odoo
The HTML editor now includes a system to update older embedded content automatically when pages or fields are opened. Existing Excalidraw drawings are converted into standard links because the embedded drawing service had restrictive usage requirements that limited normal users.
Original PR description
This PR adds the migration system previously implemented in Knowledge to update embedded components inside the html field/viewer, see odoo/enterprise@0df669159aaa1a9631ab12a68758bf78954071f7. It also makes use of it to replace excalidraw embedded components by normal links. task-4489076