Daily updates from Odoo
Navigate
Branch
Wednesday, September 17, 2025
223 changes
1 change
Resolved issues and error corrections
EU OSS taxes now receive the correct Spanish tax classification when tax mappings are refreshed. This helps businesses using Spanish localization report cross-border distance sales correctly and reduces the risk of inaccurate tax records.
Original PR description
The EU OSS taxes were generated with the wrong l10n_es_type. - Install l10n_es and l10n_eu_oss. Then go to Settings and refresh the tax mapping in “EU Intra-community Distance Selling.” - In Taxes, filter by tax group containing “OSS.” All OSS taxes appear with l10n_es_type = sujeto. This is incorrect. The correct type should be “No Sujeto por reglas de localización” (see section 2): https://a3responde.wolterskluwer.com/es/s/article/version-3-05-del-moduloticketbai-batuz-de-a3erp-mejoras#OSS This commit adds the possibility of adding country specific field during the account_tax creation using chart_template -> fields mapping. opw-5009180 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227238 Forward-Port-Of: odoo/odoo#224192
67 changes
Enhancements to existing features
Demo manufacturing data for tables has been updated to match the new shopfloor workflow. Instead of one worksheet attached to an operation, each quality step now has its own worksheet, giving users a clearer and more consistent demo experience.
Original PR description
_* = quality_mrp_workorder, quality_mrp_workorder_worksheet Purpose: -------- With the new shopfloor design, worksheets are no longer defined at the operation level. Each step now has its own worksheet at the Quality Point level. The demo data of [FURN_9666] Table and [FURN_8522] Table Top has been updated accordingly to align with this design and provide users with a consistent experience. Before this commit: ------------------- The worksheet was attached at the operation level as a single PDF, with pages reused across different steps. After this commit: ------------------ Worksheets are now defined at the Quality Point level. Each step has its own dedicated worksheet, split from the original PDF and applied to the corresponding Quality Check. Relevant PR: https://github.com/odoo/odoo/pull/200345 Task: 5068250 Forward-Port-Of: odoo/enterprise#94081
GST return reconciliation now matches draft and cancelled vendor bills more reliably when they have a valid invoice reference or IRN. Posted bills continue to use stricter checks, helping reduce missed or incorrect matches during GST-2B reconciliation.
Original PR description
Before this PR: - `line_ids.tax_ids` filter was applied too early, excluding some valid draft/cancelled bills. - Bill reference and IRN checks were not consistently combined, leading to missed matches in reconciliation. - Posted bills could be incorrectly excluded when the reconciliation status was not considered properly. After this PR: - Refined domain grouping so `line_ids.tax_ids` and GST treatment checks only apply for posted bills. - Draft/cancelled bills are matched if they have a valid IRN or bill reference. - Posted bills require bill reference, tax, reconciliation status, and GST treatment checks for accurate matching. This ensures more reliable matching of draft bills with GST-2 B during the GST return period reconciliation. Forward-Port-Of: odoo/enterprise#94384
The web enterprise menu now stores cached data in a larger browser storage area instead of the more limited local storage. This helps reduce the chance of cache space issues and supports smoother navigation as other browser caches continue to use local storage.
Original PR description
This commit modifies the menu service so that it uses IndexedDB to cache data instead of localStorage. LocalStorage is more limited in size and is used by all other caches.
The Argentine localization now uses the new ARCA name instead of the former AFIP name across labels, references, documentation strings, and related electronic invoicing configuration. This keeps customer-facing fiscal terminology aligned with the renamed Argentine tax authority and reduces confusion for users working with local compliance flows.
Original PR description
Purpose: - The fiscal institution changed its name to ARCA. - That's why we substitute 'AFIP' (Administración Federal de Ingresos Públicos) by 'ARCA' (Agencia de Recaudación y Control Aduanero) everywhere in AR localization task-4986899 Forward-Port-Of: odoo/enterprise#91980
Mexican CFDI e-invoices are now generated so their totals match the validation method used by the SAT tax authority. This reduces the risk of rejected invoices by automatically handling rounding differences through discounts or an adjustment line when needed.
Original PR description
Simplify the CFDI generation. Now the totals are always computed from the lines. That way, it's impossible for the SAT to refuse a CFDI since it's built in the way the SAT checks the validity of the file. The difference between the CFDI total and the original documents is put using the discount if available. If not, we add a fake line in the CFDI. task-id: 4926200 Forward-Port-Of: odoo/enterprise#94602 Forward-Port-Of: odoo/enterprise#90434
The app menu search field now tells browsers and password managers not to offer saved entries. This avoids unnecessary Bitwarden popups and keeps the main menu experience cleaner for users.
Original PR description
Bitwarden pops up small form on top of the main menu for no reason. It is because of the hidden input created to trigger search when you type. Put `autocomplete="off"` to avoid these popups.
Dutch accounting users can now manually create corrective VAT declarations, known as suppletie, to amend a previous VAT return for the same period when allowed. Tax closings also clear prior tax lock date exceptions, helping prevent later entries from unexpectedly affecting closed VAT periods.
Original PR description
We add a new return type for a corrective VAT declaration (suppletie) using in the Netherlands. This allows users to manually create them to correct a previous VAT return in the same period under certain circumstances. task-4525909 Forward-Port-Of: odoo/enterprise#93327
Expense payment cards now appear more like real cards in the kanban view, making them easier for users to recognize at a glance. The update also corrects dark theme styling so theme-specific visuals do not affect the regular display.
Original PR description
This improves the kanban display to match more closely to the real one. In addition, it fixes the dark theme scss override being also loaded in the regular scss Forward-Port-Of: odoo/enterprise#94903
The bank reconciliation widget has been visually adjusted so labels and count badges appear less heavy. This makes the interface easier to scan without changing any accounting workflow or behavior.
Original PR description
During this commit:https://github.com/odoo/enterprise/commit/f9725d7b01cbd1235f022821a6861adb2955e49e We made some changes on the css of the bank rec widget. This commit will change: - The text weight of the labels is a bit too dark - The circle around the count on button was also a bit too dark task-5091753 Forward-Port-Of: odoo/enterprise#94906
Dark mode colors have been refined for bottom sheet elements so they remain clear and consistent. This improves readability and visual comfort for users working with dark mode enabled.
Original PR description
This commit adjusts the colors of the bottom sheet’s inner elements for dark mode. task-5087158 Requires: - https://github.com/odoo/odoo/pull/227230 Forward-Port-Of: odoo/enterprise#94783
Several country-specific Intrastat and UK reporting modules now use a shared default delay setting to calculate filing deadlines. This makes deadline handling more consistent and easier to maintain, with no expected change to day-to-day user workflows.
Original PR description
Forward-Port-Of: odoo/enterprise#94889
IoT Box records are now displayed alphabetically by name instead of by internal ID. This makes it easier for users to find the right device and improves day-to-day usability.
Original PR description
In order to improve user experience, we now sort IoT Box records by name instead of ID. Task: 5092660
Adds basic permission checks for AI-related models to help ensure internal users have the right access. This reduces the risk of access issues going unnoticed during future changes.
Original PR description
Purpose: --------- This commit adds a few basic tests to check model permissions. (the fix from the original commit about the ai.tool model is not forwardported as the model has been removed in 19.0 (replaced by server actions). Task-5064332 Forward-Port-Of: odoo/enterprise#94483 Forward-Port-Of: odoo/enterprise#93847
This update removes an outdated button layout setting from several Odoo screens to stay aligned with the newer Bootstrap 5 framework. Users should see no functional change, but it helps keep the interface maintainable and consistent across apps.
Original PR description
*: sign, stock_barcode, web_enterprise, web_studio This PR removes the `btn-block` utility Bootstrap class because it's obsolete since Bootstrap 5. task-4637091 PR-commu: https://github.com/odoo/odoo/pull/227114 PR-design-themes: https://github.com/odoo/design-themes/pull/1149
When a field service subtask is created, it now starts with the same warranty status as its parent task. This helps teams avoid manual updates and keeps service billing or warranty handling more consistent.
Original PR description
The subtask `under_warranty` will have a default value of the parent `under_warranty`. --- task-4830511
Resolved issues and error corrections
Appointment booking confirmation emails will now go only to the intended followers, rather than also being sent to attendees. This avoids unnecessary or confusing notifications while keeping internal teams informed when new appointments are created.
Original PR description
[1] introduces the new paradigm of always sending emails to "relevant recipients" which fetches emails and partners linked to the relevant record to send a message.
In appointment the "Appointment Booked" template is only meant to be sent to followers of `mt{_calendar,_appointment}_event_booked` to inform users that a new appointment was created even if they are not personally assigned to it.
`test_request_meeting_message_for_manual_confirmation` is also updated to represent the case of some visitor creating booking an appointment instead of using internal users for everything to better represent real use cases. Additionally each mail.mail record is extracted and checked individually to make sure we send the right contents to the right recipients.
[1]: 1dd6070ecaab385446cc2df7cad444f046812061
task-5075513
task-4711415
Forward-Port-Of: odoo/enterprise#94646
Forward-Port-Of: odoo/enterprise#94456The Studio AI field setup now requires users to choose a related record type when creating Many2one or Tags fields. This prevents incomplete field configurations from being saved and avoids crashes during field creation.
Original PR description
When adding an AI field of type Many2one or Tags, the Relation field was optional. If left empty, it caused a crash. This commit enforces that a Relation must be selected before confirming the dialog: - Add a red highlight if Relation is missing - Prevent field creation by returning early Task-5055796 Forward-Port-Of: odoo/enterprise#93873
Opening the duplicate transaction wizard directly no longer causes an error when no bank journal is linked. This prevents an avoidable interruption for accounting users and makes the view safer to access from administrative tools.
Original PR description
Currently, an error occurs when users try to open the view directly. Steps to reproduce: --- - Install `Accounting` module - Using Open View, Open `account.duplicate.transaction.wizard` view Traceback: --- `ValueError: Expected singleton: account.journal()` This error occurs because no account journal is linked to the wizard at [1], resulting in an empty `account.journal`. [1]- https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/account_online_synchronization/wizard/account_journal_duplicate_transactions.py#L32 sentry-6812500330 Forward-Port-Of: odoo/enterprise#94538
Mexican electronic invoice PDFs now use the same customer fiscal regime as the official XML file. This avoids confusing mismatches when invoicing a child contact whose parent company has a different fiscal regime.
Original PR description
In l10n_mx: - Create a child contact under a company contact. - Set the fiscal regime of the child contact to one different from the company’s fiscal regime. - Create an invoice with the child contact and send it to the CFDI. In the XML, the fiscal regime used is the company’s, whereas in the PDF it is the child contact’s. This commit applies the same logic from _add_customer_cfdi_values to the PDF generation. After this change, the fiscal regime shown in the PDF will be the company’s, consistent with the XML. opw-4989605 Forward-Port-Of: odoo/enterprise#94259 Forward-Port-Of: odoo/enterprise#92482
FedEx Home Delivery shipments can now generate return labels without triggering an address error. The fix ensures return label requests correctly mark the recipient address as residential, which FedEx requires for this service.
Original PR description
**PROBLEM** When selecting FedEx Home Delivery service, and enabling the return label generation, we got the error `RECIPIENT.ADDRESS.ERROR`. **STEPS TO REPRODUCE** 1. Install delivery_fedex_rest (use the new fedex credentials). 2. On the FedEx US shipment method (demo data) select FedEx home delivery service, and check the `Generate Return Label` option. 3. Create a SO, add shipping with FedEx US, validate the SO. 4. Validate the delivery order, and notice the FedEx API return an error. **CAUSE** For Home Delivery Service, the recipient address need to have the `residential` flag set to true. In `_return_package()`, the request sent doesn't include this flag, leading to an error. **FIX** Fix `_return_package()` query to include the `residential` flag. opw-4939065 Forward-Port-Of: odoo/enterprise#94463
When a new partner is created from bank reconciliation, the system now shows the correct receivable or payable button based on the statement amount rather than missing customer or supplier history. This prevents users from seeing the wrong payment action for newly created partners.
Original PR description
When creating a new partner from the set partner button, the partner doesn't have any rank (supplier or customer), this lead to have the payable button to be displayed since the condition to have it is to have a partner and not (customer_rank > supplier_rank). Since supplier rank and customer rank are 0 it will be False which lead to the button to be displayed. no task id Forward-Port-Of: odoo/enterprise#90435
Audit returns now correctly flag accounts for review when posted journal entries already exist in the audit period. Posting or resetting entries also updates the related accounts, helping teams avoid missed audit follow-up.
Original PR description
Before when we created an audit return with no previous audits, and moves already posted, nothing would be done. Now, we set to todo the accounts that were involved inside a move during the audit period. We also did the same logic when changes happen to a move. When we post or reset a move, we set to review to the accounts that was involved inside the move. Forward-Port-Of: odoo/enterprise#94559
This fix stabilizes an automated test related to the WhatsApp command palette so clicks happen only after the interface is ready. It helps prevent false test failures, improving confidence in release validation without changing user-facing WhatsApp behavior.
Original PR description
Before this commit, clicking on some elements of the command palette would not trigger the associated event, this was probably caused by clicking on outdated owl fragments which cannot trigger events while being destroyed. This commit fixes this issue by making sure that the interface is in a stable configuration before clicking. https://runbot.odoo.com/odoo/runbot.build.error/112148 Forward-Port-Of: odoo/enterprise#94075
The Barcode app now avoids showing a product description when it is identical to the product name. This reduces repeated information during receptions, making barcode operations clearer for warehouse users.
Original PR description
Steps to reproduce: - Create a product - Open the Barcode app - Create a new reception and add the product Issue: The description is displayed even though it's the same as the product name. Since in barcode we don't get the product's `display_name` with its code as they're treated separately, we need to reconstitute it to be sure it's not the same as the description in order to know if we want to display it or not. Task-4901289 Forward-Port-Of: odoo/enterprise#94623
Signed document emails now use each document's own name for attachments. This prevents duplicate-looking filenames and avoids adding an extra .pdf extension, making received documents clearer for customers and staff.
Original PR description
Steps to reproduce: 1. Install Sign. 2. Configure an outgoing email server. 3. Send a sign request for 2 or more documents to the admin (use your own email) 4. Open the email, sign and validate the documents. 5. You will receive an email. **Issue:** - You observe there are attachments in the email with same name and an extra `.pdf` as file extensions (e.g. `abc.pdf.pdf`). **Cause**: https://github.com/odoo/enterprise/blob/a1cd174c65fa181701cc3c5883fb5ab43b2803d8/sign/models/sign_request.py#L588-L594 - The code used `record` instead of the current `document` to determine the attachment name, causing the wrong generated name. **Solution:** - Use the `document` name when generating the attachment filename. opw-4965405 Forward-Port-Of: odoo/enterprise#92183
Bank reconciliation now better matches imported bank transactions with payments created in Odoo when payment provider memos differ slightly. This restores more flexible memo matching, reducing missed matches while keeping reconciliation easier for accounting teams.
Original PR description
Commit 4c23de148eb3689842a48df81a5ced772c214861 introduced another query to look for outstanding payments to match in the bank reco widget, aiming to reduce the number of wrong matches found by the algorithm. Doing so, limiting the match between account.payment initiated in odoo and their matching bank transaction imported (through stripe for example), on an exact match of the memo seemed like a good idea. But for obscure reasons, the memo we're sending is not guaranteed to be found back, depending on the payment provider and the import flow. Also, for backward compatibility, it now appears important to allow the match to be on a part of the memo, like we used to do. So we're back on a solution that splits the memo using ' - '. Forward-Port-Of: odoo/enterprise#93304 Forward-Port-Of: odoo/enterprise#93237
This fixes a problem that could prevent a payroll batch action from working correctly for Swiss payroll. The change restores expected payroll processing behavior by aligning the Swiss payroll customization with the standard action requirements.
Original PR description
Parameter was not added to the overriden method in switzerland Forward-Port-Of: odoo/enterprise#94461
The Documents app now consistently shows the Activities button in the chatter panel for every document, including files linked to other document types such as signing documents. This restores access to activity tracking and follow-up actions where the button was previously missing.
Original PR description
Step to Reproduce: - Install `Documents_sign` module - open Documents - click on 'info & tags` button on the top right corner to show chatter - Open 'Odoo CLA.pdf' document Observation: - The Activities button is not shown in Chatter. Issue: - after this https://github.com/odoo/enterprise/commit/a32825ee00f2b330d99113f4d8c1488903fe744e, the activities button shows only for those documents which are related to `documents.documents` model or a document has no model, but it should be shown for all documents https://github.com/odoo/enterprise/blob/23fb26ae0f91a5bdb74d0d4fce48b31fa7abef86/documents/static/src/views/kanban/documents_kanban_renderer.xml#L21-L26 Solution: - Remove condition for Kanban and list view to show `activities` button in Chatter opw-5013427 Forward-Port-Of: odoo/enterprise#94514 Forward-Port-Of: odoo/enterprise#93093
Users without administrator rights can now open return checks without hitting an access error. This fixes a permissions issue in accounting reports so day-to-day return review works reliably for standard users.
Original PR description
Before this fix, trying to open a return with a user not having the administration rights caused an access error. This was because the computation of that field tried to access the name of an ir.model record. Forward-Port-Of: odoo/enterprise#94759
Odoo Studio now uses an existing shared waiting utility instead of depending on a tour-only component. This avoids unnecessary loading behavior and helps keep Studio more reliable without changing the user experience.
Original PR description
HootDom is lazy loaded and necessary only in tours. Studio uses the waitUntil function, but it is also findable in macro.js in @web/core Forward-Port-Of: odoo/enterprise#94786
This fix stops Odoo from adding accounting lines for Brazilian Avalara taxes that are marked as non-accounting, preventing invoice totals from being overstated. The taxes are still logged for traceability, including in point-of-sale flows, so businesses keep an audit trail without affecting accounting amounts.
Original PR description
### Steps to reproduce: - Install l10n_br_edi, switch to Brazilian company - Set up Avalara - Create an invoice with the tax "ICMS Exemption Incl." which is included in price - Click "Generate taxes"…
### Steps to reproduce:
- Install l10n_br_edi, switch to Brazilian company
- Set up Avalara
- Create an invoice with the tax "ICMS Exemption Incl." which is included in price
- Click "Generate taxes" to compute the taxes with Avalara
- In "Journal Items" we can see a line for "ICMS Exemption Incl.", its value appears as excluded
### Cause:
The result from Avalara included a value for this tax:
```
'tax': 1.44,
'taxImpact': {
'accounting': 'none',
'impactOnFinalPrice': 'Included',
'impactOnNetAmount': 'Included',
},
```
But the untaxed amount is computed without this tax. Odoo keeps the untaxed amount from the response and add a line for the tax. As a result, the tax is added to the amounts like an excluded tax would.
### Solution:
In the response from Avalara, taxes with `['taxImpact']['accounting'] == 'none'` should be part of the accounting: no line should be created for this tax. So we filter them out in `_get_external_taxes`.
We also log these taxes in the chatter to keep a trace of them. As the parameter `'accounting': 'none'` is linked with the tax and not the line, if a tax on one line has `'accounting': 'none'` then the same tax will also have 'accounting': 'none' on all other lines. We use this to fetch all non accounting taxes, then we use the summary to construct the message like it was done before.
The logging in the bridge with pos needed to ba adapted because now the taxes may not be unarchived as they are ignored when they have `'accounting': 'none'`.
opw-4964315
Forward-Port-Of: odoo/enterprise#91916The US check printing feature now requires the correct US accounting component. This helps ensure the feature is installed with the accounting setup it needs, reducing configuration issues for businesses using US localization.
Original PR description
It should depend on `l10n_us_account`, not just `l10n_us`. Forward-Port-Of: odoo/enterprise#94801
Fixed an issue where users editing properties on products without a category could see a blank notification instead of a helpful warning. This ensures the intended message appears, reducing confusion during product setup.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Create a new product without a category; 2. try to edit properties. Issue ----- An empty notification appears. Cause ----- The `_getPropertyEditWarning` override in `account_asset` introduced by PR odoo/enterprise#87807 doesn't return the value of the `super` call. This was introduced in a forward port as the logic to display the warning was changed in `web` in saas-18.3, and not requiring a return value in previous versions. Solution -------- Return the `super` call. opw-4980006 Forward-Port-Of: odoo/enterprise#94583
Renamed spreadsheets now keep their chosen name when users create a new spreadsheet and then return through the breadcrumb. This prevents confusion from previously renamed files appearing as untitled.
Original PR description
Steps to reproduce: - Create a spreadsheet - Rename it to "My awesome spreadsheet" - Click on File -> New - Go back to "My awesome spreadsheet" from the breadcrumb => The spreadsheet is untitled. This was caused by the fact that the name was not saved in the local state of the action. Task: 4942117 Forward-Port-Of: odoo/enterprise#93163
Budget report entries are now limited to the companies a user can access. This prevents users from seeing budget-related entries from other companies and avoids access errors when opening report lines.
Original PR description
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Budget Management" - Go to "Accounting / Accounting / Analytic Budget" - Create a budget - Open the budget - Create a bill (or invoice depending on the budget type) using the analytic used in the budget lines - Create a budget from another company and also a bill using the analytic used in the budget lines - Connect with a user with Accounting rights who only has access to the first company - Go to "Accounting / Reporting / Management / Budget Report" - Switch to the list view - Remove the "Open Budget" filter **Issue:** The entries linked to the budget from the other company are visible. When trying to open one of them, an access error is raised. **Solution:** Add a multi-company record rule for budget report. opw-4943360 Forward-Port-Of: odoo/enterprise#94105
This fixes a demo data setup issue when Italian Ri.Ba. payments are installed alongside Stripe expenses. The demo bank partner now handles the extra bank journal created by Stripe expenses, preventing installation errors during demos or testing.
Original PR description
Steps: 1. Install `hr_expense_stripe` and activate demo data 2. Install `l10n_it_riba` 3. `l10n_it_riba` demo data install fails with an error Since [this commit](https://github.com/odoo/enterprise/commit/752ffcbcd0c33e2886aa7bcec469e16d3704d7a9), an additional bank journal is created on every company by `hr_expense_stripe`, and `l10n_it_riba` demo data only expects one. task-none Forward-Port-Of: odoo/enterprise#94437
Stamp fields in the Sign app are now editable during the signing process instead of being locked. Stamp text also displays cleanly in preview mode, helping documents look correct before they are sent or signed.
Original PR description
Version: - 19.0 Steps to reproduce: - Install the Sign app - Upload a PDF - Drag and drop a stamp field - Try to sign → the stamp is read-only and cannot be changed Issue: - The stamp field is readonly, so users can’t edit it when signing. Fixes: - Removed the constant value and the class that made the stamp field read-only. - Now, users can edit the stamp field normally. task-5082755 Forward-Port-Of: odoo/enterprise#94474
The spreadsheet sharing controls have been simplified to prevent errors while editing dashboards and avoid duplicate share options on mobile. Users now see sharing actions only where they are appropriate, making the experience clearer and more reliable.
Original PR description
Current behavior before PR: - Share button caused errors when editing dashboards. - Duplicate 'Share' and 'Freeze and share' buttons shown in mobile view. Desired behavior after PR is merged: - Hide share button in dashboard edit. - Remove duplicate share buttons in mobile (already under File -> Share). Task: [5043228](https://www.odoo.com/odoo/2328/tasks/5043228) Forward-Port-Of: odoo/enterprise#93464
The mobile template list in Sign now shows the template name as the main information instead of the creation date. This makes it easier for users to identify and choose the right template, while still keeping the creation date available as supporting detail.
Original PR description
### Issue: - In mobile view, the template list was showing the creation date instead of the template name. - This made it hard to know which template you were selecting. --- ### Fix: - Changed the mobile view to show the template name as the main info. - The creation date is still shown, but as extra information. --- ### Impact: - Easier to find the right template on mobile. - Mobile and desktop views now look consistent. --- Task: 5038933 Forward-Port-Of: odoo/enterprise#93072
This update fixes an issue in Odoo Studio where selecting a measure for a cohort view could trigger an error. It ensures users only see valid measure options and removes an unnecessary request parameter that caused warning messages.
Original PR description
Currently, an error occurs when user tries to select any measure in cohort view. Steps to replicate: - Install `sale_management` and `web_studio`. - Open the Sales app and turn on studio mode. -…
Currently, an error occurs when user tries to select any measure in cohort view. Steps to replicate: - Install `sale_management` and `web_studio`. - Open the Sales app and turn on studio mode. - Under the Views tab, turn on cohort view. - Under the Measures field, select any value and observe the error appearing in the terminal. Error: `ValueError: Invalid aggregate method 'None' for 'create_date:None'` Cause: - The Measure field dropdown in the Cohort Editor was mistakenly assigned the choices of `dateFields` [1] instead of `measureFields`. - This allowed users to select incompatible field types (e.g., date/datetime), which lead to error in aggregation behavior in the cohort view. Solution: - Corrected the choices of Measure field to `measureFields`. - Also added a condition to allow only those fields that have an aggregator (for some fields like `sequence` that dont have an aggregator). - Also removed context field from arguments [2] in the rpc call as function doesnt need it [3] (This shows warning on runbot as well). [1]: https://github.com/odoo/enterprise/blob/d8539dff5f3dcecfeb99fd7fc22a6915aaa02c4b/web_studio/static/src/client_action/view_editor/editors/cohort/cohort_editor_sidebar.xml#L30 [2]: https://github.com/odoo/enterprise/blob/bf9510e152279418200cb0becb6b637c19b02d4e/web_studio/static/src/client_action/editor/new_view_dialogs/new_view_dialog.js#L87 [3]: https://github.com/odoo/enterprise/blob/bf9510e152279418200cb0becb6b637c19b02d4e/web_studio/controllers/main.py#L805 sentry-6781792463 Forward-Port-Of: odoo/enterprise#94615 Forward-Port-Of: odoo/enterprise#91599
This fixes an issue where a Blackbox device could lose its existing setup after being unplugged and reconnected to an IoT box. The system now recognizes the same Blackbox by name and updates its connection details instead of treating it as a brand-new device.
Original PR description
Before this commit, if a blackbox was unplugged and re-plugged, and it was assigned a different serial port by the Raspberry Pi, it would show up as a new device in the database meaning the existing…
Before this commit, if a blackbox was unplugged and re-plugged, and it was assigned a different serial port by the Raspberry Pi, it would show up as a new device in the database meaning the existing configuration wouldn't work. After this commit, we handle the blackbox as a special case, and if the name of the device matches exactly with our existing blackbox, we update its identifier instead of creating a new device. This does require a new device specific check in the controller which is quite ugly. Another approach would have been to make the identifier of the blackbox equal its FDM ID instead of the serial port, but this was not done for the following reasons: - Changing the identifier format in stable would cause all existing clients' blackboxes to become unconfigured once their IoT box restarts. - Making the identifier different to the serial port would require a hack in the blackbox driver to change its own identifier and update the devices dictionary, since the serial interface assumes all devices use the port as their identifier. task-5055027 Forward-Port-Of: odoo/enterprise#93665 Forward-Port-Of: odoo/enterprise#93593
Quicksign now behaves consistently with regular signing by showing the completed signature in PDF previews and recording the signing activity in the related document history. This helps users trust that signed documents are properly displayed, tracked, and stored across Documents, Chatter, and Sign.
Original PR description
### Issues: - PDF preview mismatch: - Regular sign updates the preview in Documents with the actual signature. - Quicksign only shows placeholders in the preview. - Missing chatter logs: - Regular sign from chatter creates a 'Signature Request' log and stores the signed certificate in Documents. - Quicksign skips chatter logs and only displays in Sign app. ### Cause: - Request is fully signed but the sign request item state is not set as completed that's why the value was not shown. - The function to sign and create log is not called when reference doc is set. ### Fix: - Sign request item state is set to completed. - Called the function to throw log note when the reference doc is set. ### Impact: - Quicksign now provides consistent PDF previews. - Chatter history and document logging are aligned between regular signing and quicksign. --- task-5082925 Forward-Port-Of: odoo/enterprise#94544
This update fixes several issues in manufacturing work orders, quality checks, and barcode demo materials. It improves the reliability of barcode scanning and related production screen behavior, helping operators complete shop floor tasks with fewer interruptions.
Original PR description
Various fixes, mostly related to barcode scanning and some JS. task 5089956 Forward-Port-Of: odoo/enterprise#94838
This fix prevents an error when Shop Floor is set as a user’s default landing page. Users can now log in directly to the Shop Floor view without seeing a crash, improving reliability for manufacturing teams.
Original PR description
**PROBLEM** In debug mode, we can change the default home action of a user (the action he sees when logging in). When the action `action_mrp_display` is set as the home action, there is a traceback…
**PROBLEM** In debug mode, we can change the default home action of a user (the action he sees when logging in). When the action `action_mrp_display` is set as the home action, there is a traceback after logging in. **STEP TO REPRODUCE** 1. Go in debug mode 2. Change the home action of a user to the 'Shop Floor' action (in the user form, in the preference tab). 3. log out, and log in with this user. 4. a js traceback should appear. **CAUSE** In mrp_workcenter_dialog.js, the Shop Floor action uses the `menu` service to get the name of the current app. `setCurrentMenu()` which set the current app in the `menu` service is not called before the `appName` getter is called. https://github.com/odoo/odoo/blob/5c1234085b1c1e227846b24bde55a0392779069b/addons/web/static/src/webclient/menus/menu_service.js#L29-L36 This lead to a traceback because this.menu.getCurrentApp() is `undefined`. **FIX** Workaround if the current app is undefined. We already check what is returned by `getCurrentApp()` where it is used. opw-4926317 Forward-Port-Of: odoo/enterprise#94655 Forward-Port-Of: odoo/enterprise#93043
External tax report values are now protected from changes once the relevant tax period has been locked. The tax closing process was adjusted so required default values are created before the lock date is applied, helping preserve submitted tax data while avoiding normal closing errors.
Original PR description
[FIX] account_reports: external value check lock date This commit add the check that protects external values from being edited out of the lock date. For example when the tax report is submitted, the…
[FIX] account_reports: external value check lock date This commit add the check that protects external values from being edited out of the lock date. For example when the tax report is submitted, the user is not supposed to modify any external values anymore. To do this, we had to modify the tax closing flow a little bit: when closing the tax period, we now generate the default external values before setting the tax lock date. This is because the generation of the default external values was done for the period we were closing, but now that we forbid the creation of an external value after the lock date we had to change the order of the flow. Due to one specific corner case (l10n_fr), we had to keep a hack to bypass the Tax Return Lock Date check. This was done with a context key and will have to be removed in master. The case is the following : when the user generates the tax closing entry, the external values for the period are generated and the Tax Return Lock Date is set with the last day of the month. Then if the user tries to submit the EDI VAT report, it tries to create 2 external values for the carryover but as the lock date was set, it raises an error. task-5012442 Forward-Port-Of: odoo/enterprise#94853 Forward-Port-Of: odoo/enterprise#92949
Customers can now choose between a subscription plan and a one-time purchase even when a product has only one recurring plan. This prevents confusion on the webshop and helps ensure shoppers can select the purchase option that fits their needs.
Original PR description
Version: - 19.0 Steps to reproduce: 1. Create a product with only one recurring plan 2. Enable option 'one-time purchase' 3. On e-commerce it is not possible to select between the recurring plan and the one-time option Issue: - When a product has only one recurring plan and the 'one-time purchase' option is enabled, the recurring plan selection is hidden. Solution: - Updated the `subscription_pricing_select` logic to allow selection when 'one-time purchase' is enabled, even if there is only one recurring plan. Forward-Port-Of: odoo/enterprise#94760
Reloading shared customer pages now keeps users in the correct app menu instead of switching to another app such as Invoicing. This helps Sales, Accounting, and Purchase users stay oriented when different apps reuse the same customer-related screen.
Original PR description
* STEP TO REPRODUCE: install sale management module, go to sale app -> customer menu -> Then reloading the page using F5 -> the menu is change to invoice which is not correct * Also Multiple modules (Sale, Account, Purchase) share same actions (e.g. partner action) * SOLUTION: - Modified webclient.js action-to-menu mapping to handle multiple menus sharing same action Forward-Port-Of: odoo/enterprise#94822 Forward-Port-Of: odoo/enterprise#94485
The appointment booking page now shows the right number of people allowed based on the available or selected resource. This prevents customers from seeing an artificially low capacity when multiple resources have different limits, reducing booking confusion and missed capacity.
Original PR description
**How to reproduce:** - Create an appointment with availability assigned to a resource. - Enable 'Manage Capacity' - Set the capacity of the first resource lower than the second one. - Open the appointment's booking page. **Technical Reason:** If appointment is scheduled based on 'resource_time' then resource_default is updated as the first value of resource_possible. Related PR: https://github.com/odoo/enterprise/pull/47059 **After this PR:** 'Number of people' dropdown will display the maximum capacity from all available resources. Task-4664393 Forward-Port-Of: odoo/enterprise#94917 Forward-Port-Of: odoo/enterprise#84243
Postpaid subscriptions now correctly set the next invoice date to the start of the billing period when the plan is configured to align periods, such as the first day of the month. This helps ensure customers are billed on the expected schedule and reduces manual corrections for subscription teams.
Original PR description
Before this commit, when a subscription whose lines were all postpaid and the subscription plan was meant to align periods to first day of the period (e.g. first of the month), there was an issue at confirmation. The next invoice date was not put at the first day of the period in that case. Forward-Port-Of: odoo/enterprise#94746
Moving documents to another folder no longer removes access for members who had previously visited that folder. This prevents accidental loss of document access and keeps collaboration permissions consistent.
Original PR description
When moving documents with members to a folder which has been visited by those same members (or some of them) they are removed from those documents access. This is caused by the document.access which has an entry for the members but with a null role. Task-5075196 Forward-Port-Of: odoo/enterprise#94718 Forward-Port-Of: odoo/enterprise#94149
This change removes a broken upgrade step that could block customers from upgrading databases using Salary Package Configurator from Odoo 18.3 to 18.4 or later. The affected data handling is moved to the correct HR upgrade process, preventing upgrade crashes caused by a renamed contract table.
Original PR description
The `hr_contract` table is renamed to `hr_version` as part of the https://github.com/odoo/upgrade/blob/3bea30d1fd0cd202006da4ad11e00e283cbc78d0/migrations/hr/saas~18.4.1.1/pre-migrate.py#L29, script,…
The `hr_contract` table is renamed to `hr_version` as part of the https://github.com/odoo/upgrade/blob/3bea30d1fd0cd202006da4ad11e00e283cbc78d0/migrations/hr/saas~18.4.1.1/pre-migrate.py#L29, script, which is executed before any `hr_contract_salary` script, including module ones. As a result, any database from 18.3 to 18.4+ with `hr_contract_salary` < 2.1 will run into:
```
Traceback (most recent call last):
File "/home/odoo/src/odoo/saas-18.4/odoo/service/server.py", line 1410, in preload_registries
registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update'])
File "<decorator-gen-6>", line 2, in new
File "/home/odoo/src/odoo/saas-18.4/odoo/tools/func.py", line 89, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/saas-18.4/odoo/orm/registry.py", line 175, in new
load_modules(
File "/home/odoo/src/odoo/saas-18.4/odoo/modules/loading.py", line 455, in load_modules
load_module_graph(
File "/home/odoo/src/odoo/saas-18.4/odoo/modules/loading.py", line 181, in load_module_graph
migrations.migrate_module(package, 'pre')
File "/home/odoo/src/odoo/saas-18.4/odoo/modules/migration.py", line 220, in migrate_module
exec_script(self.cr, installed_version, pyfile, pkg.name, stage, stageformat[stage] % version)
File "/home/odoo/src/odoo/saas-18.4/odoo/modules/migration.py", line 257, in exec_script
mod.migrate(cr, installed_version)
File "/home/odoo/src/enterprise/saas-18.4/hr_contract_salary/upgrades/saas~18.3.2.1/pre-unarchive-partially-signed-offers.py", line 4, in migrate
cr.execute(
File "/home/odoo/src/odoo/saas-18.4/odoo/sql_db.py", line 426, in execute
self._obj.execute(query, params)
psycopg2.errors.UndefinedTable: relation "hr_contract" does not exist
LINE 4: FROM hr_contract c
^
```
As a fix, the query is moved into the `hr` script mentioned above.
see: https://github.com/odoo/upgrade/pull/8466
opw-5071923
upg-3121357
tbg-2136
Forward-Port-Of: odoo/enterprise#94931This fix removes a fragile test dependency in the website rental sales area that was causing automated runbot failures. It helps keep validation pipelines stable so future rental-related updates can be checked and delivered with less disruption.
Original PR description
runbot-error-232620 Forward-Port-Of: odoo/enterprise#94782
The salary configurator now shows the gross salary only when the active company is the Belgian company. This prevents Belgian payroll-specific calculations from affecting other companies and helps HR users see the correct salary information.
Original PR description
Gross Salary did not appear previously as the extending function _get_compute_results in 10n_be_hr_contract_salary was returning the l10n_be_wage_with_mobility_budget right away without checking which company we are in. This change made sure before proceeding that we are in the correct active company, Belgian one in our case. task-4987491
This fix updates automated tests so they match a newer rule for flexible employee scheduling. It helps keep planning, field service, project, and rental scheduling checks reliable without changing business features.
Original PR description
Several existing tests in `planning`, `project_enterprise`, `sale_renting_planning` and `industry_fsm` failed because the new constraint enforces that `work_entry_source`=`'calendar'` requires a `resource_calendar_id`. These tests are now adapted to use a different `work_entry_source` ('planning') for fully flexible employees.
task-5068798Salary offer previews now use the best available working-hours calendar instead of showing zero gross pay when a contract template has no working hours. This helps HR teams present accurate salary simulations when creating employee offers.
Original PR description
#### Steps to Reproduce In debug mode go to Payroll > Employees > Offers > Create a new offer with a contract template that has no working hours. The gross salary shown in the Salary Simulation Preview is 0. #### Issue If the version has no resource calendar, its working hours are 0. This sets the `work_time_rate` to 0, and when multiplied by the wage the gross becomes 0 as well. #### Fix Prioritize the version’s resource calendar when available, otherwise fallback to the offer’s calendar, and finally to the company’s. task-5051509
Accounting documents no longer show attachments from reconciled moves in the standard chatter by mistake. Those related attachments remain visible only in the bank reconciliation widget, keeping regular accounting records cleaner and less confusing.
Original PR description
Problem --------- In odoo/enterprise#85991, attachments from reconciled moves were displayed in the chatter along side the moves' attachments. This change was meant to affect only the bank reco widget. However, its scope reached the standard accounting behavior. STEPS --------- 1. Have 'account' installed 2. Create a move 3. Confirm and create the PDF attachment from the Send&Print 4. Create a credit note from it 5. Confirm the credit note -> The 2 moves are now reconciled and the PDF of the invoice is shown in the chatter of the credit note Objective --------- Only show reconciled moves' attachments in the bank reco chatter. Solution --------- Add a context key that is added when the Bank Reco widget is created and remove it when it is deleted. opw-####### Forward-Port-Of: odoo/enterprise#94661 Forward-Port-Of: odoo/enterprise#94442
Bookkeepers and other authorized users can now generate tax returns without needing permission to edit company records. The check now confirms they can view the company, preventing unnecessary blocks while still protecting company data from users without access.
Original PR description
Before:
When generating tax returns, the code checked for write access with `company.has_access('write')`. This could wrongly block users with Bookkeeper access right, who have the rights to generate returns but not to modify company records.
After:
The access check now uses `company.has_access('read')`, ensuring users with sufficient read access can generate returns while still preventing access for users without company visibility.
Forward-Port-Of: odoo/enterprise#94858
Forward-Port-Of: odoo/enterprise#94740This update fixes failing payroll localisation tests by ensuring an attendance-related overtime field is only included where the attendance module is available. This helps keep payroll localisation modules stable and reduces build failures without changing business functionality.
Original PR description
**Issue:**
The test_{xx}_contract_template_loading test fails across all localisations due to incorrect fields being passed.
**Cause:**
The issue occurs because the _get_whitelist_fields_from_template() method includes the overtime_from_attendance field, introduced in this https://github.com/odoo/enterprise/pull/92093. This field comes from the hr_work_entry_attendance module, which is not listed as a dependency in all payroll localisations. As a result, the field cannot be found during test execution.
**Solution:**
Remove the overtime_from_attendance field from all _get_whitelist_fields_from_template overrides in the localisation modules, and instead include this field by overriding the function in the hr_work_entry_attendance module.
build_error-231680
Forward-Port-Of: odoo/enterprise#94004Subscription invoices that include combo products can now be created and confirmed without triggering an accounting validation error. This prevents failures during both manual invoicing and automatic payment post-processing, improving reliability for subscription billing.
Original PR description
Currently, an error is produced while creating an invoice for a subscription order with combo products, and it can be triggered in two different ways. 1. Directly create an invoice. - Create and…
Currently, an error is produced while creating an invoice for a subscription order
with combo products, and it can be triggered in two different ways.
1. Directly create an invoice.
- Create and confirm a subscription with a combo product.
- Create an invoice for this subscription and try to confirm it.
- Validation error shown in display and error generated in log
2. When cron "Payment: Post-process transactions" trigger:
- Enable the Automatic Invoice option in the Subscription settings.
- Activate a demo payment provider (e.g. Demo: Payment Provider).
- Create and confirm a subscription that includes a combo product.
- Click on "Pay" to process the subscription payment.
- An error occurs when the above-mentioned cron is triggered, and it
tries to create an invoice for a subscription order.
Error: `new row for relation "account_move_line" violates check constraint
"account_move_line_check_accountable_....`
This issue arises during the creation of an account move line for deferred entries for
the 'Combo Product' column of the original invoice (subscription):
- At [1], `deferred_start_date` and `deferred_end_date` were added to all invoice line values within `_prepare_invoice_line` used to create the original invoice
- Then, at [2], during confirmation of the `original invoice`, the code attempts to generate `deferred entries` for for move where any move lines that has a `deferred_start_date`
- At code line [3], during the generation of deferred entries, an account move line is created without an associated `account_id`
- During `display_type` computation at [Code](https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/account/models/account_move_line.py#L480-L484), `line.move_id.is_invoice()` evaluates to `False`. As a result, the line is assigned a `display_type` as a 'product'.
- Since `display_type` is 'product' and `account_id` is missing, it violates the following check constraint at [Code](https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/account/models/account_move_line.py#L451): `CHECK(display_type IN ('line_section', 'line_note') OR account_id IS NOT NULL)`
This commit fixes the issue by preventing the addition of the `deferred_start_date` and `deferred_end_date` keys for invoice lines whose corresponding sale order lines have products of type 'combo' at [1].
[1]:- https://github.com/odoo/enterprise/blob/9642f7d8026149a6524e036c523b65ccbdf17258/sale_subscription/models/sale_order_line.py#L448-L449
[2]:- https://github.com/odoo/enterprise/blob/9642f7d8026149a6524e036c523b65ccbdf17258/account_accountant/models/account_move.py#L113-L114
[3]:- https://github.com/odoo/enterprise/blob/9642f7d8026149a6524e036c523b65ccbdf17258/account_accountant/models/account_move.py#L309
sentry-6763423503
Forward-Port-Of: odoo/enterprise#90989Quality checks now stay linked to the correct receipt when items are moved into a new wave transfer. This prevents staff from missing required checks on the new transfer or completing checks from the wrong receipt.
Original PR description
*{quality_control,stock}_picking_batch ### Steps to reproduce: - Got to Quality > Quality control > Control Point - Create a quality control point: - Operation: receipt - Control per quantity or…
*{quality_control,stock}_picking_batch
### Steps to reproduce:
- Got to Quality > Quality control > Control Point
- Create a quality control point:
- Operation: receipt
- Control per quantity or product
- Create a and confirm a receipt transfer with 2 products
- Go to the receipt list view > select your receipt > Wheel action > Add to wave > Add to a new wave > Add only one of the move line to the wave
#### > A new picking is created and the move line reassigned to it but the related quality check picking_id is not updated.
> In particular, there is no "quality check" button on the new picking and the "quality check" button of the first picking allows you to process a QC related to the wave transfer.
### Cause of the issue:
While the move lines or move are can be moved to a new picking during the `_add_to_wave` call:
https://github.com/odoo/odoo/blob/605e47a85561614c17fe2e6f59618610f87c69bb/addons/stock_picking_batch/models/stock_move_line.py#L69-L90 Nothing is done with respect to the quality check which pciking_id field is not computed:
https://github.com/odoo/enterprise/blob/d73f7ef6fe61ccddbe1fe4e32c1670611ba3c5d2/quality/models/quality.py#L185
### Fix:
While the quality check measured on move_line are linked to a move line, the quality checks measured on products and operation are not. For the first kind, we rely on an override of the write method of stock move lines to reassign the check to the apporpiate picking. For the other kinds, we add a post batch hook to unlink the obsolete checks and recreate the appropiate one. Note that since operation and product types are created during the action confirm of moves and since certain moves will be created and auto confirm during the new picking creation here: https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock_picking_batch/models/stock_move_line.py#L90 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L857 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L1263-L1267 https://github.com/odoo/enterprise/blob/b99d7073a34b24d4d3b863278e68f292fdd3c0b0/quality_control/models/stock_move.py#L12-L15 we rely on the `extra_move_mode` to avoid quality check creation during this step (as they will be created in the hook).
Community: https://github.com/odoo/odoo/pull/223852
opw-5009635
Forward-Port-Of: odoo/enterprise#93995
Forward-Port-Of: odoo/enterprise#92951A display issue in subscription payment forms was corrected so the “Secured by …” label can use the intended vertical layout. This helps keep payment method information presented cleanly and consistently for customers.
Original PR description
This PR aims to fix an issue where an xpath attribute was preventing from adding `.flex-column` to the "Secured by …" label under the payment methods. task-5081875 Requires: - https://github.com/odoo/odoo/pull/226453 Forward-Port-Of: odoo/enterprise#94884
Follow-up PDF reports now correctly handle attachments stored as remote links or in cloud storage. This prevents report generation failures and helps users produce customer follow-up documents reliably regardless of where attachments are stored.
Original PR description
### Issue PDF reports fail when attachments are remote URLs or cloud storage resources. The to_pdf_stream() method expects local file data but receives boolean values from remote attachments, causing a TypeError. ### Solution Download remote resources before processing them in PDF reports. This ensures all attachments have accessible data regardless of storage type. ### Affected Reports (enterprise): - account_followup.report_followup_print_all [Community PR](https://github.com/odoo/odoo/pull/226094) OPW-5036638 Forward-Port-Of: odoo/enterprise#94975 Forward-Port-Of: odoo/enterprise#94477
Features or functions removed from Odoo
This update removes an unused internal method from the accounting reports area. It has no expected impact on day-to-day reporting, but helps keep the codebase simpler and easier to maintain.
Original PR description
Forward-Port-Of: odoo/enterprise#94732
The Room module’s test setup was updated to stop relying on an old multi-tab service that has been removed elsewhere. This keeps enterprise tests aligned with the main platform changes and reduces maintenance of obsolete internal code.
Original PR description
The community counterpart of this PR removes the legacy multi tab service. This PR adapts the enterprise code to remove it from room's test helpers as well. task-4984247 community: https://github.com/odoo/odoo/pull/225124.
Code cleanup and technical improvements
This update makes internal test helper files available for manufacturing work orders and barcode operations. It helps keep automated checks reliable without changing day-to-day user workflows.
Original PR description
In this commit, we add tour_helpers file in manifest. Forward-Port-Of: odoo/enterprise#94150
The AI transcription connection has been updated to use the stable OpenAI realtime transcription API. This helps keep voice transcription features compatible with OpenAI’s supported service and adds clearer handling when unsupported AI providers are used.
Original PR description
This PR refactors the transcription connection to use the now stable version of the OpenAI realtime API for transcription. This also introduce typing for the realtime in the backend and errors when trying to use the LLMApiService with unsupported provider. Forward-Port-Of: odoo/enterprise#94574
Conversation avatars in AI and WhatsApp now use the correspondent’s avatar by default. This creates a more consistent and recognizable messaging experience for users without changing core workflows.
Original PR description
PR community: https://github.com/odoo/odoo/pull/227415
32 changes
Enhancements to existing features
This update standardizes how filing deadlines are calculated for Intrastat and UK reporting modules. It helps keep deadline settings easier to maintain and more consistent across supported localizations, with no expected change to day-to-day workflows.
Basic automated checks were added to confirm that AI-related data models enforce the expected access permissions. This helps reduce the risk of permission mistakes in future changes without changing day-to-day user workflows.
Original PR description
Purpose: -------- This commit adds a few basic tests to check model permissions. (the fix from the original commit about the `ai.tool` model is not forwardported as the model has been removed in 19.0 (replaced by server actions). Task-5064332 Forward-Port-Of: odoo/enterprise#93847
The stock product quantity button now shows the 'On Hand' wording consistently on both product variant and product template forms. This reduces confusion for users checking available inventory from different product screens.
Original PR description
The change made in #226916 only impacted the `product.product` form, instead of both the `product.product` and the `product.template` form. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The bank reconciliation widget has been visually adjusted so labels and button counters appear less heavy. This makes the interface easier to scan while keeping the existing workflow unchanged.
Original PR description
During this commit:https://github.com/odoo/enterprise/commit/f9725d7b01cbd1235f022821a6861adb2955e49e We made some changes on the css of the bank rec widget. This commit will change: - The text weight of the labels is a bit too dark - The circle around the count on button was also a bit too dark task-5091753
Resolved issues and error corrections
This fixes an error in the stock forecast view when the first displayed rows contain merged cells. Business users can now review product availability forecasts for affected products without the page failing.
Original PR description
Ensure correct initialization of lastIndex and mergeLinesData to also cover the case where line 0 is part of a merge. Current behavior before PR: - `Caused by: TypeError: this.mergesLinesData[lastIndex] is undefined` - `TypeError: Cannot read properties of undefined (reading 'rowcount')` Desired behavior after PR is merged: lastIndex and mergesLinesData[lastIndex] are correctly initialized on first line too To reproduce: On a product with OnHand quantity, create multiple SO so that the first cell of the first lines are merged. <img width="1896" height="230" alt="image" src="https://github.com/user-attachments/assets/d8eb550a-e9c8-4dbf-ade7-046f83b370ae" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Refreshing the page now preserves the correct menu context when different apps share the same underlying customer or partner action. This prevents users from being unexpectedly moved to another app menu, such as Sales changing to Invoicing, improving navigation consistency.
Original PR description
* STEP TO REPRODUCE: install sale management module, go to sale app -> customer menu -> Then reloading the page using F5 -> the menu is change to invoice which is not correct * Also Multiple modules (Sale, Account, Purchase) share same actions (e.g. partner action) * SOLUTION: - Modified webclient.js action-to-menu mapping to handle multiple menus sharing same action Forward-Port-Of: odoo/enterprise#94512 Forward-Port-Of: odoo/enterprise#94485
This fix prevents Odoo from adding a log note when an internal validation error occurs before a request is sent to ZATCA. It keeps invoice chatter cleaner and avoids confusing users with response logs when no external submission actually happened.
Original PR description
In a previous commit e90c35cde2a1f5de5d7bc4db7a525638ca3fab6e, we modified the logic of posting a log note when receiving a response from ZATCA to always log a note of the response. An issue occured because sometimes, Odoo raises user errors before sending a request to ZATCA, In which case, we do not need to log a note. Task-id: 5056724 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#226628 Forward-Port-Of: odoo/odoo#226036
Reloading a page now keeps users in the correct app menu instead of switching to another menu that uses the same underlying action. This avoids confusion for teams working across Sales, Accounting, Purchase, and shared customer records.
Original PR description
* STEP TO REPRODUCE: install sale management module, go to sale app -> customer menu -> Then reloading the page using F5 -> the menu is change to invoice which is not correct * Also Multiple modules (Sale, Account, Purchase) share same actions (e.g. partner action) * SOLUTION: Modified webclient.js action-to-menu mapping to handle multiple menus sharing same action 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#226713 Forward-Port-Of: odoo/odoo#225984
This fixes an issue where fully postpaid subscriptions did not set the next invoice date to the first day of the billing period when the plan required period alignment. Businesses get more accurate billing schedules and fewer manual date corrections after confirming subscriptions.
Original PR description
Before this commit, when a subscription whose lines were all postpaid and the subscription plan was meant to align periods to first day of the period (e.g. first of the month), there was an issue at confirmation. The next invoice date was not put at the first day of the period in that case.
Customers can now choose between a recurring subscription plan and a one-time purchase when a product has only one subscription plan. This fixes a checkout choice that was previously hidden, helping avoid missed sales and customer confusion.
Original PR description
Version: - 19.0 Steps to reproduce: 1. Create a product with only one recurring plan 2. Enable option 'one-time purchase' 3. On e-commerce it is not possible to select between the recurring plan and the one-time option Issue: - When a product has only one recurring plan and the 'one-time purchase' option is enabled, the recurring plan selection is hidden. Solution: - Updated the `subscription_pricing_select` logic to allow selection when 'one-time purchase' is enabled, even if there is only one recurring plan.
Rotting items in Kanban views now use the normal selected-item appearance when clicked. This makes it easier for users to see which item is selected and avoids confusion from the previous reddish background remaining visible.
Original PR description
The new Rotting feature displays rotting items with a light reddish background in Kanban view. However, they retain this color even as they are selected, which makes the selection unclear. This fix makes it so the rotting items look, once selected, the same as any other selected kanban item. task-5088907
The delivery form now shows the related sale order in the intended information area instead of beside the picking name. This prevents confusing form layout and makes sales information easier for users to find.
Original PR description
The picking form had two times the field `picking_type_code` in the arch. One next to the name, and the other in the Additionnal info tab. In 2713876dbc70d, the xpath in `sale_stock` adds `sale_id` after picking_type_code. It was placed right next the the picking name. This commit uses another field (unique this time) to place the sale_id at a more suitable place. Task: 5073894 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
Refreshing the Point of Sale while the screensaver is active now returns users directly to the first POS screen instead of reopening the screensaver. This prevents cashiers from being locked out of the session and avoids needing to close and reopen the browser tab.
Original PR description
Fix issue appearing when you reload the page while the ScreenSaver is active, which caused the ScreenSaver to be displayed again after the reload (and the user is stuck on that screen). Steps to reproduce: - Open POS - Trigger screen ScreenSaver - Reload the page (F5) (without triggering any user activity so we stay on the screen saver) - The ScreenSaver is displayed again after the reload - => The user is stuck on the saver, moving clicking or typing does not do anything, you have to close the tab and open it again => Now when refreshing the page while on the screen saver, we just directly navigate to the first page of the POS. Description of the issue/feature this PR addresses: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226535
This fixes an issue where using Shift+Tab to move nested list items outward could corrupt the list layout in Odoo's HTML editor. Users editing notes, to-dos, or other rich text content can now reorganize lists without breaking their structure.
Original PR description
### Steps to reproduce: - Open the To-Do. - Use the following HTML: ```html <ol> <li> <div class='o-paragraph'>abc</div> <ol> <li>def</li> <li class='oe-nested'> <div class='o-paragraph'>ghi</div>…
### Steps to reproduce:
- Open the To-Do.
- Use the following HTML:
```html
<ol>
<li>
<div class='o-paragraph'>abc</div>
<ol>
<li>def</li>
<li class='oe-nested'>
<div class='o-paragraph'>ghi</div>
<ol>
<li>jkl</li>
</ol>
</li>
<li>mno</li>
</ol>
</li>
<li>pqr</li>
</ol>
```
- Place the cursor inside []ghi.
- Press Shift + Tab twice.
- Observe that after two outdents, the list structure breaks.
### Description of the issue/feature this PR addresses:
- While merging similar list items, we checked the last child of the previous sibling or the first child of the current list item.
**This caused merging like:**
```html
<li><div>abc</div><ol><li>def</li></ol></li>
<li><div>ghi</div></li>
```
**Producing invalid structure:**
```html
<li><div>abc</div><ol><li>def</li></ol><div>ghi</div></li>
```
### Desired behavior after PR is merged:
- Checks if the first child of the current element is a list item.
task-5048387
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe spreadsheet sharing controls have been adjusted so users no longer see a share button while editing dashboards, preventing related errors. On mobile, duplicate share options have been removed because sharing remains available through the File menu, making the interface clearer.
Original PR description
Current behavior before PR: - Share button caused errors when editing dashboards. - Duplicate 'Share' and 'Freeze and share' buttons shown in mobile view. Desired behavior after PR is merged: - Hide share button in dashboard edit. - Remove duplicate share buttons in mobile (already under File -> Share). Task: [5043228](https://www.odoo.com/odoo/2328/tasks/5043228)
Fixes an issue in Attendance where changing checkout time could prevent manually validated overtime hours from being recalculated correctly when saving. This helps ensure overtime values remain accurate and avoids confusing discrepancies for HR users.
Original PR description
This fixes a weird behaviour where field that is not triggering the compute on the save because it was already triggered on the onchange If a user ser the validated_overtime_hours to a value that is…
This fixes a weird behaviour where field that is not triggering the compute on the save because it was already triggered on the onchange If a user ser the validated_overtime_hours to a value that is not the one in overtime_hours, upon changing the check_out time we will trigger the compute for both those fields. Overtime_hours calculates it's value based on attendance.overtime model, which is not being updated here, hence it will have the same value. Validate_overtime_hours in the other hand will be updated since there is a write in overtime_hours (even though with the same value) and this will mark the field to be updated when a web_save happens. Now when the save happens the overtime_hours is updated but even though validate_overtime_hours depends on it, it won't be updated since it's being writen to, as a field to be updated This fix aims to prevent writing to overtime_hours when there is no real need to, preventing the described issue opw-4806193 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222832
External values linked to tax reports can no longer be edited or created after the relevant tax return lock date. This helps protect submitted tax filings from accidental changes and adjusts the tax closing process so required default values are created before the period is locked.
Original PR description
[FIX] account_reports: external value check lock date This commit add the check that protects external values from being edited out of the lock date. For example when the tax report is submitted, the…
[FIX] account_reports: external value check lock date This commit add the check that protects external values from being edited out of the lock date. For example when the tax report is submitted, the user is not supposed to modify any external values anymore. To do this, we had to modify the tax closing flow a little bit: when closing the tax period, we now generate the default external values before setting the tax lock date. This is because the generation of the default external values was done for the period we were closing, but now that we forbid the creation of an external value after the lock date we had to change the order of the flow. Due to one specific corner case (l10n_fr), we had to keep a hack to bypass the Tax Return Lock Date check. This was done with a context key and will have to be removed in master. The case is the following : when the user generates the tax closing entry, the external values for the period are generated and the Tax Return Lock Date is set with the last day of the month. Then if the user tries to submit the EDI VAT report, it tries to create 2 external values for the carryover but as the lock date was set, it raises an error. task-5012442 Forward-Port-Of: odoo/enterprise#94641 Forward-Port-Of: odoo/enterprise#92949
POS receipts in Spain will no longer print a misleading QR code when the TicketBAI submission fails. This avoids confusing customers and helps ensure receipts only show valid compliance information.
Original PR description
Currently if the TicketBAI upload fails, a QR code is printed with the value `true`. Steps to reproduce ----- 1. Validate a POS order 2. Have a request exception occur during the TicketBAI post 3. Receipt is printed with an incorrect QR code Issue ----- `get_l10n_es_pos_tbai_qrurl()` returns None if the edi document is not accepted. This is then interpreted as `true` by the client and a QR code is printed. Solution ----- Explicitly return an empty string if the edi document is not accepted. Forward-Port-Of: odoo/odoo#227293
This fixes an issue in the website editor where background images in the banner categories section could not be replaced. The image is now applied in a way that lets users update it normally, making page customization work as expected.
Original PR description
We can't replace the image on the `grid_items` this commits applies the background image on the column to make it replaceable. task-5079842 Follow-up of task-4775259 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Payroll work entry validation no longer performs a multi-contract check that cannot apply in this version. This prevents unnecessary blocking or confusion during payroll processing while keeping the workflow aligned with supported contract rules.
Original PR description
The multi contract is not possible, so removed the check. task-5073952 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225964
Fixed an issue that could cause an error when opening the options menu on an invoice section after adding product lines. This helps users continue editing invoices and related sales lines without interruption.
Original PR description
The prop doesn't exist.
Sales and purchase order sections are no longer treated as regular product lines when documents are exported and re-imported. This prevents incorrect quantities and prices from appearing on imported orders and avoids a misleading import warning message.
Original PR description
Steps to reproduce: - Create Sales/Purchase order with sections - Print Sales/Purchase order as PDF - Drop the PDF into purchase app Problem: - Sections are added as a normal order line with…
Steps to reproduce:
- Create Sales/Purchase order with sections
- Print Sales/Purchase order as PDF
- Drop the PDF into purchase app
Problem:
- Sections are added as a normal order line with quantity, price, etc..
- `return True` was removed from `_import_order_ubl` because it
shows an incorrect warning in the chat log.
"Attachment {{name}}.xml not imported: True" whenever the attachment
is imported correctly and its supposed to show the reason if something
goes wrong not "True".
**Notes:**
- Orders were filtered to not include sections, because
UBL does NOT support sections.
- `return True` was removed from `_import_order_ubl` because it
shows an incorrect warning in the chat log.
"Attachment {{name}}.xml not imported: True" whenever the attachment
is imported correctly and its supposed to show the reason if something
goes wrong not "True".
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#227200Budget report entries are now limited to the companies a user is allowed to access. This prevents users in one company from seeing budget-related entries from another company and avoids confusing access errors when opening those records.
Original PR description
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Budget Management" - Go to "Accounting / Accounting / Analytic Budget" - Create a budget - Open the budget - Create a bill (or invoice depending on the budget type) using the analytic used in the budget lines - Create a budget from another company and also a bill using the analytic used in the budget lines - Connect with a user with Accounting rights who only has access to the first company - Go to "Accounting / Reporting / Management / Budget Report" - Switch to the list view - Remove the "Open Budget" filter **Issue:** The entries linked to the budget from the other company are visible. When trying to open one of them, an access error is raised. **Solution:** Add a multi-company record rule for budget report. opw-4943360 Forward-Port-Of: odoo/enterprise#94105
Fixed an issue where users could see an empty notification when editing properties on a product without a category. The warning message now displays correctly, helping users understand what action or setup is needed.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Create a new product without a category; 2. try to edit properties. Issue ----- An empty notification appears. Cause ----- The `_getPropertyEditWarning` override in `account_asset` introduced by PR odoo/enterprise#87807 doesn't return the value of the `super` call. This was introduced in a forward port as the logic to display the warning was changed in `web` in saas-18.3, and not requiring a return value in previous versions. Solution -------- Return the `super` call. opw-4980006 Forward-Port-Of: odoo/enterprise#94583
This fix updates demo data so the Large Cabinet barcode is attached to the right product variant, ensuring product comparison examples work as expected. It also adjusts delivery demo settings so serial numbers can be created during delivery flows, keeping sample operations consistent.
Original PR description
Since variants are created for 'Large cabinet', we need to move the barcode to one of those variants. task 5089956 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a demo data installation issue when Italian Riba payments are installed after Stripe expenses. The change ensures the demo bank partner setup works even when an extra bank journal exists, making demo environments install reliably.
Original PR description
Steps: 1. Install `hr_expense_stripe` and activate demo data 2. Install `l10n_it_riba` 3. `l10n_it_riba` demo data install fails with an error Since [this commit](https://github.com/odoo/enterprise/commit/752ffcbcd0c33e2886aa7bcec469e16d3704d7a9), an additional bank journal is created on every company by `hr_expense_stripe`, and `l10n_it_riba` demo data only expects one. task-none Forward-Port-Of: odoo/enterprise#94437
This fix improves the website and email editing experience for right-to-left languages such as Arabic. Columns and grid elements now stay aligned with the cursor when users drag or resize them, reducing layout mistakes while editing pages or mailings.
Original PR description
**[FIX] web_editor, mass_mailing: fix resizing columns in rtl mode** This commit fixes issues in edit mode when resizing columns or using grid mode on websites displayed in a right-to-left (RTL) language like Arabic. task-4815296 Forward-Port-Of: odoo/odoo#224650 Forward-Port-Of: odoo/odoo#217338
This update fixes several issues in manufacturing work orders, quality checks, and barcode scanning. It helps shop floor and warehouse users complete scans and quality steps more reliably, reducing interruptions during daily operations.
Original PR description
Various fixes, mostly related to barcode scanning and some JS. task 5089956
This fix ensures Discuss actions are connected to the intended data store instead of sometimes attaching to the wrong one. It prevents unexpected errors in Discuss when actions are created from local components.
Original PR description
In Discuss, actions can be defined globally (registry) or locally (components). When defined from a component, the store must be explicitly provided. If not, the constructor falls back to the owner if it is a store, or to the `mail.store` service. The fallback condition was incorrectly grouped due to missing parentheses, so the owner was always used even when a store was given. This could result in actions being bound to the wrong store, causing unexpected errors. 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 fix prevents timing issues in mail tests where message attachments could be overwritten if updates arrived before the message fully loaded. It improves the reliability of automated checks, helping reduce false failures in Odoo's validation process.
Original PR description
Before this commit, the test could experience a race condition where the load of the message and the update of the content of that message happen at the same time, if that happens and the update of the content is received by bus before the load of the message (which therefore does not contain any attachment), then the store was overriding the attachment. This commit should solve the problem in the test by waiting for the messages at the beginning of the test as well as updating the attachments in the ui and not by rpc directly. The race conditions should be fixed globally and are not only linked to this issue. fixes-runbot-66304 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227032 Forward-Port-Of: odoo/odoo#226922
Code cleanup and technical improvements
This update reorganizes where color picker tabs are defined so each editor area owns the options it uses. It helps keep the website and HTML editing tools easier to maintain without changing the expected user experience.
Original PR description
*: html_editor, html_builder, website. Following the creation of the colorpicker and the [refactor] of the html builder, colorpicker's tabs were defined in web, which is wrong for the 'Theme' and 'Gradient' Tabs. This commit moves them to 'html_builder' and 'html_editor' accordingly. Related to task-4367641 [refactor]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
Documentation and clarification updates
This update records the contributor license agreement signature for tsezgin. It supports Odoo's legal compliance process by confirming contribution rights for future work from this contributor.
Original PR description
The commit contains my CLA signature Forward-Port-Of: odoo/odoo#226307