Daily updates from Odoo
Navigate
Branch
Thursday, April 17, 2025
53 changes
33 changes
Enhancements to existing features
Odoo can now automatically find IoT Boxes available on the local network, reducing manual setup work. The connection screens and guided steps were also improved so users can add a new IoT Box more confidently and with fewer errors.
Original PR description
This PR adds the possibility to auto-detect the IoT Boxes registered on your local network. It also improves the UI and the wizards the user sees when trying to connect a new IoT Box to the database Related odoo PR: odoo/odoo#204629 Related internal PR: https://github.com/odoo/internal/pull/3462 Related upgrade PR: https://github.com/odoo/upgrade/pull/7533 task-4687795
PLM actions now include clearer URL paths, making key product lifecycle pages easier to identify and navigate. This improves usability for teams who share links or revisit important PLM actions.
Original PR description
Added path in URL for the main actions of PLM.
Rental order deliveries no longer include the customer reference in the internal origin field. This prevents the reference from appearing twice on delivery slips and keeps order tracking more consistent when customer references change.
Original PR description
The origin field reliably tracks related orders, but including the customer reference caused issues: - The delivery slip displayed the customer reference twice. - Updating the customer reference in a sale order did not update the origin, making it unreliable for tracking. This change removes the customer reference from the origin while keeping it structured for related orders. task-4613354
Appointments can now be managed in a Kanban-style board, making schedules easier to scan and organize at a glance. The appointment form was also refined to improve day-to-day usability for teams handling bookings.
Original PR description
In this commit: === - Added a Kanban view for appointments. - Improved the form view for better usability. Task-4640315
Bank statement import now correctly handles CODA files that contain statements for more than one bank account. This helps businesses using Belgian CODA, Codabox, CAMT, OFX, QIF, or Japanese Zengin imports avoid missed or misassigned bank statement data when one file covers multiple accounts.
Original PR description
This commit implements the correct handling of coda files with statements for multiple accounts. Task: 4502185
WhatsApp discussion channels now use the sender partner's name when it is available, instead of defaulting to the related record name. This makes conversations easier for users to recognize and manage in Discuss.
Original PR description
Show the name of the partner when possible instead of the name of the record. Task-4448261 Co-Author: David Beguin <dbe@odoo.com>
Report names for Argentina and Chile have been standardized to be clearer and more consistent. This removes unnecessary geographic wording and aligns capitalization, making reports easier for users to recognize and compare.
Original PR description
Report names have been standardized for clarity by removing country/geographic location details and ensuring even capitalization. Task ID: 4501944
The manufacturing shop floor app has been refreshed to make daily work easier to follow and manage. Operators now have clearer cards, menus, search, and always-visible operator information, with actions grouped more logically and instructions available only when needed.
Original PR description
You can find more details in each individual commit. The main modifications are: - General UI Refresh of the shop floor app - Redesign of quick action, easily undo or redo any steps/actions - Redesign of operator side panel, now always shown - Instructions available on demand only task-4484941
The field service sales and stock product catalog has been aligned with recent product catalog interface updates, keeping the workflow consistent for users. The catalog now also shows the correct currency even before a sales order is created, reducing confusion during early product selection.
Original PR description
This commit modifies the product catalog UI tests and code in `industry_fsm_*` to match UI changes in community PR changes in the Product Catalog, as introduced in the Community PR. Also, ensure that a currency shows in catalog even when no SO has been created yet. TaskId: 4610850
This update makes appointment management clearer by highlighting no-show appointments, improving resource links, and preventing timezone-related errors. It also simplifies the sales commission team dashboard to match the updated CRM dashboard experience.
Original PR description
- Adapt CRM overrides to changes in the dashboard view and tweak some UI elements for appointment. Many fields and some views were removed in that process. - Add a fallback for the timezone of appointment types, which avoids some tracebacks if the user somehow has no timezone. - Cross through "no show" appointments in the gantt view to make it more obvious at a glance that this was entirely not attended. - Allow clicking resources, remove the "avatar" widget for them in the appointment view as it doesn't bring anything and replace with a regular tag widget which is clickable and allows to easily manage them. task-4568114
Vendor bills now keep the invoice reference provided by the vendor instead of copying the reference from the related purchase order. This reduces confusion when purchase order references and vendor invoice numbers are different, improving accuracy in bill tracking and matching.
Original PR description
…on invoice Adapt test to community modification. We now consider the vendor reference on the purchase order and the bill to be different, so we don't propagate it from PO and use the invoice name from the vendor as reference.
Emails sent to the Documents app without attachments are now automatically converted into document files. This removes the need for users to manually print, save, or upload email-only invoices and receipts, making document capture faster and simpler.
Original PR description
For instance, when receiving invoices from digital services, you sometimes just receive your invoice/receipt as an email without any attachment. Currently you'd have to open the email, print/save the email as PDF and either upload it manually to the Documents app, or attach it to an email sent to a Documents alias. This commits converts emails without attachments sent to Documents into documents. task-4539553
WhatsApp conversation titles in Discuss now show the contact's name instead of only their phone number. This makes chats easier to recognize and also avoids an error when a WhatsApp channel is created without a linked message.
This update fixes a crash that could occur when receiving recruitment-related VoIP calls. It also simplifies and renames shared call display elements so call screens are easier to maintain and use consistently across VoIP views.
Original PR description
## [FIX] voip_hr_recruitment: traceback on incoming call The patch of CallInvitation components was not done correctly and failed to redefine the original list of child components. As a result, Owl couldn't find the definitions of ActionButton and UserInfo and would crash when trying to render the CallInvitation. ## [IMP] voip: merge CallView into UserInfo CallView was introduced to avoid code duplication between CallInvitation, InCallView, and CallSummary, which have some data in common. The concept of CallView is no longer useful since the part that is shared is fully encompassed by the UserInfo component that was added later. This commit merges the two to keep only one component. ## [MOV] voip: rename UserInfo to ContactInfo ContactInfo is believed to be more in line with the terminology in use in VoIP, and less confusing than "UserInfo" since "user" in the context of Odoo refers to another concept entirely.
Resolved issues and error corrections
The Knowledge search bar now uses the correct module-specific rules when looking for published articles. This prevents search errors and lets portal users find relevant child articles after moving between published and shared content.
Original PR description
This commit fixes an issue with the KnowledgeSidebar Component which provides a domain to search for a specific article. The issue is that it used the field `website_published` inside the knowledge module. Which never defines this field on the model. This error was introduced by https://github.com/odoo/enterprise/pull/77597. This is supposed to be the job of the website_knowledge module, which implements the field on the model. Another issue is when a portal user access a published article and switches to an article shared with them, he can not search for articles that are descendants of the original published article. This is fixed by registering the original root id (which may be a published article), and searching published articles that are children of that specific root. task-4734644
Code cleanup and technical improvements
The server action form layout has been reorganized so related options are grouped more clearly by action type. This is an internal cleanup that makes the WhatsApp-related configuration easier to maintain and extend, with no expected change for day-to-day users.
Original PR description
*: whatsapp This commit refactors the form view for server actions by better grouping the fields by action state. This will help to maintain the arch and its extensions. Task id: opw-4672326
The appointment booking form code was reorganized and updated to use Odoo's newer interaction framework. This internal modernization helps keep the appointment experience maintainable and aligned with the website platform, without introducing major visible changes for users.
The Knowledge app’s permission panel and options menu were redesigned to load more responsively and behave more consistently. Users get clearer permission controls, more predictable behavior when leaving private articles, and improved stability backed by new tests.
Original PR description
Make Knowledge feel a little bit more responsive by deferring the loading of some fields. For both the PermissionPanel and the options panel we remove as much as possible the usage of separate RPC…
Make Knowledge feel a little bit more responsive by deferring the loading of some fields. For both the PermissionPanel and the options panel we remove as much as possible the usage of separate RPC calls. This change made us rely more on the record Object populated by the DB values. Tests were also implemented for each Component to test their behavior and ensure stability and robustness for the future. There's also been some minor improvements to the behavior done. #### PermissionPanel * no more check that "based on" articles are accessible by the user (more coherent with the topbar "hierarchy"). * when the owner of a private article leaves the article, the article is sent to the trash instead of archiving it (as suggested by the confirmation dialog). * portal users with permission "none" are not hidden anymore. * the permission selectors are now dropdowns (more flexible than selectors and has a style that is consistent with the app). * the "remove member" button has been replaced by an option in the permission dropdown. #### Member rights escalation * Allow a member to remove itself from an article if its member permission is the same as the inherited_permission. i.e. a read access member on a readonly article can remove itself: - this allows an action symmetry (a user can join a readonly article and also remove itself as a member to see/hide it in the sidebar) #### OptionsDropdown * The bootstrap dropdown has been replaced by a separate Component that uses the Dropdown class provided by the framework. * The bus system for toggling each panel has been replaced by a reactive object in the environment provided by the Controller. This doesn't rely on d-none class on the parent any more to hide/show each panel. Task-4273102
This update replaces an older internal data grouping method with a more suitable one in areas where the overall group count is not needed. It helps keep reporting, grid, spreadsheet, subscription, and cohort features aligned with upcoming platform changes while preserving current behavior.
Original PR description
The `web_read_group` function differs from `formatted_read_group` by including the global count of groups within and outside the offset/limit parameters. This information is often unnecessary for most calls to `web_read_group`, especially when no limit or offset is applied. Furthermore, the signature of `web_read_group` might change in the near future (see https://github.com/odoo/odoo/pull/133224). Therefore, this commit switches to `formatted_read_group` in scenarios where the total group count is not required or is already available. https://github.com/odoo/odoo/pull/206021
Miscellaneous changes
**Year to date computation improvements** - Some inputs on the YTD can go to multiple rules. Therefore, we add manual recomputation of the inputs for payslips. It uses opening balances to compute the total payslip YTD values. - A major update is the addition of Income Stream types to Year to Date values. This allows for grouping payslips with income stream type for employees that may have multiple income stream through a single fiscal year. STP requires repo
Original PR description
**Year to date computation improvements** - Some inputs on the YTD can go to multiple rules. Therefore, we add manual recomputation of the inputs for payslips. It uses opening balances to compute the…
**Year to date computation improvements**
- Some inputs on the YTD can go to multiple rules. Therefore,
we add manual recomputation of the inputs for payslips.
It uses opening balances to compute the total payslip YTD
values.
- A major update is the addition of Income Stream types to
Year to Date values. This allows for grouping payslips with
income stream type for employees that may have multiple income
stream through a single fiscal year. STP requires reporting
the year to date values for each income stream type separately.
**Single Touch Payroll Improvements**
- Adds income stream types to the STP report. This
allows for users with multiple income streams in
a single fiscal year to be repored without finalisation.
- Fixes Termination payments for genuine and
non-genuine redundancy payments and how taxes are
reported for taxible and non-taxible components.
- Fixing Full file replacement for STP. This adds
constrains for FFR, allows old payments to auto reconcile
on a changed payslip after resubmission.
- Adds support for missed reporting of payslips.
If a user forgets to report a pay period and continues
with the next pay period, They have 2 options:
1. Create a back dated submit event with the old
year to date values.
2. Create an update event that amends the year to date
values at todays date.
In odoo we go for option 2. For a missed report, we create an Update
event that updates all the ytd values up til today's date.
- Fixes zeroing of YTD on Single touch payroll.
- Adds a correction input type for Basic salary corrections
without having to make any changes to past payslips. This helps
cover under or over-payments
- Improve validation for Single touch payroll. With better
testing and file generation. This adds better error
handling before running the xml validation step. This
lowers the possibility of errors after file generation.
- Improve performance for YTD computation to allow batching and
caching of the values using computes on the payslips. Relies fully
on the ORM using search_fetch to optimize queries for the YTD
computation.
**AU Payroll Payment reconciliation**
- Allows old payments to auto reconcile on a changed
payslip after resubmission.
**Standard Fixes**
- Allow auto install of hr_payroll_account if accounting and Payroll
app are installed. This also subsequently installs localised versions.
- Payment register wizard fails to compute the amount, journal, etc
since the `_compute_from_lines` is not triggered. This is because
partner_id is the only field in the view to trigger that compute before
create. And when a default value is passed for the partner, there is no
need for the compute to trigger on a new record before save.
- Salary attachments with the same code inputs always
used the last input in the sequence for all attachments.
This commit changes the behavior to allow multiple
attachments with the same code inputs.
- Salary rules generate multiple payslip lines for
multi rule lines, but the result_rules in the
local_dict are not updated. This commit fixes that
and sums up the totals and amounts for all the lines
in that rule.
Task# 4201469
Forward-Port-Of: odoo/enterprise#83173
Forward-Port-Of: odoo/enterprise#75695`(stock.picking).move_ids_without_package.lot_ids` is gated on `stock.group_production_lot`, if the user doesn't have this group, the field is unavailable and trying to set it via the form fails. https://runbot.odoo.com/odoo/error/163100 Forward-Port-Of: odoo/enterprise#83588
Original PR description
`(stock.picking).move_ids_without_package.lot_ids` is gated on `stock.group_production_lot`, if the user doesn't have this group, the field is unavailable and trying to set it via the form fails. https://runbot.odoo.com/odoo/error/163100 Forward-Port-Of: odoo/enterprise#83588
…mesheet **Issue** In a subscription, the qty delivered of a SOL with "Prepaid" invoicing policy wasn't updated when timesheets were added. **Steps to reproduce** 1. Have a service subscription product with an invoicing policy "Prepaid/Fixed price" and creating a task on order. 2. Create a monthly subscription with a start date 15 days in the past 3. Add some timesheet hours on the task. 4. Run the "Subscription: generate recurring invoices" cron. - Actual: quantity delivered on th
Original PR description
…mesheet **Issue** In a subscription, the qty delivered of a SOL with "Prepaid" invoicing policy wasn't updated when timesheets were added. **Steps to reproduce** 1. Have a service subscription…
…mesheet **Issue** In a subscription, the qty delivered of a SOL with "Prepaid" invoicing policy wasn't updated when timesheets were added. **Steps to reproduce** 1. Have a service subscription product with an invoicing policy "Prepaid/Fixed price" and creating a task on order. 2. Create a monthly subscription with a start date 15 days in the past 3. Add some timesheet hours on the task. 4. Run the "Subscription: generate recurring invoices" cron. - Actual: quantity delivered on the SOL stays at 0. - Expected: timesheet hours falling during the subscription period are added to the delivered quantity of the line. **Cause** Commit https://github.com/odoo/enterprise/commit/a6420bdacab3b9c9f440f48db3b442e6b6c7b655 added a new module overwriting the computation of the delivered quantitiy for recurring lines based on timesheets, for products with an invoicing policy `delivered_timesheet`. However, the computation is overriden for all timesheet lines selected by https://github.com/odoo/enterprise/blob/a6420bdacab3b9c9f440f48db3b442e6b6c7b655/sale_subscription_timesheet/models/sale_order_line.py#L11-L12 A second filtering is applied later https://github.com/odoo/enterprise/blob/a6420bdacab3b9c9f440f48db3b442e6b6c7b655/sale_subscription_timesheet/models/sale_order_line.py#L21 Which exluces products with an invoicing policy different than `delivered_timesheet` **Solution** For products with a "prepaid" invoicing policy, compute the delivered quantities the same way: the timesheets delivered during the subscription period. Note that as explained in a comment, `Side effect: It won't work for the first period if the invoice cron never run. (the next invoice date has never been incremented)` opw-4509495 Forward-Port-Of: odoo/enterprise#82917 Forward-Port-Of: odoo/enterprise#82806
STEPS ------------ 0. You'll require IAP credit for PDF extraction 1. Create 1 POs (we'll call it PO-1) and set the vendor as the current company 2. Duplicate PO-1 (we'll call the duplicate PO-2) and change the amount value of one product 3. Create an invoice with the extact same values as PO-2 and set the customer reference (in the 'Other Info' tab) to "PO-2"; we'll call it INV-1 4. Create a bill and use the Auto-Complete field to manually select PO-1 5. Drag and drop INV-1 in the chatte
Original PR description
STEPS ------------ 0. You'll require IAP credit for PDF extraction 1. Create 1 POs (we'll call it PO-1) and set the vendor as the current company 2. Duplicate PO-1 (we'll call the duplicate PO-2) and change the amount value of one product 3. Create an invoice with the extact same values as PO-2 and set the customer reference (in the 'Other Info' tab) to "PO-2"; we'll call it INV-1 4. Create a bill and use the Auto-Complete field to manually select PO-1 5. Drag and drop INV-1 in the chatter -> IAP should trigger -> The chatter says ''' The invoice already contains lines, it was not updated from the attachment. ''' but yet, it updated the purchase reference to PO-2 and updated the lines OBJECTIVE ------------ If a bill has lines, it should not be updated with the content of the PO. task-4633298 Forward-Port-Of: odoo/enterprise#83398 Forward-Port-Of: odoo/enterprise#83246
Currently, an error may occur when we try to export the trial balance with the SAT (XML) format. This is because a None id is used to browse the account, due to a more specific account_group. Steps to reproduce: - Install l10n_mx_reports. - Create an account_group with a more specific account, such as 401.01.01 - The 4, 401, and 401.01 groups are created with demo data. - Go to trial balance and try exporting with "SAT (XML)". An error will occur (`AttributeError: 'bool' object has
Original PR description
Currently, an error may occur when we try to export the trial balance with the SAT (XML) format. This is because a None id is used to browse the account, due to a more specific account_group.
Steps to reproduce:
- Install l10n_mx_reports.
- Create an account_group with a more specific account, such as 401.01.01
- The 4, 401, and 401.01 groups are created with demo data.
- Go to trial balance and try exporting with "SAT (XML)".
An error will occur (`AttributeError: 'bool' object has no attribute 'startswith'`) because the account is None, so account have no type.
opw-4716047
Forward-Port-Of: odoo/enterprise#83407
Forward-Port-Of: odoo/enterprise#83197Steps to Reproduce (Calendar View): 1. Open the Calendar view on the monthly scale. 2. Create a planning slot by clicking on a date to plan. 3. Notice that the default hours are set to 7 AM to 7 PM. Steps to Reproduce (Gantt View): 1. Open the Gantt view on the weekly scale. 2. Create a planning slot by clicking on a grid cell. 3. Observe that the default hours are set to 8 AM to 5 PM. - In the Calendar view on the monthly scale, creating a planning slot defaults to 7 AM to 7 PM.
Original PR description
Steps to Reproduce (Calendar View): 1. Open the Calendar view on the monthly scale. 2. Create a planning slot by clicking on a date to plan. 3. Notice that the default hours are set to 7 AM to 7 PM. Steps to Reproduce (Gantt View): 1. Open the Gantt view on the weekly scale. 2. Create a planning slot by clicking on a grid cell. 3. Observe that the default hours are set to 8 AM to 5 PM. - In the Calendar view on the monthly scale, creating a planning slot defaults to 7 AM to 7 PM. - In the Gantt view on the weekly scale, creating a planning slot defaults to 8 AM to 5 PM. - These default hours do not align with the working calendar, leading to inconsistencies. - This fix adjusts the default hour settings in both views to ensure they align with the working calendar and account for unavailability. task-4164485 Forward-Port-Of: odoo/enterprise#83468 Forward-Port-Of: odoo/enterprise#69888
Steps to reproduce: 1. Create a new BoM w/ a pass/fail operation step 2. Create a manufacturing order using that BoM 3. Go the the Quality app 4. Open the quality check created for the MO 5. Click on Pass (or Fail, does not matter) 6. Go back to the MO and click Produce All 7. The qty_passed/qty_failed is not computed on the quality check opw-4552103 Forward-Port-Of: odoo/enterprise#80291
Original PR description
Steps to reproduce: 1. Create a new BoM w/ a pass/fail operation step 2. Create a manufacturing order using that BoM 3. Go the the Quality app 4. Open the quality check created for the MO 5. Click on Pass (or Fail, does not matter) 6. Go back to the MO and click Produce All 7. The qty_passed/qty_failed is not computed on the quality check opw-4552103 Forward-Port-Of: odoo/enterprise#80291
**Steps to reproduce:** - Install Accounting and l10n_pe_edi - Switch to a Peruvian company (e.g. PE Company) - Configure Peruvian localization (https://www.odoo.com/documentation/17.0/applications/finance/fiscal_localizations/peru.html) - Create an invoice: * Customer: Comercial Constructora los Patitos S.A. * Operation Type: [0101] Internal sale * Invoice Lines: - Product: [any with a UNSPSC Category] - Taxes: 18% - Terms and Conditions: [text containing special cha
Original PR description
**Steps to reproduce:**
- Install Accounting and l10n_pe_edi
- Switch to a Peruvian company (e.g. PE Company)
- Configure Peruvian localization (https://www.odoo.com/documentation/17.0/applications/finance/fiscal_localizations/peru.html)
- Create an invoice:
* Customer: Comercial Constructora los Patitos S.A.
* Operation Type: [0101] Internal sale
* Invoice Lines:
- Product: [any with a UNSPSC Category]
- Taxes: 18%
- Terms and Conditions: [text containing special characters like '/' or '.']
- Confirm the invoice
- Process UBL 2.1
**Issue:**
In the XML, the content of <cbc:Note> has been stripped of all special characters like [/\!?+-=%.,;:()].
Only "whitespace" special characters should be excluded (i.e. '\n', '\u00A0',...).
opw-4659655
Forward-Port-Of: odoo/enterprise#82787The commit https://github.com/odoo/odoo/pull/202553/commits/cebf5cd5702926fffdd61814ddd672aa17ff52fb changes the method connecting the service to the websocket. The change in pos_blackbox_be has not been done so it needs to be. Forward-Port-Of: odoo/enterprise#83520
Original PR description
The commit https://github.com/odoo/odoo/pull/202553/commits/cebf5cd5702926fffdd61814ddd672aa17ff52fb changes the method connecting the service to the websocket. The change in pos_blackbox_be has not been done so it needs to be. Forward-Port-Of: odoo/enterprise#83520
### Steps to reproduce: - In the settings enable by products. - Create two products FP and SN where SN is tracked by serial numbers - Create and confirm an MO for FP where SN is a by product - Open the shopfloor > Register By-Product > generate serial numbers > input SN0012 > Generate > Save #### > your input was not taken into account, not lot was created. ### Cause of the issue: Clicking on `Register By-Product` and generate serial numbers will open the `stock.generate_serial_d
Original PR description
### Steps to reproduce: - In the settings enable by products. - Create two products FP and SN where SN is tracked by serial numbers - Create and confirm an MO for FP where SN is a by product - Open…
### Steps to reproduce: - In the settings enable by products. - Create two products FP and SN where SN is tracked by serial numbers - Create and confirm an MO for FP where SN is a by product - Open the shopfloor > Register By-Product > generate serial numbers > input SN0012 > Generate > Save #### > your input was not taken into account, not lot was created. ### Cause of the issue: Clicking on `Register By-Product` and generate serial numbers will open the `stock.generate_serial_dialog`. Clicking on Generate will then call the `_onGenerate` method and an rpc call of the `action_generate_lot_line_vals` will be made: https://github.com/odoo/odoo/blob/a0542b13f679d4dc20d61eb62e4eb5106d6abe5a/addons/stock/static/src/widgets/lots_dialog.xml#L12 https://github.com/odoo/odoo/blob/a0542b13f679d4dc20d61eb62e4eb5106d6abe5a/addons/stock/static/src/widgets/generate_serial.js#L34 However, if you triggered these actions from the shopfloor, you never provided a `default_picking_type_id` in the context so that the lot will never be created by any mean: https://github.com/odoo/odoo/blob/a0542b13f679d4dc20d61eb62e4eb5106d6abe5a/addons/stock/models/stock_move.py#L919-L927 https://github.com/odoo/odoo/blob/a0542b13f679d4dc20d61eb62e4eb5106d6abe5a/addons/stock/models/stock_move.py#L945-L948 opw-4544734 Forward-Port-Of: odoo/enterprise#83356 Forward-Port-Of: odoo/enterprise#82355
Steps to reproduce: ------------------- * Install l10n_cl_edi_stock * Create a new Transfer * Add as customer a Contact that is part of a Company * Print Delivery Guide SII DTE 52 (CL) > Observation: Why the fix: ------------ The name of the company has to be shown not the actual name of ths customer Legal requirement in Chile ref: https://www.sii.cl/factura_electronica/formato_dte.pdf https://github.com/odoo/odoo/pull/172793 opw-4676871 Forward-Port-Of: odoo/enterprise#83311
Original PR description
Steps to reproduce: ------------------- * Install l10n_cl_edi_stock * Create a new Transfer * Add as customer a Contact that is part of a Company * Print Delivery Guide SII DTE 52 (CL) > Observation: Why the fix: ------------ The name of the company has to be shown not the actual name of ths customer Legal requirement in Chile ref: https://www.sii.cl/factura_electronica/formato_dte.pdf https://github.com/odoo/odoo/pull/172793 opw-4676871 Forward-Port-Of: odoo/enterprise#83311
Steps to Reproduce: - Open the Industry FSM app and navigate to the Activity view. - Click on any task to open its form view. Issue: - A traceback error occurs when opening a task on large screens due to 'newWindow' being undefined. Solution: - Passed the 'options' argument to super.openRecord in FsmMyTaskActivityController to ensure 'newWindow' is defined on large screens. - Ensured consistent behavior for openRecord across devices. task-4664793 Forward-Port-Of: odoo/enterprise
Original PR description
Steps to Reproduce: - Open the Industry FSM app and navigate to the Activity view. - Click on any task to open its form view. Issue: - A traceback error occurs when opening a task on large screens due to 'newWindow' being undefined. Solution: - Passed the 'options' argument to super.openRecord in FsmMyTaskActivityController to ensure 'newWindow' is defined on large screens. - Ensured consistent behavior for openRecord across devices. task-4664793 Forward-Port-Of: odoo/enterprise#82646
The SP-API doesn't support SKU containing commas, not even when escaping and listing them in a correct CSV like string, as they'll be considered as either separate SKU or a different one, thus leading to an error saying there are too many identifiers, or not recognizing them anyway. In order to let the synchronization continue for the other items, ensure their SKU are valid beforehand. As from Amazon side, using a comma is a valid value, we can't constrain the SKU either. opw-4710435
Original PR description
The SP-API doesn't support SKU containing commas, not even when escaping and listing them in a correct CSV like string, as they'll be considered as either separate SKU or a different one, thus leading to an error saying there are too many identifiers, or not recognizing them anyway. In order to let the synchronization continue for the other items, ensure their SKU are valid beforehand. As from Amazon side, using a comma is a valid value, we can't constrain the SKU either. opw-4710435 Forward-Port-Of: odoo/enterprise#83367
As this savepoint was initiated in a loop, it could lead to many subtransactions (one savepoint per document to upload) being active at the same time, causing performance issues (more info at [1]). The main goal of that savepoint was to be able to recover from a SQL serialization failure that could occur when the document to upload was modified concurrently. This was mostly useful in version 16.0 where the upload of the documents to the OCR server was performed asynchronously through a cro
Original PR description
As this savepoint was initiated in a loop, it could lead to many subtransactions (one savepoint per document to upload) being active at the same time, causing performance issues (more info at [1]).…
As this savepoint was initiated in a loop, it could lead to many subtransactions (one savepoint per document to upload) being active at the same time, causing performance issues (more info at [1]). The main goal of that savepoint was to be able to recover from a SQL serialization failure that could occur when the document to upload was modified concurrently. This was mostly useful in version 16.0 where the upload of the documents to the OCR server was performed asynchronously through a cron. This greatly increased the likelihood of serialization errors. In version 17.0, we went back to synchronous uploads (commit 9df91d8), these should be much less frequent. Considering this, it seems reasonable to remove the savepoint, although it implies that if such error occurs, the SQL transaction will be rollbacked and some OCR credits might be lost in the process. [1]: https://www.postgresql.org/docs/current/subxacts.html, in particular the last sentence: > The more subtransactions each transaction keeps open (not rolled back > or released), the greater the transaction management overhead. Up to > 64 open subxids are cached in shared memory for each backend; after > that point, the storage I/O overhead increases significantly due to > additional lookups of subxid entries in pg_subtrans. Forward-Port-Of: odoo/enterprise#83248
20 changes
Enhancements to existing features
Product forms now avoid loading a very large Intrastat code list into the browser. This reduces memory use and helps users navigate product records more smoothly, especially in databases with many Intrastat codes.
Original PR description
Previously, the intrastat_code_id was filtered by checking against a large list that is sent to the frontend. This caused huge memory usage due to the list being used in many objects and the list itself being large, around 10k items. This memory leak caused slowness in the frontend while going through the product form views. Currently, the list is not being sent. The domain itself is evaluated from the frontend without sending a list. This reduces memory footprint and slowness.
The Knowledge portal search experience has been adjusted so results better match whether users are searching from the portal or the main back office. This should make it easier for portal users to find the right articles without seeing less relevant internal results.
Helpdesk tickets that include billable timesheets can now be invoiced more easily once they are solved. Timesheets are automatically validated when a ticket reaches the solved stage, and a new Create Invoices action in the helpdesk overview helps teams bill completed work faster and with fewer manual steps.
Original PR description
Before this commit : - Timesheets are not validated automatically when a ticket is solved . - No available button to create invoices for solved tickets in the helpdesk overview. After this commit: - Timesheets linked to a helpdesk ticket get validated when ticket is moved to Solved stage. - A 'Create Invoices' button is added to invoice solved tickets in helpdesk overview. Task id: 4243781
Resolved issues and error corrections
The Belgian POS blackbox module now skips IP logging when no web request is available, preventing point-of-sale tests and automated session starts from failing. Sale details processing also checks that a configuration uses blackbox before applying blackbox-specific logic.
Original PR description
Before this commit, when pos_blackbox_be was installed, the pos tests were failing because most pos test called `_run_test` which is calling `_satrt_pos_session` which is calling `open_new_session` which is calling `set_opening_control`. This makes that when calling `set_opening_control`, the request is not bound and we cannot do `request.geoip.ip`. We now check that the request is bound in `_log_ip`: if it is not, we return, if it is, we resolve the ip on the fly.
This update fixes a connection issue in Argentina electronic invoicing that could occur when running newer Python versions. It helps keep tax web service communication reliable across supported deployment environments.
This update fixes the Argentina electronic invoicing connection so it works reliably on both older Python versions and Python 3.12. It helps avoid connection failures when companies or hosting environments upgrade Python.
Original PR description
We adapted it to make it work depending on the version of Python used. It works for version 3.10.6 and below, but for Python 3.12, it fails. We adapted it so it can work in both Python versions Adhoc task 47274
This update improves batch invoice sending for Brazil, Colombia, Mexico, and Uruguay localizations by showing more accurate invoice counts before sending. It also fixes cases where Peppol invoices could be missed when no electronic invoice format was set, and treats Peppol XML generation problems as blocking errors instead of silently skipped items.
Original PR description
*: l10n_br_edi, l10n_co_dian, l10n_mx_edi, l10n_uy_edi 1. fix the summary of account.move.send.batch.wizard The summary was displaying wrong numbers of invoices. Indeed, it was computed on default…
*: l10n_br_edi, l10n_co_dian, l10n_mx_edi, l10n_uy_edi 1. fix the summary of account.move.send.batch.wizard The summary was displaying wrong numbers of invoices. Indeed, it was computed on default methods, instead of methods that are applicable to the move. For example, if a move was not possible to send through Peppol because the partner is not registered on the network, it was still displayed in the summary of the batch sending (then not used when the async processing happened). We also always put email as a fallback, even if no email is set, since it can be added through the wizard. 2. fix batch send of Peppol invoices when no format set In previous commit[1], we set the BIS3 format on invoices that were meant to be sent trough Peppol, even if no invoice_edi_format was set on the Partner. This commit fixes some cases when sending multiple invoices with no invoice_edi_format but Peppol as default sending method ended up not being sent. [1]: https://github.com/odoo/odoo/commit/84a0b81a258262e3bb9dbaa9c9f37796303a9dad 3. Remove 'skipped' state of Peppol moves This state doesn't really make sense. It only happens when there is an error while generating the XML file to send, which can be considered as a blocking error. task-no (review with TSB and PMAX)
This fix changes Brazilian Avalara account creation so missing fields are sent as empty text instead of false values. This prevents Avalara from storing "false" in account details, reducing EDI processing problems for affected Brazilian tax integrations.
Original PR description
Avalara populates those fields as "false" in the account, which causes issues during EDI. We keep sending the fields, but send empty string instead. opw-4716571
Payslips now exclude overtime that is still waiting for manager approval. This helps prevent employees from being paid for overtime before it has been reviewed and approved, improving payroll accuracy.
Original PR description
to reproduce: ============= - with employee having attendace houre based contract - set in attendace settigns that overtime should be approved by manager - create attendace for this employee with overtime pending for approval - create payslip for this employee -> the overtime is included in the payslip even if it is not approved Problem: ======== unapproved overtimes are not filtred while computing payslip lines Solution: ========= - add a filter to exclude unapproved overtimes in payslip line computation opw-4610454
The salesperson subscription dashboard now uses the correct source values and ranking lists in churn, contraction, and expansion tables. This improves the accuracy of reported subscription performance so sales teams can rely on the dashboard for decision-making.
Original PR description
fix wrong formulas in different tables: - in "worst churn" under Value, starting the 7th line, the value used was "recurring_monthly" instead of "amount_signed" - in "worst contraction", the 10th line didn't use the list 4 like the rest of the table - in "top expansion", the 10th line didn't use the list 2 like the rest of the table Task: 4711532
Fixes an issue that could cause Helpdesk ticket screens or automated checks to run out of memory when processing large numbers of tickets. The change makes ticket counting more efficient, improving reliability for teams with high ticket volumes.
Original PR description
**Traceback:** ```python ('helpdesk.helpdesk_ticket_menu_all', 117, 'Helpdesk > Tickets > All Tickets', 157): Traceback (most recent call last): File…
**Traceback:**
```python
('helpdesk.helpdesk_ticket_menu_all', 117, 'Helpdesk > Tickets > All Tickets', 157):
Traceback (most recent call last):
File "/tmp/tmpbeh7fp2m/migrations/base/tests/test_mock_crawl.py", line 259, in crawl_menu
self.mock_action(action_vals)
File "/tmp/tmpbeh7fp2m/migrations/base/tests/test_mock_crawl.py", line 272, in mock_action
return self.mock_act_window(action)
File "/tmp/tmpbeh7fp2m/migrations/base/tests/test_mock_crawl.py", line 432, in mock_act_window
mock_method(model, view, fields_list, domain, group_by)
File "/tmp/tmpbeh7fp2m/migrations/base/tests/test_mock_crawl.py", line 463, in mock_view_form
[data] = record.read(fields_list)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 3814, in read
return self._read_format(fnames=fields, load=load)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4045, in _read_format
vals[name] = convert(record[name], record, use_display_name)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 7031, in __getitem__
return self._fields[key].__get__(self)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 1303, in __get__
self.compute_value(recs)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 1485, in compute_value
records._compute_field_value(self)
File "/home/odoo/src/odoo/18.0/addons/base_automation/models/base_automation.py", line 816, in _compute_field_value
return _compute_field_value.origin(self, field)
File "/home/odoo/src/odoo/18.0/addons/mail/models/mail_thread.py", line 429, in _compute_field_value
return super()._compute_field_value(field)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5253, in _compute_field_value
fields.determine(field.compute, self)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 110, in determine
return needle(*args)
File "/home/odoo/src/enterprise/18.0/helpdesk/models/helpdesk_ticket.py", line 298, in _compute_partner_ticket_count
partner_tickets.fetch(['stage_id']) # prevent over-fetching fields, leading to potential out-of-memory error
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4095, in fetch
self.check_access('read')
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4394, in check_access
if not self.env.su and (result := self._check_access(operation)):
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4435, in _check_access
if domain and (forbidden := self - self.sudo().filtered_domain(domain)):
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 6627, in filtered_domain
data = record.mapped(key)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 6470, in mapped
recs = recs._fields[name].mapped(recs)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 1377, in mapped
self.__get__(first(remaining))
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 3059, in __get__
return super().__get__(records, owner)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 1266, in __get__
recs._fetch_field(self)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4071, in _fetch_field
self.fetch(fnames)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4108, in fetch
fetched = self._fetch_query(query, fields_to_fetch)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4197, in _fetch_query
rows = self.env.execute_query(query.select(*sql_terms))
File "/home/odoo/src/odoo/18.0/odoo/api.py", line 979, in execute_query
return [] if self.cr.description is None else self.cr.fetchall()
MemoryError
```
Issue:
------
The `_compute_partner_ticket_count` method caused a MemoryError while running the test cases due to the large number of records and over fetching of `stage_id` in the line: `partner_tickets.fetch(['stage_id'])`
followed by: `partner_tickets.filtered(lambda ticket: not ticket.stage_id.fold)`
Solution:
---------
Replaced the fetch and filtered logic with a search method to resolve the MemoryError and improve performance
upg-2707381
opw-4653413Miscellaneous changes
Revert odoo/enterprise#81587 because errors are triggered on dry-run. Also see discussion here: ref: https://github.com/odoo/enterprise/pull/82900#issuecomment-2800848343 Forward-Port-Of: odoo/enterprise#83422 Forward-Port-Of: odoo/enterprise#83391
Original PR description
Revert odoo/enterprise#81587 because errors are triggered on dry-run. Also see discussion here: ref: https://github.com/odoo/enterprise/pull/82900#issuecomment-2800848343 Forward-Port-Of: odoo/enterprise#83422 Forward-Port-Of: odoo/enterprise#83391
### Step to reproduce: - In the settings enable Multi-step routes - Inventory > Configuration > Warehouse Management > Warehouses - Put you warehouse in manufacturing in 2 steps - Create a bill of material for a final product FP with one raw: - 3 x COMP (storable product with 10 units in stock) - Create and confirm an MO for 1 unit of FP. > This create a picking from stock to preprod for 3 unit of COMP - In the shopfloor on your MO click on the 3 dots and add components - Register
Original PR description
### Step to reproduce: - In the settings enable Multi-step routes - Inventory > Configuration > Warehouse Management > Warehouses - Put you warehouse in manufacturing in 2 steps - Create a bill of…
### Step to reproduce:
- In the settings enable Multi-step routes
- Inventory > Configuration > Warehouse Management > Warehouses
- Put you warehouse in manufacturing in 2 steps
- Create a bill of material for a final product FP with one raw:
- 3 x COMP (storable product with 10 units in stock)
- Create and confirm an MO for 1 unit of FP.
> This create a picking from stock to preprod for 3 unit of COMP
- In the shopfloor on your MO click on the 3 dots and add components
- Register a new unit of COMP
> The picking from stock to pre-prod was updated twice, hence for 5 units
### Cause of the issue:
When you add a product from the shopfloor, we create a new move from pre-prod to virtual/production with the corresponding `product_uom_qty` of 1 and confirm it:
https://github.com/odoo/enterprise/blob/fc1fb4c56da916b165c43d8f6b6a4b903733a12f/mrp_workorder/wizard/additional_product.py#L63-L68 Since the procure method of this move has been adjusted, this confirmation will correctly create and run a procurement to generate a move from stock to pre-prod. Note that this part of the flow is strictly necessary if the additional product is not already part of the component raw of the MO. However, since in the present case there is already move raw from pre-prod to virtual/production associated to that product, the action confirm will also merge our additional move with the current existing one and hence modify its `product_uom_qty`. However, an override of mrp ensures that when such modification happen, we should also run the procurement to ensure that modifying the demand of a move will also update the related pickings:
https://github.com/odoo/odoo/blob/7def831bea18a91e4fa0f9c6aa6de34f4d6d18c8/addons/mrp/models/stock_move.py#L413-L419 Since we already run that same procurement we should bypass this call in our case.
opw-4562965
Forward-Port-Of: odoo/enterprise#82958
Forward-Port-Of: odoo/enterprise#81818Steps to reproduce: 1. Create a new BoM w/ a pass/fail operation step 2. Create a manufacturing order using that BoM 3. Go the the Quality app 4. Open the quality check created for the MO 5. Click on Pass (or Fail, does not matter) 6. Go back to the MO and click Produce All 7. The qty_passed/qty_failed is not computed on the quality check opw-4552103 Forward-Port-Of: odoo/enterprise#80291
Original PR description
Steps to reproduce: 1. Create a new BoM w/ a pass/fail operation step 2. Create a manufacturing order using that BoM 3. Go the the Quality app 4. Open the quality check created for the MO 5. Click on Pass (or Fail, does not matter) 6. Go back to the MO and click Produce All 7. The qty_passed/qty_failed is not computed on the quality check opw-4552103 Forward-Port-Of: odoo/enterprise#80291
Tests were moved to l10n_ch_hr_payroll_elm_account in https://github.com/odoo/enterprise/pull/64454 Forward-Port-Of: odoo/enterprise#83456 Forward-Port-Of: odoo/enterprise#81018
Original PR description
Tests were moved to l10n_ch_hr_payroll_elm_account in https://github.com/odoo/enterprise/pull/64454 Forward-Port-Of: odoo/enterprise#83456 Forward-Port-Of: odoo/enterprise#81018
### Issue: It is currently not possible to generate a return label with sendcloud if the delivery has been generated using a service point. ### Step to reproduce: - Set up Sendcloud, for a belgian company - Select bpost and dpd for delivery and returns while loading products - On a private window buy a storable product on the webstore online and select a sendcloud pickup point as the delivery method. - With an employee confirm the delivery order that was created #### > A problem occ
Original PR description
### Issue: It is currently not possible to generate a return label with sendcloud if the delivery has been generated using a service point. ### Step to reproduce: - Set up Sendcloud, for a belgian…
### Issue: It is currently not possible to generate a return label with sendcloud if the delivery has been generated using a service point. ### Step to reproduce: - Set up Sendcloud, for a belgian company - Select bpost and dpd for delivery and returns while loading products - On a private window buy a storable product on the webstore online and select a sendcloud pickup point as the delivery method. - With an employee confirm the delivery order that was created #### > A problem occured in the generation of the return label ### Cause of the issue: The `to_service_point` parameter is used by sendcloud's API in order to generate parcels and is added here: https://github.com/odoo/enterprise/blob/747482f34ca8210d89d81b3363ec5a8fc3a4ff6f/delivery_sendcloud/models/sendcloud_service.py#L109-L112 However, this parameter does not make sense in case of a return since the customer is allowed to return the product to the pickup point of its choice. In particular, sendcloud's API will fail to genrate the return parcel if it is expecting to link the label to a given pickup point. #### Note: Sendcloud also fails to generate the return label when the shipping provider is the same for the delivery and for the return, so that the `to_service_point` can just not be provided for return labels. opw-4562040 Forward-Port-Of: odoo/enterprise#83436 Forward-Port-Of: odoo/enterprise#83357
Currently, an error may occur when we try to export the trial balance with the SAT (XML) format. This is because a None id is used to browse the account, due to a more specific account_group. Steps to reproduce: - Install l10n_mx_reports. - Create an account_group with a more specific account, such as 401.01.01 - The 4, 401, and 401.01 groups are created with demo data. - Go to trial balance and try exporting with "SAT (XML)". An error will occur (`AttributeError: 'bool' object has
Original PR description
Currently, an error may occur when we try to export the trial balance with the SAT (XML) format. This is because a None id is used to browse the account, due to a more specific account_group.
Steps to reproduce:
- Install l10n_mx_reports.
- Create an account_group with a more specific account, such as 401.01.01
- The 4, 401, and 401.01 groups are created with demo data.
- Go to trial balance and try exporting with "SAT (XML)".
An error will occur (`AttributeError: 'bool' object has no attribute 'startswith'`) because the account is None, so account have no type.
opw-4716047
Forward-Port-Of: odoo/enterprise#83392
Forward-Port-Of: odoo/enterprise#83197**Steps to reproduce:** - Install Accounting and l10n_pe_edi - Switch to a Peruvian company (e.g. PE Company) - Configure Peruvian localization (https://www.odoo.com/documentation/17.0/applications/finance/fiscal_localizations/peru.html) - Create an invoice: * Customer: Comercial Constructora los Patitos S.A. * Operation Type: [0101] Internal sale * Invoice Lines: - Product: [any with a UNSPSC Category] - Taxes: 18% - Terms and Conditions: [text containing special cha
Original PR description
**Steps to reproduce:**
- Install Accounting and l10n_pe_edi
- Switch to a Peruvian company (e.g. PE Company)
- Configure Peruvian localization (https://www.odoo.com/documentation/17.0/applications/finance/fiscal_localizations/peru.html)
- Create an invoice:
* Customer: Comercial Constructora los Patitos S.A.
* Operation Type: [0101] Internal sale
* Invoice Lines:
- Product: [any with a UNSPSC Category]
- Taxes: 18%
- Terms and Conditions: [text containing special characters like '/' or '.']
- Confirm the invoice
- Process UBL 2.1
**Issue:**
In the XML, the content of <cbc:Note> has been stripped of all special characters like [/\!?+-=%.,;:()].
Only "whitespace" special characters should be excluded (i.e. '\n', '\u00A0',...).
opw-4659655
Forward-Port-Of: odoo/enterprise#82787Steps to reproduce: ------------------- * Install l10n_cl_edi_stock * Create a new Transfer * Add as customer a Contact that is part of a Company * Print Delivery Guide SII DTE 52 (CL) > Observation: Why the fix: ------------ The name of the company has to be shown not the actual name of ths customer Legal requirement in Chile ref: https://www.sii.cl/factura_electronica/formato_dte.pdf https://github.com/odoo/odoo/pull/172793 opw-4676871 Forward-Port-Of: odoo/enterprise#83311
Original PR description
Steps to reproduce: ------------------- * Install l10n_cl_edi_stock * Create a new Transfer * Add as customer a Contact that is part of a Company * Print Delivery Guide SII DTE 52 (CL) > Observation: Why the fix: ------------ The name of the company has to be shown not the actual name of ths customer Legal requirement in Chile ref: https://www.sii.cl/factura_electronica/formato_dte.pdf https://github.com/odoo/odoo/pull/172793 opw-4676871 Forward-Port-Of: odoo/enterprise#83311
The SP-API doesn't support SKU containing commas, not even when escaping and listing them in a correct CSV like string, as they'll be considered as either separate SKU or a different one, thus leading to an error saying there are too many identifiers, or not recognizing them anyway. In order to let the synchronization continue for the other items, ensure their SKU are valid beforehand. As from Amazon side, using a comma is a valid value, we can't constrain the SKU either. opw-4710435
Original PR description
The SP-API doesn't support SKU containing commas, not even when escaping and listing them in a correct CSV like string, as they'll be considered as either separate SKU or a different one, thus leading to an error saying there are too many identifiers, or not recognizing them anyway. In order to let the synchronization continue for the other items, ensure their SKU are valid beforehand. As from Amazon side, using a comma is a valid value, we can't constrain the SKU either. opw-4710435 Forward-Port-Of: odoo/enterprise#83367