Daily updates from Odoo
Navigate
Branch
Friday, October 17, 2025
282 changes
7 changes
Enhancements to existing features
Refreshing webhooks from the settings now clears the existing product links from the point of sale before sending a fresh menu to UrbanPiper. This helps ensure the external ordering platform receives an up-to-date menu and avoids stale product mappings.
Original PR description
Following this commit: - On refreshing webhooks from settings, products will be unlinked from pos. - Fresh menu will be updated to Urbanpiper platform task-5163764 Forward-Port-Of: odoo/enterprise#97000
Payroll users can now see and manage contract offers directly from the employee form without needing recruitment permissions. This gives payroll officers the access they need for offer and contract work while keeping responsibilities aligned with their role.
Original PR description
Previously, the Offers smart button on the employee form was only available to recruitment users. This limited visibility for payroll officers who also need access to contract offers. This commit Changes the button visibility to hr_payroll.group_hr_payroll_user in hr_employee_views.xml. Adds missing access rights in ir.model.access.csv for hr.group_hr_user (inherited by payroll users). Updates the module manifest to include the new security CSV. The goal is to ensure payroll users can access and manage offers directly without requiring recruitment rights. task-5085078
Resolved issues and error corrections
This update ensures accounting localization tests always run with the required sample data installed. It helps keep automated testing consistent across versions and reduces the risk of test failures caused by missing setup data.
Original PR description
In later versions, we improve the testing suite to avoid having to install demo data in order to reduce the testing time. In order to keep the testing configuration simple across versions, we force the installation of demo data instead of only asserting that demo is installed before launching the script. Forward-Port-Of: odoo/odoo#231925 Forward-Port-Of: odoo/odoo#231660
Reverse charge taxes are now reported with the correct payable tax amount instead of showing zero. This helps Romanian SAF-T reports match tax authority expectations and reduces the risk of incorrect compliance filings.
Original PR description
When a reverse charge tax is used, we export a `TaxInformation` with a zero amount instead of the real amount of the tax. The tax authority requires to show the tax to pay and doesn't care about the tax to receive... In order to fix this, we only sum the tax details of lines having positive repartition lines. opw-5125678 Forward-Port-Of: odoo/enterprise#97315 Forward-Port-Of: odoo/enterprise#97117
The website SEO Auto-Fill action now works correctly on system pages such as login, signup, password reset, and donation payment pages. This prevents an error from interrupting users and allows SEO fields to be filled as expected.
Original PR description
Steps to Reproduce: 1.Go to the website and open a system page such as: /web/login /web/signup /web/reset_password /donation/pay 2.In the top menu, go to Site → Optimize SEO. 3.Click the Auto-Fill button. 4.Observe that a traceback appears. Before this commit: Clicking the Auto-Fill button caused a traceback error because pageTextContentEl was null due to wrong selector. As a result, getElementsByTagName could not be accessed. In this commit: We provide the correct querySelector value so that pageTextContentEl properly references the intended DOM element. This fix prevents the error and ensures that the SEO Auto-Fill button works correctly, populating all required fields without issue. task-4974618 Forward-Port-Of: odoo/odoo#220769
The payslip export option that led users to a missing page has been disabled in Payroll. This prevents confusion and avoids a 404 error when working with payslip records in debug mode.
Original PR description
Steps to reproduce: ------------------------- 1. Install `hr_payroll` module 2. Enable debug mode and click on Become Superuser 3. Go to All Payslips and open any payslip record 4. Click on the…
Steps to reproduce: ------------------------- 1. Install `hr_payroll` module 2. Enable debug mode and click on Become Superuser 3. Go to All Payslips and open any payslip record 4. Click on the Export Payslip button Observation: ------------------------- A 404 (Page Not Found) error appears when clicking the Export Payslip button Issue: ------------------------- The button triggers the route `/debug/payslip/<id>`, which was removed in the following commit https://github.com/odoo/enterprise/commit/57969bcaf876a13c36794adeb47e0da938e297ad#diff-0105b1a6a9e742e7eeaf7cc727745ebd3932177378d46332d4ca854f931b3359 The route was never reintroduced afterward, but the Export Payslip button remained in the view. As a result, clicking it leads to a 404 error Solution: ------------------------- 1. Temporarily bypass the `action_export_payslip` function. 2. Remove the Export Payslip button from the XML in the master forward port branch, as doing so does not impact any existing customizations relying on that button opw-5115946 Forward-Port-Of: odoo/enterprise#97361 Forward-Port-Of: odoo/enterprise#96359
Fixes a website builder issue where cancelling language selection after a save prompt could leave the save button disabled with a loading indicator. This helps users continue editing normally and reduces confusion during website customization.
Original PR description
debug test added in https://github.com/odoo/odoo/pull/229843
7 changes
Enhancements to existing features
This update adjusts tax rounding so Mexican electronic invoices calculate totals more consistently with current requirements. It also aligns related point-of-sale tax handling, reducing discrepancies in invoice and receipt amounts.
Original PR description
Forward-Port-Of: odoo/enterprise#96809
Refreshing UrbanPiper webhooks from settings now detaches products from the point of sale before sending an updated menu to UrbanPiper. This helps ensure UrbanPiper receives a clean, current menu after a refresh, reducing mismatches between Odoo POS and the delivery platform.
Original PR description
Following this commit: - On refreshing webhooks from settings, products will be unlinked from pos. - Fresh menu will be updated to Urbanpiper platform task-5163764 Forward-Port-Of: odoo/enterprise#97000
Resolved issues and error corrections
This fix improves how Odoo rounds taxes that are already included in prices, preventing small one-cent mismatches between line totals and tax breakdowns. It also simplifies the underlying tax calculation flow, making localized tax rules easier to maintain.
Original PR description
== Fix bug price-included == Suppose a line of 24.99 with a 20% tax price-included. base: 24.99 / 1.2 = 20.825 tax: 20.825 * 0.2 = 4.165 If we round both, we get 20.83 + 4.17 = 25.0 != 24.99 == Split and simplify round_base_line_tax_details == Easier implementation of this method to be easier to understand and easier to be customized (see PT override). Also, we now use the aggregate methods to aggregate the amounts instead of doing that by hand. opw-4505888 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228437
SAF-T reports now show the required tax payable amount when reverse charge taxes are used, instead of reporting zero. This helps Romanian tax filings reflect the amounts tax authorities expect and reduces the risk of incorrect compliance reports.
Original PR description
When a reverse charge tax is used, we export a `TaxInformation` with a zero amount instead of the real amount of the tax. The tax authority requires to show the tax to pay and doesn't care about the tax to receive... In order to fix this, we only sum the tax details of lines having positive repartition lines. opw-5125678 Forward-Port-Of: odoo/enterprise#97315 Forward-Port-Of: odoo/enterprise#97117
The payroll screen no longer exposes an export payslip action that led users to a missing page. This avoids confusion and prevents employees or administrators from encountering a 404 error when viewing payslips in debug mode.
Original PR description
Steps to reproduce: ------------------------- 1. Install `hr_payroll` module 2. Enable debug mode and click on Become Superuser 3. Go to All Payslips and open any payslip record 4. Click on the…
Steps to reproduce: ------------------------- 1. Install `hr_payroll` module 2. Enable debug mode and click on Become Superuser 3. Go to All Payslips and open any payslip record 4. Click on the Export Payslip button Observation: ------------------------- A 404 (Page Not Found) error appears when clicking the Export Payslip button Issue: ------------------------- The button triggers the route `/debug/payslip/<id>`, which was removed in the following commit https://github.com/odoo/enterprise/commit/57969bcaf876a13c36794adeb47e0da938e297ad#diff-0105b1a6a9e742e7eeaf7cc727745ebd3932177378d46332d4ca854f931b3359 The route was never reintroduced afterward, but the Export Payslip button remained in the view. As a result, clicking it leads to a 404 error Solution: ------------------------- 1. Temporarily bypass the `action_export_payslip` function. 2. Remove the Export Payslip button from the XML in the master forward port branch, as doing so does not impact any existing customizations relying on that button opw-5115946 Forward-Port-Of: odoo/enterprise#97361 Forward-Port-Of: odoo/enterprise#96359
Dynamic placeholders in email mailings now keep their intended placement when a mailing becomes read-only after being sent. This prevents unwanted line breaks around personalized content, helping sent mailings display as designed.
Original PR description
In editable fields, the Web Editor currently adds the data-oe-t-inline attribute to items that are identified as needing to be displayed inline However, this attribute is added by the editor and removed on save. As a result, if the previously-editable field is ever set to readonly (for example: a mailing that is sent no longer allows users to edit its body), then the inline property appears to be lost: an inline dynamic attribute suddenly looks like it's on its own line. Steps to reproduce: - Create a mailing - Add a dynamic attribute in the middle of a line - Send the mailing - You will see a carriage return directly before and after the dynamic attribute Fix: The mass_mailing html field now applies the current inlining logic to readonly HTML. task-4852246 Forward-Port-Of: odoo/odoo#227651
French VAT report submissions to ASPOne now use the correct maximum lengths for key company name and address fields. This helps prevent rejected or invalid electronic filings caused by values that exceed ASPOne’s required format.
Original PR description
The aim of this commit is making sure that the field Designation, DesignationSuite1, DesignationSuite2, AdresseVoie and AdresseComplement are correctly filled. Indeed, the XSD implied that these fields have to be respectively 35, 35, 35, 30 and 35 characters max. [Documentation 2025](https://www.aspone.fr/files/tutoriaux/xmledi/Documentation_XML-EDI.zip) no task id Forward-Port-Of: odoo/enterprise#97335 Forward-Port-Of: odoo/enterprise#97199
4 changes
Enhancements to existing features
Refreshing UrbanPiper webhooks from the settings now also disconnects products from the point of sale before publishing a fresh menu. This helps ensure UrbanPiper receives an up-to-date menu and reduces mismatches between Odoo and the delivery platform.
Original PR description
Following this commit: - On refreshing webhooks from settings, products will be unlinked from pos. - Fresh menu will be updated to Urbanpiper platform task-5163764 Forward-Port-Of: odoo/enterprise#97000
Resolved issues and error corrections
A broken Export Payslip action in Payroll is disabled because it led users to a Page Not Found error. This prevents confusion when viewing payslips, especially in debug or superuser mode, without affecting normal payroll processing.
Original PR description
Steps to reproduce: ------------------------- 1. Install `hr_payroll` module 2. Enable debug mode and click on Become Superuser 3. Go to All Payslips and open any payslip record 4. Click on the…
Steps to reproduce: ------------------------- 1. Install `hr_payroll` module 2. Enable debug mode and click on Become Superuser 3. Go to All Payslips and open any payslip record 4. Click on the Export Payslip button Observation: ------------------------- A 404 (Page Not Found) error appears when clicking the Export Payslip button Issue: ------------------------- The button triggers the route `/debug/payslip/<id>`, which was removed in the following commit https://github.com/odoo/enterprise/commit/57969bcaf876a13c36794adeb47e0da938e297ad#diff-0105b1a6a9e742e7eeaf7cc727745ebd3932177378d46332d4ca854f931b3359 The route was never reintroduced afterward, but the Export Payslip button remained in the view. As a result, clicking it leads to a 404 error Solution: ------------------------- 1. Temporarily bypass the `action_export_payslip` function. 2. Remove the Export Payslip button from the XML in the master forward port branch, as doing so does not impact any existing customizations relying on that button opw-5115946 Forward-Port-Of: odoo/enterprise#97361 Forward-Port-Of: odoo/enterprise#96359
Error messages for US payroll and payment processing now use the same bank field label that users see on the form. This helps users quickly identify the missing or incorrect bank information needed to complete payroll or NACHA payments.
Original PR description
The label shown in the res.partner.bank form view depends on the show_aba_routing field. If we don't show the correct label in these error messages it's not clear to the user what field they have to fill. task-5052996
Swedish Bankgiro and Plusgiro accounts are now handled correctly when generating SEPA payment files and Peppol invoices. This prevents missing bank details in payment exports and helps ensure Swedish invoices meet required electronic invoicing rules.
Original PR description
… number Bankgiro and Plusgiro accounts in Sweden normally do not have a BIC. However, for Peppol BIS 3 invoices, a BIC tag is required in the XML. The existing _skip_CdtrAgt logic prevents…
… number Bankgiro and Plusgiro accounts in Sweden normally do not have a BIC. However, for Peppol BIS 3 invoices, a BIC tag is required in the XML. The existing _skip_CdtrAgt logic prevents _get_CdtrAgt from being called when no BIC is set, causing the clearing_number to be missing in SEPA payment files for Bankgiro and Plusgiro accounts. This commit introduces overrides for SE-specific account types: _get_cleaned_bic_code: Returns 'SE:Bankgiro' or 'SE:Plusgiro' for Swedish Bankgiro and Plusgiro accounts, ensuring a BIC is present for the invoice XML. _skip_CdtrAgt: Returns False for Bankgiro and Plusgiro accounts to ensure _get_CdtrAgt is called, including the clearing number in the payment file. This guarantees that SEPA payment files and Peppol BIS 3 invoices for Sweden are generated correctly while preserving standard behavior for other banks and countries. Backport of https://github.com/odoo/enterprise/commit/0534491bcd7eed7d246bea85d6ac217a80af815b Forward-Port-Of: odoo/enterprise#97330
46 changes
Enhancements to existing features
Salary offers now open the employee record when the selected contract template is actually tied to an employee, instead of showing the contract template view. This makes navigation clearer for HR users and helps them reach the relevant employee information faster.
Original PR description
If the selected contract template on the salary offer is an employee record, then we souldn't open the contract template view, but instead open the employee view with the correct record selected. task-5082709
The German tax report has been reorganized after removing a previously used balance column. This keeps the report logic aligned with the new layout and helps ensure tax report results remain reliable for German localization users.
Original PR description
After removing the balance column, we need to refactor the code that depends on it task-5046641
Odoo Discuss channels and groups now record the user who created them as the owner, making ownership visible in the member list. Member permissions are tightened so users can only directly access their own membership details, improving privacy and control around channel data.
Original PR description
1. Add a new field to store the owner of a channel/group. The owner is the user who created the channel/group. Owner should have a special icon in the member list. 2. Modify the access rights of channel members: channel member can only read/write current user data ACL : is_self can do everything, others denied and use sudo whenever reading for others, or for writing Task-4107790
Point of Sale alert popups have been refreshed with a clearer design and more consistent, user-friendly wording. This helps cashiers and staff better understand warnings or required actions during sales, payments, printing, and localized fiscal workflows.
Original PR description
Task: [#5153312](https://www.odoo.com/odoo/project/1737/tasks/5153312) --- Created a new `PosAlertDialog` component that extends the existing `AlertDialog` with an updated design. Also revised alert messages across all POS modules to make them more user-friendly and consistent.
The helpdesk stage form now uses clearer wording for the time before a ticket is considered rotting. This makes the setting easier for users to understand by showing the value directly as a number of days.
Original PR description
**Specifications:** Change the label of `rotting_threshold_days` field and show days as a unit of measure in the form view. **After this PR:** 'Days to rot' -> 'Rotting in __ days' Task-5149031
ESG screens and reports now use shorter field labels by removing repeated unit text where users already know the context. Several views were also reviewed and tooltips were added to make ESG data entry and reporting easier to understand.
Original PR description
This commit mostly removes the units displayed on field labels to have condensed labels since the unit is known by the ESG users. It also reviews some views and adds some tooltips. task-5138748
The barcode app interface has been refined to look cleaner and more consistent on mobile devices. The changes improve readability and prevent visual glitches such as content showing through, oversized shadows, cramped buttons, and off-center text.
Original PR description
This PR fixes a few design issues: - Adds a background to prevent underlying content from showing through - Deletes prominent box-shadows - Prevents the chatter buttons from shrinking - Centers the…
This PR fixes a few design issues: - Adds a background to prevent underlying content from showing through - Deletes prominent box-shadows - Prevents the chatter buttons from shrinking - Centers the text on mobile task-5113549 PR-commu: https://github.com/odoo/odoo/pull/229542 | Before | After | |--------|--------| | <img width="407" height="577" alt="footer-bg-avant" src="https://github.com/user-attachments/assets/74c25c20-a119-4448-bbb5-0c5ee13eff57" /> | <img width="402" height="559" alt="footer-bg-after" src="https://github.com/user-attachments/assets/17533695-314c-4be7-b9b0-c290ff9fe144" /> | | <img width="409" height="581" alt="shadow-before" src="https://github.com/user-attachments/assets/b29b802a-68c3-4fc2-a327-8e62b2d9e2cd" /> | <img width="411" height="561" alt="shadow-after" src="https://github.com/user-attachments/assets/47add086-25b5-4612-969b-5bd60390e4f8" /> | | <img width="401" height="579" alt="log-note-buttons-before" src="https://github.com/user-attachments/assets/839ac7c8-18af-4270-a8c0-960c63cf68d5" /> | <img width="405" height="560" alt="log-note-buttons-after" src="https://github.com/user-attachments/assets/06577c82-2093-4ea8-b715-838ec9d0b623" /> | | <img width="402" height="574" alt="text-before" src="https://github.com/user-attachments/assets/70cabab3-b925-4a2a-8e2c-3936e4957e5a" /> | <img width="407" height="559" alt="text-after" src="https://github.com/user-attachments/assets/f172763c-5f93-47f8-8a68-9f0e991f38cd" /> |
Modules can now explicitly state when they use paid in-app services, instead of being labeled paid just because they depend on the IAP infrastructure. This helps avoid incorrectly marking free localization and integration modules as containing paid services.
Original PR description
Currently, we have a `has_iap` field on the `IrModuleModule` model which is used to display whether the module contains In-App Purchases, i.e. a paid service provided through IAP. However, this field is computed based on whether the module has an (indirect) dependency to the `iap` module. This is a bit too simplistic as relying on the `iap` module does not mean that the service is paid and consumes IAP credits. For instance, we have many EDIs modules now that rely on IAP, but that are totally free (e.g.: Malaysia POS, Spain POS, Switzerland Payroll, ...) To tackle this, we introduce a new field in the manifest: `iap_paid_service`. If set to True, we explicitely mark the module as a module that uses IAP credits, and therefore contains In-App Purchases. task-5048119
The Tasks button on Helpdesk tickets now uses the same checkmark icon as other task-related views. This makes the interface more consistent and easier for users to recognize when planning interventions.
Original PR description
Before this commit: --- The 'Tasks' stat button displayed in the Helpdesk Ticket form view (visible when planning an intervention) used a different icon than other task-related views, leading to inconsistency in the user interface. After this commit: --- The 'Tasks' stat button now uses the fa-check icon for consistency with the other views where similar buttons are used, providing a more coherent and clear visual appearance. task-5138828
Default working schedules for companies in India now use a 10:00 to 19:00 workday instead of 08:00 to 17:00. This better matches local business norms and reduces manual setup for Indian payroll configurations.
Original PR description
Currently, employee working hours in Indian companies are not aligned with local standards. The system default time range is, 08:00-17:00. This commit updates the configuration so that for companies located in India, the default working schedule reflects Indian working hours — 10:00 to 19:00. Task ID: 5158751
An information icon with guidance has been added next to the payslip period field. This helps payroll users enter the full and correct period, reducing confusion and potential data entry mistakes.
Original PR description
Added help text next next to payslip period so that the user enters the correct complete period Task-4996387
Work entries now show a file-text icon when a description is present, making details easier to spot in planning views. Automatically generated work entries are no longer pre-filled with descriptions, reducing unnecessary text and keeping records cleaner.
Original PR description
This PR aims to: - Add a file-text icon on pills with a description (with padding adjustments for file/lock icons) - Prevent generated work entries from being pre-filled with a description task-5026021
The point of sale integration for UrbanPiper now prepares order data directly from the order record instead of depending on a separate store service. This keeps the setup cleaner and makes the logic easier to reuse and maintain, with no expected change for day-to-day users.
Original PR description
**In this commit:** Move the `getOrderData` method to the `pos.order` model. This change allows the data preparation logic to be accessed directly via the model, avoiding reliance on the `pos_store` service. Task: 4827509 Related: https://github.com/odoo/odoo/pull/212748
UAE payroll now excludes unpaid leave and unpaid sick leave days when calculating end-of-service amounts and related provisions. End-of-service payslips also show the total unpaid leave days, giving payroll teams clearer and more accurate information.
Original PR description
This commit excludes the Out Of Contract Unpaid Leaves and Unpaid Sick Leave days from the EoS and EoS Provision Salary Rule Calculations. We also show the total number of unpaid leave days on the EoS payslip. task-4886104 Forward-Port-Of: odoo/enterprise#97063 Forward-Port-Of: odoo/enterprise#95465
Refreshing webhooks from settings now disconnects existing products from the point of sale before sending a fresh menu to UrbanPiper. This helps ensure the external ordering platform receives an up-to-date menu and reduces mismatches between Odoo and UrbanPiper.
Original PR description
Following this commit: - On refreshing webhooks from settings, products will be unlinked from pos. - Fresh menu will be updated to Urbanpiper platform task-5163764 Forward-Port-Of: odoo/enterprise#97000
POS users can now change whether a product is available for food delivery directly from the product information popup. This helps restaurants react faster to stock or kitchen constraints without leaving the POS workflow.
Original PR description
Before this commit: ------------------------- There was no way to change the food availability status of a product from the POS terminal. After this commit: ------------------------- Added an option in the POS UI product info popup to toggle the availability of products for configurations that support food delivery handling. Task: 4951476 Forward-Port-Of: odoo/enterprise#91681
Bank statement imports now choose the quickest reconciliation method based on file size. Small imports are reconciled immediately, while larger imports continue to run in the background to avoid slowing down the user.
Original PR description
When doing an import, to avoid taking too much time we decided to trigger the cron directly but for small files it's not really efficient. When the file has less than 80 statement lines we do the auto reconcile otherwise we trigger the cron. task-5162686 Forward-Port-Of: odoo/enterprise#97004
Resolved issues and error corrections
This update corrects an issue in account reports where some report calculations could use the wrong record context. The fix helps ensure financial report values are computed reliably and reduces the risk of incorrect report output.
Original PR description
Forward-Port-Of: odoo/enterprise#97144
Shipping label printing can now use a printer selected for each delivery operation type instead of automatically choosing the first available compatible printer. This helps warehouses route labels to the right printer by default, reducing manual work and printing mistakes.
Original PR description
Printing shipping labels is performed from the backend, once the shipping info are received in the chatter. The printing command is sent to the frontend via the user bus, then though longpolling to the iot box. This commit adds the possibility to select a printer instead of choosing automatically the first (with the right report associated) on the list. As the change is made on a stable version, we are using system parameters to store the selected printer without adding a new field. We associate a printer with the picking type, in order for to be able to have different printers by default on different picking types. Task: 4792491 Forward-Port-Of: odoo/enterprise#97034 Forward-Port-Of: odoo/enterprise#86818
Customer statement emails sent from a child contact now generate the correct PDF attachment instead of an empty statement. The Customer Statement button is also hidden when there are no transactions or no amount due, reducing confusion for accounting users.
Original PR description
**Steps to reproduce:** 1. Go to Accounting > Customers > create a company with child contact (invoice) (both having name and email). 2. Create an invoice with the child contact as customer and…
**Steps to reproduce:** 1. Go to Accounting > Customers > create a company with child contact (invoice) (both having name and email). 2. Create an invoice with the child contact as customer and confirm it. 3. Go to the child contact and open the Customer Statement smart button. 4. Download the PDF → data is shown correctly. 5. Send the statement → the attachment in the sent mail is empty. **Issue:** - When sending customer statements via email from a child contact, the generated PDF attachment contains no data, showing empty amounts and transactions. - Additionally, the "Customer Statement" button was still visible even when the total due was zero. **Cause:** - The button visibility condition checks for `total_due == 0.0 and not has_moves`, which didn’t properly cover all use cases. **Solution:** - Update button visibility condition to: `invisible="not has_moves or total_due == 0"` ensuring it is hidden when there are no moves or the total due is zero. **opw-5009182** Forward-Port-Of: odoo/enterprise#96017 Forward-Port-Of: odoo/enterprise#93162
This fix corrects how bank synchronization actions are triggered from the bank journal status area. As a result, customer-facing actions that previously failed to be sent should now work as intended.
Original PR description
The aim of this commit is fixing the usage of doActionButton. In this commit [[1]], we added two usages of doActionButton but it was wrongly done. It means, for a functional POV, that the action is never send to the customer. [1]: https://github.com/odoo/enterprise/commit/379f8bf0d9f55dda1998750fd5cbe48a2d84b00e
This update adds test coverage to ensure Indian GSTR-1 reporting handles sales involving reverse charge tax and SEZ supplies with LUT correctly. It helps reduce the risk of incorrect tax report submissions for businesses operating under these GST scenarios.
Original PR description
Adding GSTR1 test case with RCM tax and SEZ (with LUT) see https://github.com/odoo/odoo/pull/213931 Forward-Port-Of: odoo/enterprise#95669 Forward-Port-Of: odoo/enterprise#87486
Argentina VAT report exports now generate both required text files for Type C vendor bills and invoices without taxes. This helps businesses meet AFIP filing requirements and avoids incomplete report downloads.
Original PR description
…afip code '0' **Description of the issue/feature this PR addresses:** This PR addresses an issue identified in the generation of .txt files for invoices that utilize AFIP tax code '0' **Current behavior before PR:** The system is only generating one of the two .txt files required by AFIP for specific invoice types. Affected Cases: - Invoices of type 'C'. - Invoices that have no taxes. **Desired behavior after PR is merged:** Two .txt files should be generated for all invoice types, as per AFIP requirements. [HERE](https://app.screencastify.com/watch/2mtioGVxEOwW0rAHJS2v) is a video replicating the issue: 1. In localization Argentina, create a vendor bill type 'C' 2. In 'Tax Return' report, filter by date and 'Tax Type: Purchase' 3. Download .ZIP file and see only one .txt Forward-Port-Of: odoo/enterprise#96052
The AI assistant in the website builder now works correctly when used on product pages. This prevents a "Missing Record" error and lets users continue editing product descriptions without interruption.
Original PR description
__Current behavior before commit:__ Using `/ai` in the website builder sends the record id as a string leading to an error in the backend because `browse` expects an integer as input. __Description of the fix:__ Use `search` instead of `browse` to support id sent as string as well as to validate ACL and existence of the record. __Steps to reproduce the issue on runbot:__ 1. Go to `/shop`. 2. Click on a product. 3. Open the website builder. 4. Enter `/ai` in the description below the product title. => A "Missing Record" error appears. Forward-Port-Of: odoo/enterprise#95163
Shipping label printing through IoT can now use a selected printer for each picking type instead of automatically choosing the first matching printer. If a shipping label or document is printed without a linked IoT printer, users now receive a clear error message instead of a technical traceback.
Original PR description
Printing shipping labels is performed from the backend, once the shipping info are received in the chatter. The printing command is sent to the frontend via the user bus, then though longpolling to the iot box. This commit adds the possibility to select a printer instead of choosing automatically the first (with the right report associated) on the list. As the change is made on a stable version, we are using system parameters to store the selected printer without adding a new field. We associate a printer with the picking type, in order for to be able to have different printers by default on different picking types. backport of odoo/enterprise#86818 Task: 4792491 Forward-Port-Of: odoo/enterprise#97396 Forward-Port-Of: odoo/enterprise#95794
The Point of Sale settlement flow now handles cases where a previously loaded customer has been removed from the database. This prevents reload errors and helps keep PoS operations running smoothly after customer record cleanup.
Original PR description
Before this commit, if a previously loaded partner was deleted from the database, reloading the PoS would trigger an error because the partner record could no longer be found. opw-5137871 Forward-Port-Of: odoo/enterprise#97173 Forward-Port-Of: odoo/enterprise#96491
The AI live chat website block now behaves more consistently with website themes and editing tools. This improves the visitor experience with cleaner design, better readability, smoother fullscreen behavior, and stronger accessibility support.
Original PR description
Resolve theme options compatibility, editing behavior, accessibility and design problems affecting UX and standards compliance. Adherence to theme options: - Apply border-radius correctly to target…
Resolve theme options compatibility, editing behavior, accessibility and design problems affecting UX and standards compliance. Adherence to theme options: - Apply border-radius correctly to target elements - Fix bg-color applying to text-area instead of intended container Edition: - Remove resize/style options on the column since these are not retained on save - Fix the preview that mismatch with actual rendered result - Resolve title/form misalignment in edit mode - Ensure "OR" text readability across different background colors - Preserve container size when the "fullscreen" feature is activated Accessibility: - Add missing focus state for form fields - Add role="presentation" to icons - Add role="button" to anchor tags functioning as buttons Design: - Reduce oversized title font size - Adjust container width on xl and xxl breakpoints - Smooth fullscreen transition to prevent abrupt activation | 19.0 | this PR | |--------|--------| | <img width="1092" height="424" alt="image" src="https://github.com/user-attachments/assets/5cd85204-b9af-4810-9458-c4c96dad562d" /> | <img width="1083" height="409" alt="image" src="https://github.com/user-attachments/assets/b83f2d18-0135-4f5d-b420-11f58070c8a3" /> | task-5089787 Forward-Port-Of: odoo/enterprise#94767
The General Ledger now shows the Initial Balance line first when using the Load more option. This prevents missing or duplicated ledger entries when users load account lines in smaller batches.
Original PR description
### Issue: The "Initial Balance" line in the General Ledger is not the first line with the "Load more" option ### Steps to reproduce: - Accounting > Configuration > Accounting Reports > General…
### Issue: The "Initial Balance" line in the General Ledger is not the first line with the "Load more" option ### Steps to reproduce: - Accounting > Configuration > Accounting Reports > General Ledger - Change the Load more limit in the options to a small number, i.e. 4 - Open the General Ledger and unfold an account with more than 10 lines - There is no Initial Balance line, it appears when clicking "Load more" ### Cause: The General Ledger query have this line `ORDER BY 2, move_name, 1`. Here 2 refers to the date and 1to the `account_move_line.id`. But the initial balance line has these columns equal to `NULL` so this ORDER BY will place it at the end of the results. When the limit is smaller than the total number of lines, the initial balance is not fetched by the query. **Additional issue** The limit is incremented several times. In our case, we set the option at 4. It gets incremented [here](https://github.com/odoo/enterprise/blob/edb4ba5b98be9f9ae3617cc6e66c5e3376a1b56c/account_reports/models/account_report.py#L7172) because the load more option is triggered, and also [here](https://github.com/odoo/enterprise/blob/edb4ba5b98be9f9ae3617cc6e66c5e3376a1b56c/account_reports/models/account_general_ledger.py#L239) for no apparent reason (it is not needed "for the Initial balance"). So the query is called with `limit=6`, six lines are retrieved when clicking on "Load more". Considering a scenario where there are 10 lines for the account (with the initial balance) and "Load more limit" set to 4: - The first query gets the lines 1-6 but only 1-4 are displayed. - Clicking "Load more", the offset is 4, the query gets the lines 5-10. 10 being the initial balance, it is put in first position by [this piece of code](https://github.com/odoo/enterprise/blob/edb4ba5b98be9f9ae3617cc6e66c5e3376a1b56c/account_reports/models/account_general_ledger.py#L79-L91). So the lines displayed are 10, 5, 6, 7 - Last click on "Load more", offset is 8, query gets 9 and 10, displays 10, 9. In the end, one line is not displayed, and the initial balance is displayed twice. ### Solution: Add `NULLS FIRST` in `ORDER BY` to always have the Initial Balance as the first line returned by the query. Also remove the unnecessary `limit+1`. opw-5105652 Forward-Port-Of: odoo/enterprise#96136
Odoo Studio now avoids saving an invalid link setting when users create a related field pointing to partner child contacts. This prevents crashes during later field updates and keeps customized sales order forms more reliable.
Original PR description
On sale order, create a related field to res_partner.child_ids Before this commit, the related field is not stored but has a relation_field to parent_id (res.partner) During an onchange (outside of studio), this will crash. After this commit, we unset relation_field in this case as it doesn't make sense (the relation_field should reference a res.partner field, not a field presetn in the current model) opw-5155440 Forward-Port-Of: odoo/enterprise#97274 Forward-Port-Of: odoo/enterprise#96950
This fixes an issue in Point of Sale Enterprise that could cause an error when opening Studio from the preparation activity display. The change improves reliability for users customizing or managing the preparation display workflow.
Original PR description
This commit prevents a NewId to be used in a domain when opening studio from the activity display. runbot error #233396 Forward-Port-Of: odoo/enterprise#97332
SAF-T reports now show the required tax payable amount when reverse charge taxes are used, instead of reporting zero. This helps ensure Romanian tax filings match authority expectations and reduces the risk of incorrect compliance reporting.
Original PR description
When a reverse charge tax is used, we export a `TaxInformation` with a zero amount instead of the real amount of the tax. The tax authority requires to show the tax to pay and doesn't care about the tax to receive... In order to fix this, we only sum the tax details of lines having positive repartition lines. opw-5125678 Forward-Port-Of: odoo/enterprise#97315 Forward-Port-Of: odoo/enterprise#97117
Fixed an issue where opening the AI assistant from a blog record could show an error instead of starting normally. The system now checks for planned activities only when that type of record supports them, preventing disruption for website blog users.
Original PR description
Currently, an error occurs when the user clicks on the AI icon at the top. Steps to Reproduce: - Install the `website_blog` module. - Go to `Website > Configuration > Blog > Blogs`. - Open any `blog`…
Currently, an error occurs when the user clicks on the AI icon at the top. Steps to Reproduce: - Install the `website_blog` module. - Go to `Website > Configuration > Blog > Blogs`. - Open any `blog` and click the `AI icon` at the top. `AttributeError: 'blog.blog' object has no attribute 'activity_ids'` This error occurs after [this commit]. When the user clicks the AI icon, it attempts to create an AI channel and fetch planned activities if any exist. However, the blog.blog model does not have the activity_ids attribute because it does not inherit from mail.activity.mixin. As a result, the error is raised [1]. This commit ensures that the system only checks for activities if the record has the activity_ids attribute; otherwise, it returns empty data, indicating no activities found. [1]- https://github.com/odoo/enterprise/blob/64fa9e46f6195bd4312130cce33b94a129584523/ai/models/mail_thread.py#L12 [this commit]: https://github.com/odoo/enterprise/commit/7333dc779c75479c708edb7ecd1c0a0d4d2ae619 sentry-6942245851 Forward-Port-Of: odoo/enterprise#97136
Project portal users can now use a back button from the shared project Gantt view. This makes navigation easier and reduces friction when moving between shared project information and the portal.
Original PR description
Currently, project portal users cannot easily navigate back from the project portal view.This commit adds a back button in the gantt view of project sharing to improve navigation. Also, the project sharing gantt view is added in this commit- https://github.com/odoo/enterprise/pull/80545/commits/daaea2742a9ee786045ea805941eb3e8374c99d1 task: 5075423 Forward-Port-Of: odoo/enterprise#95461
Fixes a bank reconciliation issue where choosing a write-off account with a default tax could remove an already matched bill or invoice. Users can now add the account without losing existing reconciliation work, reducing manual rework and errors.
Original PR description
In the Bank reconciliation widget, users can click a button to set the account to write off the remaining balance. However, if the chosen account has a default tax set, the widget will lose any existing matches with invoices. Steps to reproduce: - Have an account with a default tax - Create a bill with a total - Create a bank statement for a greater amount - Open the bank reconciliation widget - In the created statement, first add the bill, then click 'Set Account,' and choose the account with tax Issue: Bill matching will be lost. This occurs because we remove and recreate the matching line, but we don't keep the line to be reconciled. opw-5002624 Forward-Port-Of: odoo/enterprise#96006
Spreadsheet pivots now let users drill into related fields even when a dimension is already selected, while still preventing duplicate selections of the exact same dimension. Date and datetime fields can also be selected again with different granularities, making analysis by day, month, or year more flexible.
Original PR description
Before this commit: - Once a dimension (e.g, 'Customer') was selected in a pivot, it could not be used for drilling into related fields, preventing cross-model exploration. - Date and datetime fields could not be re-selected to use different granularities (day, month, year, etc.). After this commit: - The pivot forbids re-selecting the exact same dimension but still allows users to drill and select fields from related models. - Date and datetime fields remain selectable to allow choosing different granularities, improving flexibility in pivot analysis. Task: [5114511](https://www.odoo.com/odoo/2328/tasks/5114511) Forward-Port-Of: odoo/enterprise#95898
Uruguayan electronic invoices now include zero-value lines in the official CFE submission as free delivery items. This prevents missing invoice details when reporting free products, deliveries, or fully discounted lines to the tax authority.
Original PR description
## Description of the issue The client wants to register 0.0 line to the CFE (delivery line with price 0.0): based on our findings, the only way to report lines with 0 values to the DGI is by…
## Description of the issue The client wants to register 0.0 line to the CFE (delivery line with price 0.0): based on our findings, the only way to report lines with 0 values to the DGI is by configuring the line as a "free delivery." (invoice indicator 5). But this lines is not been reported as part of the CFE xml (neither as a Free Delivery line or discount ## Steps to reproduce 1. Create a Uruguayan electronic invoice (sales default journal on a UY company) 2. Add a line with quantity 1. price 0 3. Add a second line with quantity 1, price 500 and discount 100% ## Before this PR 1. if we have a line with price unit != 0.0 but with total price of the line 0.0 (as the second line), then we are reporting the invoice line as Free Delivery. 4. But, If we have an invoice with line with price unit 0.0 (example first line) then is not being informed in the CFE at all ## After this PR Both lines are informed to DGI using the invoice indicator 5 (Free Delivery) You can check this on to generate CFE XML in demo mode (not need to connect to UCFE) If you want more visual example please connect to UCFE in testing enviroment and check the generated PDF file. References [Odoo task](https://www.odoo.com/odoo/project/967/tasks/5015691) LATAM 1350 / ADHOC task 53445 Forward-Port-Of: odoo/enterprise#89808
This fix removes now-unnecessary extra request details from a database API call after the underlying service was corrected to handle them automatically. It reduces redundant handling in the database synchronization flow without changing expected user-facing behavior.
Original PR description
Since odoo/internal#3823 the `ids` and `context` arguments erroneously became mandatory on the SaaS `/json/2/<__model__>/<__method__>` route, as the override was missing default values. Since odoo/internal#3830 added these default values, there is no need to add these arguments any more, and this commit removes them from the method BaseApi:post_json2 of the databases module. Task-id: none Forward-Port-Of: odoo/enterprise#97098
Creating a vendor bill from an IRN now correctly looks for a purchase journal across all companies in the tax unit, not just the main company. This prevents bill creation failures for multi-company tax units when the main company lacks a purchase journal.
Original PR description
Before this PR: - The system searched for a purchase journal only in `company_id`. - In a tax unit with multiple companies, if the main company had no purchase journal configured, record creation failed with a 'NOT NULL constraint violated' error. After this PR: - The journal search now checks all companies in `company_ids` (or falls back to `company_id`), - allowing the system to find a valid purchase journal across the tax unit. Forward-Port-Of: odoo/enterprise#97255
This fix ensures several company name and address fields in French VAT report submissions are filled within ASPOne's required length limits. It helps prevent rejected or invalid XML-EDI filings caused by values that are too long.
Original PR description
The aim of this commit is making sure that the field Designation, DesignationSuite1, DesignationSuite2, AdresseVoie and AdresseComplement are correctly filled. Indeed, the XSD implied that these fields have to be respectively 35, 35, 35, 30 and 35 characters max. [Documentation 2025](https://www.aspone.fr/files/tutoriaux/xmledi/Documentation_XML-EDI.zip) no task id Forward-Port-Of: odoo/enterprise#97335 Forward-Port-Of: odoo/enterprise#97199
This fix ensures Mexican electronic invoice XML attachments are created with the correct file type even when the user has limited permissions. It prevents related accounting documents from being missed when document centralization is enabled.
Original PR description
When creating an XML attachment as a user without Write access on the ir.ui.view model, the Mimetype will be set to plain/text. In particular, this causes issues when Accounting centralization is enabled in Documents, as the corresponding Document will only be generated if the Mimetype is application/xml. Creating the XML as Superuser avoids this issue. Similar to https://github.com/odoo/odoo/pull/124507 opw-5057038 Forward-Port-Of: odoo/enterprise#97325 Forward-Port-Of: odoo/enterprise#95197
Features or functions removed from Odoo
This change removes leftover files from a previously deleted HR contract spreadsheet dashboard module. It prevents inactive, incomplete module artifacts from lingering in the codebase, reducing maintenance noise without affecting active business features.
Original PR description
Module was originally removed by 46052c4bc5ad1bd2549a6125202e0671b56beac8 but was necromantized back into unlife by the translations export 0c1874473050f6e3cb68601737e3b4216aee5cad, being revived as a directory with a data file and a translation file but no manifest. Forward-Port-Of: odoo/enterprise#97326
Code cleanup and technical improvements
IoT system-related helper code was reorganized into a dedicated system file to make future maintenance easier. This reduces internal complexity and helps developers add new IoT utilities with less risk of code conflicts, without changing expected user behavior.
Original PR description
To reduce the size of the helpers file, and avoid struggling with circular imports when trying to add new utilities in system.py, we moved all system utilities to system.py file. Community PR: odoo/odoo#230735
The spreadsheet code has been reorganized so the calculation model is separated from the screen display logic. This prepares spreadsheets to run without a visible interface, such as on servers or in background workers, improving future flexibility and scalability.
Original PR description
One day we have a simple repo that does everything,
The next the repo has 2 packages:
- packages/o-spreadsheet-engine that contains the spreadsheet model and all the plugins
- src that contains all the components that shows the spreadsheet on screen and the rendering logic in general
The goal of the change is to be able to load the Model in headless mode, in nodejs and eventually in a webworker
Task: 4179627This update modernizes how many Odoo Enterprise apps read and save system configuration settings. It should not change day-to-day behavior, but it makes the underlying code safer and easier to maintain across accounting, banking, AI, and related features.
Original PR description
community: https://github.com/odoo/odoo/pull/223180 upgrade: https://github.com/odoo/upgrade/pull/8647 documentation: https://github.com/odoo/documentation/pull/15077
The sales commission area no longer shows a redundant forecast configuration option or unused forecast views. This makes the settings and reports cleaner while keeping forecast fields available when users choose to display them.
Original PR description
Before: - A setting existed to toggle forecast display, but most forecast fields were already optional, making the setting ineffective. - Some views linked to the sale.commission.plan.target.forecast model was unused. - The `Achievement Forecast` setting in res.config.settings was present but served no real purpose. - In pivot view under measures forecast field is default selected. After: - Removed the now-redundant forecast setting. - Deleted unused views tied to the forecast model. - All forecast-related fields remain optional for display directly in the view. - Removed the unused “Achievement Forecast” config option. - Forecast field in not default selected in pivot view Impact: - Simplifies the codebase by removing dead settings and views. - Ensures cleaner configuration and UI behavior. - Easier to maintain and understand for future updates. task-4903751
This update streamlines how WhatsApp discussion messages determine whether they can be translated. It is an internal cleanup that should make the messaging code easier to maintain without changing the user experience.
Original PR description
https://github.com/odoo/odoo/pull/232128
31 changes
New functionality added to Odoo
Adds localized accounting reports for Sri Lanka, including balance sheet and profit and loss reporting. This helps Sri Lankan businesses use Odoo with reports aligned to local accounting needs and improves report structure and balancing.
Original PR description
Implement a basic accounting package for Sri Lanka including: - COA - Tax groups - Taxes - Fiscal Positions - Tax reports (VAT001, WHT001) task-4352802 retargeted from master #224917
Enhancements to existing features
Small bank statement imports are now reconciled immediately, while larger imports are still processed in the background to avoid delays. This improves responsiveness for everyday small imports without slowing down heavier accounting workloads.
Original PR description
When doing an import, to avoid taking too much time we decided to trigger the cron directly but for small files it's not really efficient. When the file has less than 80 statement lines we do the auto reconcile otherwise we trigger the cron. task-5162686
Payroll users can now view and manage contract offers directly from the employee form without needing recruitment permissions. This improves day-to-day payroll workflows by giving the right teams access to offer information where they need it.
Original PR description
Previously, the "Offers" smart button on the employee form was only available to recruitment users. This limited visibility for payroll officers who also need access to contract offers. This commit: - Changes the button visibility to `hr_payroll.group_hr_payroll_user` in `hr_employee_views.xml`. - Adds missing access rights in `ir.model.access.csv` for `hr.group_hr_user` (inherited by payroll users). - Updates the module manifest to include the new security CSV. The goal is to ensure payroll users can access and manage offers directly without requiring recruitment rights. task-5085078
The German tax report has been reorganized to better match the official ELSTER VAT return structure. This makes the report easier for German businesses and advisors to review and align with expected filing categories.
Original PR description
Rework the structure of the German Tax Report according to the very well detailed structure https://sevdesk.de/ratgeber/buchhaltung-finanzen/ustva/formular-elster/ task-5046641 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The German tax report has been reworked after removing a balance column, ensuring the report logic continues to match the new layout. This helps maintain accurate German tax reporting and reduces the risk of reporting issues after the layout change.
Original PR description
After removing the balance column, we need to refactor the code that depends on it task-5046641
Resolved issues and error corrections
This fixes several inventory costing issues so stock values better reflect actual quantities, locations, and recent cost corrections. Businesses should see more reliable FIFO/average cost calculations, valuation reports, and cost of goods sold figures, with expanded tests to reduce future regressions.
Original PR description
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
Closing a session from a kiosk configuration now behaves like the dashboard Close Session button instead of opening the point of sale interface. This prevents staff from being redirected to the wrong screen and makes kiosk session management more consistent.
Original PR description
Currently when you're on the config of a kiosk, the link `Click here to close the session` opens the session. This was never intended when we have a kiosk. Now, if we have a kiosk, when selecting this link it will close the session the same way it does when selecting the button `Close Session` on the dashboard. opw-5024837
This fix ensures date-based filters are converted using the daylight saving time rules for the date being searched, rather than the current date. This prevents records from being included or excluded incorrectly around seasonal time changes.
Original PR description
Description of the issue/feature this PR addresses:
When casting a date to a datetime during conversion of domains, we should take the DST of the date instead of now.
Current behavior before PR:
`[('dt_field', '>', '2022-01-01')]` uses the DST of now which may or may not be +1h.
Desired behavior after PR is merged:
`[('dt_field', '>', '2022-01-01')]` would use the DST of the given date.
runbot.build.error/232914
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fixes a point-of-sale rental test so it correctly uses an order quantity that remains visible after recent ecommerce payment filtering changes. It helps ensure paid online orders can still be handled reliably in POS workflows without test failures.
Original PR description
Because of https://github.com/odoo/odoo/pull/230809, it will cause the quotations/orders menu to filter out any sale orders which have an unpaid amount of 0. The test_rental_pos test tries to create a sale order with a quantity of 0 and then settle it in the POS, but because of the filter, the sale order will not show up in the menu causing the test to fail. This PR is to increase the quantity in the sale order to 1 so that the order shows up and the test can be executed properly. Task-5138081
The automated click testing tool will now avoid the Attendance onboarding menu because it opens a tablet-focused kiosk screen that the test cannot leave. This prevents false test failures and helps keep backend quality checks stable without changing the experience for regular users.
Original PR description
This commit blacklists the attendance Onboarding menu in clickbot since that menu redirects the user to kiosk app which is a custom app for tablet mode and so the clickbot cannot go back in backend when it enters in the kiosk.
Online orders that were already paid through ecommerce are now recognized correctly when opened in the Point of Sale. The POS will account for the existing payment or hide fully paid orders, helping staff avoid charging customers twice.
Original PR description
Before, if you paid for something on the website with ecommerce, it would create a sale order with a transaction linked to it, but no invoice. So in the POS the order would show up in the Quotation/Order menu, but the POS didn't have any reference on the payment, so you would have to create another duplicate payment. Now the amount_paid (which is the amount already paid in transactions) is taken into account when calculating what's left to pay in the POS. So anytime you open a sale order in the POS it should create a down payment line for anything already paid on the website (the same as we were already doing for invoices). Also to avoid double payments, now the sale orders which have been already paid in full, even if they are not invoiced yet, will not show up in the POS. The invoice can still be created normally from the Sale app in Odoo. Task-5138081 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix removes now-unnecessary extra information from database API calls after the underlying SaaS route was corrected. It reduces redundant handling in the databases module and helps keep synchronization behavior aligned with the platform defaults.
Original PR description
Since odoo/internal#3823 the `ids` and `context` arguments erroneously became mandatory on the SaaS `/json/2/<__model__>/<__method__>` route, as the override was missing default values. Since odoo/internal#3830 added these default values, there is no need to add these arguments any more, and this commit removes them from the method BaseApi:post_json2 of the databases module. Task-id: none
The online store no longer shows an “Undefined” label under a product name when a shopper selects a variant combination that is not available. This keeps product pages cleaner and avoids confusing customers during variant selection.
Original PR description
## Versions
19.0+
## Issue
"Undefined" is displayed under a product' name when selecting an unavailable variant configuration.
## Steps to reproduce
- Activate variants in the Settings' App;
- Create a product with 2 attributes ("A" and "B") and 2 values ("c" and "d") for each attribute;
- Click on the "Configure" button for attribute "A":
- Select the first value:
- Add an exclusion line applied on the same product and value "c" of attribute "B" ("B:c").
- Go to the product's eCommerce page:
- Select the unavailable configuration (A:c and B:c).
## Cause
A condition introduced on line https://github.com/odoo/odoo/blob/609ce29d5232707f7c6d05a7b82909cd3b09c75a/addons/website_sale/views/templates.xml#L2476 relies on `visible_tags` which is not defined because based on `product_variant.all_product_tag_ids` where `product_variant` is empty as the selected variant is archived.
opw-5145405The project setup test now prepares the milestones setting before the guided tour runs. This prevents test results from changing depending on whether demo data is installed, improving reliability without changing normal user workflows.
Original PR description
When running test_01_project_tour, the milestones feature is enabled on one of the projects. When doing so, if the project_milestone global option isn't enabled, it gets enabled automatically. When…
When running test_01_project_tour, the milestones feature is enabled on one of the projects. When doing so, if the project_milestone global option isn't enabled, it gets enabled automatically. When such a global feature is enabled while saving a project, the web client executes a reload_context action (see the onRecordSaved override in `@project/views/project_form/project_project_form_controller`). This is why the tour step that clicked on the save button got an `expectUnloadPage: true` attribute. However, when the demo data are installed, some projects are already created, including projects that have the milestones feature enabled. Therefore, the global option does not get enabled during the tour, and the page does not get reloaded in this case. With this commit, we enable the global option before running the tour, so that the behavior can be consistent between executions on databases where the demo data are or are not installed. Runbot-build-error-id: [232962](https://runbot.odoo.com/odoo/runbot.build.error/232962)
This fixes visual issues in the Mail chat message composer, especially in compact windows and on small screens. Text now aligns better, mention links no longer cause small layout shifts, and the composer stays within the visible screen area.
Original PR description
This commit fixes several HTML composer styling issues: - The HTML composer html did not align vertically with the text area when the chat window is in small UI mode. - The mention/redirect links had a border and causing slight layout shifts when applied to the composer. This is now fixed by using outline instead of border. - The maximum height of the HTML composer was not constrained on small screens, causing it to overflow the screen. This is now fixed by using a max-height relative to the viewport height. task-5022254 after: <img width="435" height="346" alt="image" src="https://github.com/user-attachments/assets/cfd309d6-f6a4-4d7c-8694-2a86504193e7" /> <img width="454" height="782" alt="image" src="https://github.com/user-attachments/assets/6ce924b6-9df7-4831-890d-59ec37ea18c9" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Mass mailing content now keeps dynamic placeholders in the correct position when a mailing becomes read-only after sending. This prevents unwanted line breaks and restores missing editor styling, so sent emails display as intended.
Original PR description
In editable fields, the Html Editor currently adds the data-oe-t-inline attribute to items that are identified as needing to be displayed inline However, this attribute is added by the editor and…
In editable fields, the Html Editor currently adds the data-oe-t-inline attribute to items that are identified as needing to be displayed inline However, this attribute is added by the editor and removed on save. As a result, if the editable body is ever set to readonly(for example: a mailing that is sent no longer allows users to edit its body), then the inline property appears to be lost: an inline dynamic attribute suddenly looks like it's on its own line. Steps to reproduce: - Create a mailing - Add a dynamic attribute in the middle of a line - Send the mailing - You will see a carriage return directly before and after the dynamic attribute Fix: The mass_mailing html field now applies the current inlining logic to readonly HTML. -- https://github.com/odoo/odoo/pull/229049 deleted several duplicated styles exclusive to the HTML builder from html_editor:common.scss, which were also present in qweb_plugin.scss. However, the mass_mailing html editor does not take into account this file to determine styles within the editor iframe (nor does it use any plugin in readonly mode.) To fix this, the missing styles are duplicated into mass_mailing, to be used in both editable and readonly modes. task-4852246
The Argentine VAT report export now correctly generates both required AFIP text files for type C invoices and invoices without taxes. This helps businesses submit complete tax reporting files and avoid missing-document issues with AFIP.
Original PR description
…afip code '0' **Description of the issue/feature this PR addresses:** This PR addresses an issue identified in the generation of .txt files for invoices that utilize AFIP tax code '0' **Current behavior before PR:** The system is only generating one of the two .txt files required by AFIP for specific invoice types. Affected Cases: - Invoices of type 'C'. - Invoices that have no taxes. **Desired behavior after PR is merged:** Two .txt files should be generated for all invoice types, as per AFIP requirements. [HERE](https://app.screencastify.com/watch/2mtioGVxEOwW0rAHJS2v) is a video replicating the issue: 1. In localization Argentina, create a vendor bill type 'C' 2. In 'Tax Return' report, filter by date and 'Tax Type: Purchase' 3. Download .ZIP file and see only one .txt Forward-Port-Of: odoo/enterprise#96052
The General Ledger now keeps the Initial Balance line at the top when users load account entries in smaller batches. This prevents missing or duplicated ledger lines and gives finance teams a complete, correctly ordered view of account activity.
Original PR description
### Issue: The "Initial Balance" line in the General Ledger is not the first line with the "Load more" option ### Steps to reproduce: - Accounting > Configuration > Accounting Reports > General…
### Issue: The "Initial Balance" line in the General Ledger is not the first line with the "Load more" option ### Steps to reproduce: - Accounting > Configuration > Accounting Reports > General Ledger - Change the Load more limit in the options to a small number, i.e. 4 - Open the General Ledger and unfold an account with more than 10 lines - There is no Initial Balance line, it appears when clicking "Load more" ### Cause: The General Ledger query have this line `ORDER BY 2, move_name, 1`. Here 2 refers to the date and 1to the `account_move_line.id`. But the initial balance line has these columns equal to `NULL` so this ORDER BY will place it at the end of the results. When the limit is smaller than the total number of lines, the initial balance is not fetched by the query. **Additional issue** The limit is incremented several times. In our case, we set the option at 4. It gets incremented [here](https://github.com/odoo/enterprise/blob/edb4ba5b98be9f9ae3617cc6e66c5e3376a1b56c/account_reports/models/account_report.py#L7172) because the load more option is triggered, and also [here](https://github.com/odoo/enterprise/blob/edb4ba5b98be9f9ae3617cc6e66c5e3376a1b56c/account_reports/models/account_general_ledger.py#L239) for no apparent reason (it is not needed "for the Initial balance"). So the query is called with `limit=6`, six lines are retrieved when clicking on "Load more". Considering a scenario where there are 10 lines for the account (with the initial balance) and "Load more limit" set to 4: - The first query gets the lines 1-6 but only 1-4 are displayed. - Clicking "Load more", the offset is 4, the query gets the lines 5-10. 10 being the initial balance, it is put in first position by [this piece of code](https://github.com/odoo/enterprise/blob/edb4ba5b98be9f9ae3617cc6e66c5e3376a1b56c/account_reports/models/account_general_ledger.py#L79-L91). So the lines displayed are 10, 5, 6, 7 - Last click on "Load more", offset is 8, query gets 9 and 10, displays 10, 9. In the end, one line is not displayed, and the initial balance is displayed twice. ### Solution: Add `NULLS FIRST` in `ORDER BY` to always have the Initial Balance as the first line returned by the query. Also remove the unnecessary `limit+1`. opw-5105652 Forward-Port-Of: odoo/enterprise#96136
Gift Card and E-Wallet products now appear in the Point of Sale even when the store is limited to selected product categories. This ensures staff can consistently sell these payment-related products without extra category setup.
Original PR description
Before this commit: =================== If the PoS configuration is restricted to specific categories, but the Gift Card and E-Wallet products do not have any category assigned, these products will not be visible in the PoS UI. After this commit: ==================== Gift Card and E-Wallet products are now always visible in the PoS UI, regardless of whether a PoS category is assigned or not. Purpose: ============ Gift Card and E-Wallet products should always be available for sale in the PoS. This ensures they can be sold physically from the PoS UI without requiring category assignment. Task-5103770 Forward-Port-Of: odoo/odoo#231626 Forward-Port-Of: odoo/odoo#228395
Electronic payments registered from an invoice will now keep the payment transaction connected to that invoice. This improves payment traceability and helps users see the full invoice-to-payment relationship correctly.
Original PR description
Steps to reproduce: - Create an invoice through Accounting app - Post the invoice - Register the payment using the "Register Payment" wizard with an electronic payment method. Description of the…
Steps to reproduce: - Create an invoice through Accounting app - Post the invoice - Register the payment using the "Register Payment" wizard with an electronic payment method. Description of the issue/feature this PR addresses: **The payment transaction was not being linked to the invoice for electronic payments.** To resolve this, I passed the current invoice IDs as context through action_register_payment in the account.move.line model. Then, I retrieved this context value in _prepare_payment_transaction_vals of the account.payment model to set the invoice_ids Many2many field. Current behavior before PR: The payment transaction is not linked to the invoice for electronic payments. Desired behavior after PR is merged: The payment transaction will be correctly linked to the invoice for electronic payments. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208520 Forward-Port-Of: odoo/odoo#197091
The Point of Sale due settlement flow now handles cases where a previously loaded customer has been deleted. This prevents reload errors and helps keep checkout and payment follow-up workflows running smoothly.
Original PR description
Before this commit, if a previously loaded partner was deleted from the database, reloading the PoS would trigger an error because the partner record could no longer be found. opw-5137871 Forward-Port-Of: odoo/enterprise#97173 Forward-Port-Of: odoo/enterprise#96491
The date picker now clearly shows when a date option is disabled and cannot be selected. This reduces confusion for users by making unavailable dates visually distinct after a previous interface change removed the default disabled styling.
Original PR description
In this commit fa3bfb0a696c20ae51cd0f37f737fcf211007c4a, the o_date_item_cell was changed from a button to a div. This made the style of disabled cells not show that its not unclickable, making it confusing for users. Solution is to add specific style for the disbaled o_date_item_cell component. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231562 Forward-Port-Of: odoo/odoo#231249
This fixes an issue in Odoo Studio where creating a related field to a contact’s child records could save incorrect relationship settings. The change prevents crashes during later form updates, making Studio-created customizations safer and more reliable.
Original PR description
On sale order, create a related field to res_partner.child_ids Before this commit, the related field is not stored but has a relation_field to parent_id (res.partner) During an onchange (outside of studio), this will crash. After this commit, we unset relation_field in this case as it doesn't make sense (the relation_field should reference a res.partner field, not a field presetn in the current model) opw-5155440 Forward-Port-Of: odoo/enterprise#97274 Forward-Port-Of: odoo/enterprise#96950
This fix restores a safer way for Odoo to identify manually created field names while avoiding unnecessary system work. It helps keep custom field behavior reliable without adding performance overhead.
Original PR description
The use of IrModelFields method `is_manual_name` was [reverted](https://github.com/odoo/odoo/pull/212579) for the sake of efficiency and avoiding instanciating models when not really needed. The use of an overridable method is still needed ([reference](https://github.com/odoo/odoo/pull/145154)). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224524
Fixes an issue where opening the website editor on the login page incorrectly marked the form as changed. This prevents confusion for editors by avoiding a false unsaved-change state, with no impact on normal visitor login behavior.
Original PR description
Before this commit, part of the `/web/login` page was immediately marked as dirty when the editor opened. This happened because `UserSwitch` component used a `t-portal` directive that rendered an element outside the `owl-component` tag, causing it to be tracked by the mutation observer. After this commit, the `t-portal` directive is ignored when in edit mode. A side effect of this solution is that the "Choose a user" button is hidden during editing, but this button was already non-editable and non-clickable during edit. **How to reproduce the problem** 1. Navigate to "/web/login" 2. Activate edit mode 3. The "o_dirty" class is present in the login form Forward-Port-Of: odoo/odoo#230602
Users can now create their first timesheet even if they do not have access to the company’s internal project. The system avoids selecting a project they cannot access by default, preventing an error and allowing the timesheet process to continue.
Original PR description
To reproduce: ============= - make the internal project of the company for invited internal users only - with internal user that doesn't have access to the internal project, and no previous timesheet created, try to create a timesheet - you get a traceback Problem: ======== when not having a previous timesheet, in the default value we set project_id based on the internal project of the company. But if the user doesn't have access to this project, it raises an access error. Solution: ========= check if the user has access to the internal project of the company, if not, use `False` as default value. opw-5119839 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229818
This update prevents a timing issue that could cause Odoo Discuss calls to fail while a peer-to-peer connection offer is being processed. It improves call reliability by ensuring delayed responses no longer use outdated connection information.
Original PR description
Before this commit, since https://github.com/odoo/odoo/pull/205198, the handling of an offer can be arbitrarily delayed by the `acceptOffer` callback. This could lead to a traceback when the reference to `peer` is stale by the time the event is handled. Forward-Port-Of: odoo/odoo#231620
Checkout progress labels are now translated correctly when shoppers use a website in another language. This improves the checkout experience for multilingual stores by avoiding English-only step names.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Have a website; 2. enable a new language (other than English); 3. use website in this language; 4. go to checkout. Issue ----- The checkout steps on the top-left aren't translated. Cause ----- Commit dbd22d93183f2 added the `website.checkout.step` model. Like `website.menu`, they have a default record that gets set on initialization, which is then gets used to create a new record per website. The issue is that when enabling a new language, it only translates the default records. The records that are website-specific remain unchanged. Solution -------- Because they function the same we as `website.menu`, we can use the same approach that was taken to translate website menus, and add a `_load_module_terms` override to `ir.module.module`, constructing a SQL query that copies the translations from the default records to the website-specific records. opw-4985676 Forward-Port-Of: odoo/odoo#223019
The sale product configurator now uses screen space better on mobile when optional products include custom attribute fields. This keeps the text input and cart button easier to view and use, reducing friction for shoppers on smaller screens.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Create a product attribute with a single custom value; 2. add the attribute to a product A; 3. set product A as an optional product of product B; 4. go to product B's product page in mobile view; 5. click on the cart button. Issue ----- The custom text field takes up way too much real estate. Cause ----- The template isn't fully adapted for mobile view. Solution -------- Change `d-flex` to `d-lg-flex` on the `ptal` element, making the attribute name & input online display in-line on large screens. Additionally, change some bootstrap classes to also have the cart button button displayed within the screen. opw-5114495 Forward-Port-Of: odoo/odoo#231744 Forward-Port-Of: odoo/odoo#230743
This fixes an issue that prevented certain related list-style fields from being created when no matching inverse link existed. It improves reliability for custom data models and reduces setup blockers for configurations that rely on related records.
Original PR description
…n_field Before this commit, it was not possible to create a related one2many without a relation_field (inverse) However, the relation_field of a relation cannot be the one of the original field (because it doesn't exist on the current model) After this commit, this flow works. opw-5155440 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231720 Forward-Port-Of: odoo/odoo#231187
Documentation and clarification updates
This pull request records that contributor arch-fan has signed the required Contributor License Agreement. This administrative update helps ensure future contributions can be accepted under Odoo's legal contribution rules.
Original PR description
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
4 changes
Resolved issues and error corrections
The project sharing customer preview now follows the same timesheet visibility rules as the actual portal. This prevents non-validated timesheets from appearing in previews when invoicing is limited to validated timesheets, reducing confusion for customers and staff.
Original PR description
Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is validated timesheets only. To reproduce: Cause: Fix: opw-5155281
The project sharing customer preview now matches the real portal view when billing is based only on validated timesheets. This prevents customers and staff from seeing draft or unapproved time entries in the preview, reducing confusion around billable work.
Original PR description
Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is validated timesheets only. To reproduce: Cause: Fix: opw-5155281 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
Vendor bills now correctly create and retain analytic items when posted, even if Auto-check on Post is turned off for the journal. This ensures accounting analytics remain complete and reliable for cost tracking and reporting.
Original PR description
**Issue** When unchecking the *Auto-check on Post* option on a vendor bill journal, analytic items are not created when posting the invoice, even if analytic accounts were set on the bill lines.…
**Issue**
When unchecking the *Auto-check on Post* option on a vendor bill journal, analytic items are not created when posting the invoice, even if analytic accounts were set on the bill lines.
**Steps to Reproduce**
1. Navigate to *Accounting > Configuration > Journals > Vendor Bills*
2. Uncheck *Auto-Check on Post*
3. Activate *Analytic Accounting* in settings
4. Create a vendor bill with one line and set analytic accounts
5. Post the entry
6. Navigate to *Accounting > Accounting > Analytic Items*
7. No analytic items are created
**Root Cause**
When `autocheck_on_post` is disabled, the `account.move` is still in draft during the `write({'state': 'posted'})` call. In `account.move.line.write`, the following logic runs:
```python
if not self.env.context.get('skip_analytic_sync'):
self.filtered(lambda l: l.parent_state == 'draft').analytic_line_ids.with_context(skip_analytic_sync=True).unlink()
```
At this point, analytic lines were already created, but since the parent move is still in draft, they get incorrectly unlinked. This leads to posted vendor bills without analytic items.
**Fix**
Introduce a posting_move context flag when posting moves. Skip the unlinking of analytic lines if the move is in the process of posting (context.get('posting_move')). This prevents the accidental removal of freshly created analytic lines.
Opw-5053179
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fix prevents Odoo from crashing when Documents references activities linked to records that have since been deleted, such as CRM leads. It improves reliability by handling missing records correctly instead of showing an error to users.
Original PR description
**Steps to reproduce:**
- Install `crm` and `documents`
- Go to CRM → Activity Types
- Set a 'folder' in the `Upload Document` activity
- Create a CRM lead and schedule an upload document activity
- Delete the created lead
- Open the Documents module
**Issue:**
- A `traceback` occurs because web_read tries to access all active records by `values_by_id[record.id]`, but some records are missing from values_list after `read_format` method filters out records with missing values.
- https://github.com/odoo/odoo/blob/3c62ca1eb96d571b2b686b5caee370324c589ab4/odoo/models.py#L3347-L3356
**Solution:**
- Use values_by_id.get(record.id, {}) to safely fetch values and avoid the KeyError.
opw-50801821 change
Enhancements to existing features
Estonia VAT XML exports now process report data in batches instead of recalculating each line separately. This prevents timeouts on large reporting periods and helps businesses submit VAT reports reliably even with high transaction volumes.
Original PR description
Behavior before: When exporting the VAT report to XML, each newly added line triggered a fresh _compute_expression_totals_for_each_column_group call. With large volumes of journal items, this…
Behavior before: When exporting the VAT report to XML, each newly added line triggered a fresh _compute_expression_totals_for_each_column_group call. With large volumes of journal items, this resulted in excessive repeated queries and, for big datasets, timeout errors. Behavior after: Introduced _custom_unfold_all_batch_data_generator, which batches the computation of expression totals for all lines. Now, journal items are resolved in bulk and mapped back to their respective moves, significantly reducing redundant queries. The VAT XML export completes successfully, even on months with very large datasets. Root cause: The Estonia VAT report was missing a batch unfold method (_custom_unfold_all_batch_data_generator). Without it, the system executed totals computation for each line individually instead of in batch, causing major performance degradation. Benchmark: | Period size (journal items) | Before patch | After patch | |----------------------------------------|----------------------|--------------------| | ~15k | 7s | 5s | | ~200k+ | Timeout error| 21s | opw-5046077