Daily updates from Odoo
Navigate
Branch
Thursday, April 24, 2025
73 changes
2 changes
Resolved issues and error corrections
Double-clicking a table border in the HTML editor no longer selects an entire column or triggers an error when the cursor is outside the table. This makes table editing more predictable and prevents a disruptive crash scenario for users editing content.
Original PR description
**Current behavior before PR:** - Double-clicking on a table border would select the table column if the selection was inside a table cell. - If the selection was outside the table, a traceback will occur. **Desired behavior after PR is merged:** - Now, a table cell is now only selected when the double-click is performed inside the cell, not on its border. task:4730234
Miscellaneous changes
In this commit we remove checkDelay from codebase because it is no longer used since https://github.com/odoo/odoo/pull/194508 has been merged. 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#205606 Forward-Port-Of: odoo/odoo#205524
Original PR description
In this commit we remove checkDelay from codebase because it is no longer used since https://github.com/odoo/odoo/pull/194508 has been merged. 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#205606 Forward-Port-Of: odoo/odoo#205524
57 changes
New functionality added to Odoo
The update adds a guided submission wizard for EU OSS sales returns, making it easier for businesses to prepare and submit these tax returns. It also improves wording and adds a helpful link in the Belgian VAT return submission flow, reducing confusion for users.
Original PR description
[IMP] l10n_be_reports: VAT return: better phrasing + link in submission wizard [IMP] l10n_eu_oss_reports: add submission wizard for OSS return For now, only OSS Sales are supported through a return. OSS Imports will also be in the future.
A new Annual Statements report is available, combining the Balance Sheet, Profit and Loss, and Trial Balance into one report. This makes year-end financial review easier and is available across country-specific accounting report localizations.
Original PR description
This commit creates a new report named "Annual Statements". This new report is a composite of Balance Sheet, Profit and Loss, and Trial Balance. The report is also created for each country accounting reports localization. task-4418407
Users can now create a new journal entry directly from a document, bringing back a workflow similar to earlier document accounting actions. This streamlines accounting work by reducing manual steps when turning uploaded documents into financial records.
Original PR description
We add a new type of server action allowing to create account record from document similarly to the "work flow rule" of v17 (Create Vendor Bill, ...) on which the code is heavily inspired. Task-4711378
Enhancements to existing features
Manufacturing work center capacity can now be defined more flexibly by product, including a general capacity that applies to all products. Operation time and cost calculations have been updated accordingly, and the bill of materials overview is simplified to focus on core overview and forecast modes.
Original PR description
Change workcenter capacities: - no more default in the workcenter - but specific capacities per product optionally declined per unit. - no product means 'all products' Adapt the way capacities are used: - new fields cycle_number, time_total & cost - computed with depends_context Simplify BoM overview, keeping only 2 modes: overview & forecast
This update removes rarely used activity types from Belgian reporting and product lifecycle management so users see a more focused list of activity options. ECO approval reminders will now use standard to-do activities with clear summaries, reducing clutter without changing the underlying workflow.
This change removes leftover references to an old tax report activity category that had already been discontinued. It helps keep the accounting reports area cleaner and reduces the chance of confusing or unused options appearing in related activity views.
Original PR description
The 'tax_report' mail activity category has been removed by https://github.com/odoo/enterprise/commit/647699eeb4b8a1cc37ca074fa57844871c5086c1
Timesheet-related sales order line fields now show a “Non-billable” placeholder when no billable sales line is selected. This makes it easier for users to quickly recognize non-billable helpdesk work and reduces confusion when reviewing entries.
Original PR description
Added a Non-billable placeholder in the empty sales order line field, making it easier for users to identify non-billable entries. task-4123616
This update streamlines accounting setup by changing how fiscal positions, taxes, and account availability are managed. It reduces manual configuration, improves account selection for expenses, and aligns localization data with the newer accounting model.
Original PR description
TODO When PR is ready
Closed project tasks now appear with reduced opacity, making them visually distinct from active tasks. This helps teams scan project views more quickly and focus attention on work that is still open.
Original PR description
In this commit - - display closed tasks in a lower opacity than open tasks Task - 4378629
The audit trail is now enabled by default and offers better ways to search, filter, and group log messages. A restricted mode helps meet legal record-keeping requirements by preventing deletion of certain accounting-related records, with automatic activation for specific countries such as Germany.
Original PR description
Improve Audit Trail feature and make it default Adding filtering, searching and grouping by log messages Restricted mode follows GoBD restrictions, by preventing deletion of related records when a journal item is involved. For legal reasons, this setting is hidden and active by default in some specific cases (for german companies for example) task-4637051 Main modifications are in Community : - https://github.com/odoo/odoo/pull/203229 Upgrade PR : - https://github.com/odoo/upgrade/pull/7493
The Helpdesk and Studio areas were updated to stay aligned with recent changes to the Kanban “Add Column” experience. This mainly keeps automated checks current, helping ensure the redesigned workflow remains reliable for users.
Original PR description
This commit adapts test selectors following changes made in https://github.com/odoo/odoo/pull/204103. Part of task-4610829
The appraisal screens now use more consistent status colors and better text wrapping so information is easier to read. A low-value skills view was removed to simplify navigation and reduce clutter for users.
Original PR description
- update appraisal list state color to match kanban - remove kanban view for skill type as it does not add value - fix the wrap of name field on kanban to not hide behind the kanban ribbon Task: 4652810
This update improves the user experience around employee time off planning, especially in calendar-style planning views and payroll-related workflows. It helps HR and payroll teams better manage leave information and related warnings across supported country payroll setups.
Approval officers and administrators can now force approve requests they are allowed to oversee, helping unblock approval flows when needed. The update also prevents portal users from being selected as approvers and reduces unnecessary notifications by only sending them when a request status actually changes.
Original PR description
The security group approval officer or approval administrator allow the user to see every request. These managers should also be able to approve all requests. This commit: - Adds a "Force approval" action on the list and form view of the approval request that bypasses all approvers and set the request as approved. - Disable the possibility to choose a portal user as an approver - Only send approval/refusal notification (or mail) when the request status has changed and not every time an approver approves/refuses task-3002203
Contracts created from salary offers now stay archived until the offer is signed, helping avoid premature active contracts. If an offer is refused, the related contract is removed so HR records stay clean and accurate.
Original PR description
This PR improves the salary configuration process by refining contract handling. The contract will remain in an archived state until the offer signing process is completed. If the offer is refused during the process, the linked contract will be deleted. task-4581692
The Belgian salary package flow now includes mobility budget options directly in the standard Belgian HR salary module. This simplifies setup and gives Belgian employers and employees a more integrated way to manage mobility-related benefits in contracts and payslips.
Activities have been redesigned to be easier to understand and complete with fewer clicks. Related workflows and automated tests were updated across affected business apps to support the new experience and help keep day-to-day activity handling consistent.
Original PR description
This commit is a revamp of how activities work. It aims at making them easier to use and comprehend, as well as making many functions available in fewer clicks. To accomodate for these changes, a few tests/flows have to be changed. related earlier PRs (TDE): https://github.com/odoo/odoo/pull/206592 https://github.com/odoo/enterprise/pull/83687 https://github.com/odoo/upgrade/pull/7578 task-4592571
Social media communications for events with multiple time slots are now sent once for the overall event instead of once per slot. This prevents audiences from receiving repetitive posts while keeping event promotion clear and manageable.
Original PR description
For multi slots events, on the contrary of the current multi slots events mailing system, the social communications still need to be send once for the whole event, not for every slots. i.e. there is no need to send a social post before every exposition tour. Limit the social post communication once for the event even if multi slots. related: https://github.com/odoo/odoo/pull/205945 https://github.com/odoo/upgrade/pull/7565 Task-4307566
The IoT app now shows connected devices even when they do not have a supported driver. This gives teams better visibility when troubleshooting hardware that is connected but not working as expected.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/207043 Before this commit, only devices with supported drivers were shown in the IoT app. After this commit, a new device type 'Unsupported' is added, and the IoT box now sends us these unsupported devices. This can be helpful to debug when a device is not working as expected (e.g. blackbox serial device) task-4744357
Odoo’s bank reconciliation process has been redesigned with a clearer kanban-based workflow, making it easier for accounting teams to match bank statement lines with invoices, bills, or journal entries. The update removes some advanced configuration options to reduce complexity and improve day-to-day usability.
Original PR description
This commit introduces a revamped kanban view to process the bank statement lines and reconcile them with existing invoices/bills, or help the users to create the correct journal entry. RATIONALE:…
This commit introduces a revamped kanban view to process the bank statement
lines and reconcile them with existing invoices/bills, or help the users to
create the correct journal entry.
RATIONALE:
The previous reconciliation widget was not really user friendly, and was bloated
with a lot of advance features for niche use cases.
IMPLEMENTATION DETAILS:
* account.reconcile.model
- rule_type: writeoff_suggestion and invoice_matching entirely removed. Those
features are now directly hardcoded, users can't modify the sequence or
tweak the invoice matching algorithm anymore. We belief this was way too
advance and that people modifying the existing rules (and default behaviour)
would more likely break something rather than help the processing of their
statement lines
- partner mapping: although it's not possible anymore to do it on the partner
categories, it's still possible to define a partner mapping by creating an
account.reconcile.model with match_label & match_label_param, and a single
counter part item with the partner_id set and no account_id
- deleted fields: rule_type, matching_order, match_note, match_note_param,
match_transaction_details, match_transaction_details_param,
match_text_location_label, match_text_location_note,
match_text_location_reference, match_same_currency,
match_partner_category_ids, match_partner, past_months_limit,
decimal_separator, show_decimal_separator, partner_mapping_line_ids
(+class), allow_payment_tolerance, payment_tolerance_type,
payment_tolerance_param, counterpart _type, journal_id, number_entries
- field auto_reconcile changed name & type (was boolean): it's replaced with
the selection field 'trigger'
- to_check boolean: would now be implemented with next_activity_type that you
can set on the account.reconcile.model
* account.bank.statement.line
- Revamp of the whole javascript with a clear subdivision into
multiple components. We used a Kanban view that we completely override for
our needs which are that each kanban record will display the information of
a bank statement line (belonging to a journal) that we can unfold to show
more information. When unfolding the bank statement line the user will have
access to different buttons allowing him to directly modify the move behind
the bank statement line (adding new line, delete some, editing them, ...)
- The old bank rec widget was using two python file bank.rec.widget and
bank.rec.widget.line that were temporary models to display a representation
of the move before being validated and once it was validated the move was
changed. Those two classes were removed.
We now change directly the move because we want an auto validation. It means
that everytime a new line is added a reconciliation process is done.
- To link the move line of the bank statement line with the move line chosen
in the reconcile search view and also to trigger the reconciliation
process, we used a manyToMany field compute non stored with an inverse.
Everytime the field is written on, the reconciliation plan will be
triggered. It allows to have a link between reconciled entries without the
need of a stored field since we benefit from the partial reconcile table.
- Delete: bank.rec.widget, bank.rec.widget.line, views linked to
bank_rec_widget that are not used anymore
Co-authored by: malb <malb@odoo.com>
Co-authored-by: flg <flg@odoo.com>
Co-authored by: qdp <qdp@odoo.com>
task-4603207Users uploading a PDF to prepare it for signing will now see a warning if they try to leave before saving it as a template or sending it for signature. This helps prevent accidental loss of document setup work and gives users the option to save or discard their changes.
Original PR description
Before this commit, if a user uploaded a PDF using the "Upload a PDF and sign" button, added fields to the document, and then left without saving or sending it for signing, all progress would be lost. In this commit, when a user tries to leave a document that hasn't been saved as a template or sent for signing, a warning dialog will appear. It informs the user that the document will no longer be available if not saved. The user can choose to save the document from the dialog if needed, or discard it if they don't want to keep the changes. task-4164228
Resolved issues and error corrections
This fix ensures a required access rule file is included when the Planning Attendance app is installed or updated. It helps prevent permission-related issues for users working with planning and attendance data.
AI field processing now follows a clearer order and the related prompt code has been simplified, making behavior more predictable. The update also fixes an issue that prevented regular users from saving approved AI prompt expressions, reducing friction for day-to-day use.
Original PR description
…cation Task-4742523
The payroll accounting partner bank view has been adjusted so fields remain properly aligned after a related partner field was moved. This prevents a visual layout gap and keeps the form easier for users to read and complete.
Original PR description
- as the `partner_id` place changed in the view the empty div is missing the arragment Task: 4531266
This fixes a missing setup entry that prevented point of sale IoT connection requests from being accepted by the IoT Box. Businesses using connected POS hardware should see more reliable communication with their IoT Box.
Original PR description
The manifest was missing the path to the longpolling override in the IoT module. As a result, no longpolling call was signing their request and the IoT Box refused them.
The GST reporting flow now prevents users from creating duplicate return periods for the same month or quarter. This improves filing accuracy and avoids confusion when return periods are created around the government portal deadline window.
Original PR description
Steps to Reproduce: =================== The user creates a GST return period for example January 2025 between 1st - 10th April. After 10th April, the user creates another GST return period for…
Steps to Reproduce: =================== The user creates a GST return period for example January 2025 between 1st - 10th April. After 10th April, the user creates another GST return period for January 2025. The system allows the creation of a duplicate record. Reason: ======= As per GST filing rules, the return period for the previous month can be filed on the government portal until the 10th of the following month. The system automatically sets the month and quarter values to the previous month and previous quarter respectively if the current date is between the 1st and 10th of a month, when the periodicity is set to monthly or quarterly. Cause: ====== Both records are considered different by the system based on the quarter value or month value and the system does not block the creation of duplicate GST return periods. Technical: ========== Modified the SQL constrains into two separate constrains for checking unique return period monthly and quarterly. Also, changed the default method to the compute method and added quarter logic in the creation of the Return period from the 'fetch from GSTN` button. Changed the quarter's key because with the start month, it's considered as IFF **UPGRADE PR:** https://github.com/odoo/upgrade/pull/7270 **Task**-4534812
VoIP contact loading no longer fails for users who do not have permission to view recruitment applicant records. Applicant details are now only included when the user is allowed to access them, improving reliability while respecting existing access rules.
Original PR description
Before this commit, the code unconditionnally reads and sends hr.applicant records linked to a VoIP contact, leading to a crash in case the current user doesn't have access to hr.applicant records. After this commit, applicant data are only sent if the user has access to hr.applicant.
Features or functions removed from Odoo
This change removes unused code from the field service sales area. It helps keep the system easier to maintain without changing how users work with the product.
Original PR description
Removing the dead code
This work removes an outdated menu definition from the web client setup and updates related tests and portal templates so the interface continues to behave consistently. The change mainly affects navigation and internal validation across accounting, documents, knowledge, web enterprise, and studio areas.
The Documents Accounting app no longer includes the old Tax Statement and Financial Statement activity types. These reminders were tied to an earlier workflow for accounting firms and have been replaced by newer accounting returns functionality, reducing clutter for users.
Original PR description
Remove {Tax, Financial} Statement activity types. There were linked to development targetting *fiduciaires* but are nox replaced by better feature, notably accounting returns feature.
Followup of odoo#206592
Task-4592571Odoo no longer supports Adam weighing scales in IoT and delivery/POS scale workflows because they were unused and could be incorrectly detected as other serial devices. This reduces device-detection conflicts, especially with Belgian blackboxes, while aligning customers toward supported scale hardware.
Original PR description
This PR removes the code responsible for the detection and communication with Adam scales. These scales had no reliable way of detecting them as such, with the code always detecting every single serial connection as an Adam scale. Since Adam scales have been added to Odoo year s agom there are 0 existing (even archived) tickets in support concerning them, we are recommen ding Mettler Toledo scales to our clients and most importantly they interfere with the detectio n of belgian blackboxes we delete the problematic code and thus the support of these unused sca les. It also removes the associated 'manual_measurement' field and all of the associated fields and methods Associated Odoo PR: https://github.com/odoo/odoo/pull/206832 Associated upgrade PR: https://github.com/odoo/upgrade/pull/7589
Code cleanup and technical improvements
Spreadsheet relation filters now use the shared cached lookup mechanism when showing record names. This keeps the enterprise spreadsheet code aligned with the main platform change and can reduce repeated data requests, improving responsiveness without changing user workflows.
Original PR description
This commit adapts enterprise code to https://github.com/odoo/odoo/pull/206464 Task: 4735879
HR now gets a dedicated Employees folder with a folder for each employee, helping HR teams centralize employee documents without automatically exposing them to employees. Payslips and payroll documents are shared through employee My Drive links or secure email links, with an option to resend payslip access when needed.
Original PR description
Purpose ======= The goal is to have a folder for each employee where HR Officers can easily centralize the necessary documents, without the employee having access by default. If an employee needs a…
Purpose ======= The goal is to have a folder for each employee where HR Officers can easily centralize the necessary documents, without the employee having access by default. If an employee needs a document, it can simply be shared with them, allowing them to find it in "shared with me". HR > Employees > Alain (avw) About Payroll ------------------- We consider that Payroll does not need to access other document sources beyond those already available to HR Officers. Therefore, Payroll will use the documents from each employee’s folder when necessary. If Payroll requires additional documents, they will add them directly to the employee’s folder. It is unlikely that these documents would be inaccessible to HR Officers. In exceptional cases, Payroll can always manually create a specific folder, which is not a real issue. Regarding payslips, they will be integrated into document only for the employee via “My Drive”: Specifications =========== - 'Payroll' folder become 'Employees' folder and a sub folder is created for each employee (with or without user) - Allow portal users to own root documents (mandatory to have a my drive) - Add a button to display the document permission panel on the configured 'Employees folder', directly from the settings. - Automatically send an access link to the private email address (fallback work email) for payslips that are put to done - Remove the Send HR Documents Access Link - Add on the form view of a payslip and in list/kanban view of the payslips an option to "Resend Payslip" in the gear icon See more details on sub-commits. Task-4309991
The VoIP code was reorganized to use standard browser capabilities directly instead of relying on an internal wrapper. This is an internal cleanup that should make the feature easier to maintain without changing how users make or receive calls.
Original PR description
In the past, all browser function/objects were used through the `browser` object. Now, the only property that you need to use through `browser` is `location`. For everything else you can use global functions/objects by calling them directly.
Miscellaneous changes
Adding a condition to match contry to CO when looking for NIT latam ID type. therwise, adding another ID type named 'NIT' for a different country causes the search to return both, resulting in a traceback. task-4318265 Forward-Port-Of: odoo/enterprise#83859 Forward-Port-Of: odoo/enterprise#81216
Original PR description
Adding a condition to match contry to CO when looking for NIT latam ID type. therwise, adding another ID type named 'NIT' for a different country causes the search to return both, resulting in a traceback. task-4318265 Forward-Port-Of: odoo/enterprise#83859 Forward-Port-Of: odoo/enterprise#81216
The server actions were modified[^1] to create the children actions from this data file instead of referencing actions from the module Documents. This is a problem since these actions reference tags that might not exist in the database, breaking the process. By using the forcecreate flag we can create the tags if they are missing. To reproduce: - Install Documents. - Delete one or more of the referenced tags. - Install documents_account. This also happens during upgrades when the tag
Original PR description
The server actions were modified[^1] to create the children actions from this data file instead of referencing actions from the module Documents. This is a problem since these actions reference tags that might not exist in the database, breaking the process. By using the forcecreate flag we can create the tags if they are missing. To reproduce: - Install Documents. - Delete one or more of the referenced tags. - Install documents_account. This also happens during upgrades when the tags are missing and the module is auto-installed. ``` ValueError: External ID not found in the system: documents.documents_tag_inbox odoo.tools.convert.ParseError: while parsing /home/odoo/src/enterprise/saas-18.2/documents_account/data/ir_actions_server_data.xml:6, somewhere inside <record id="ir_actions_server_create_vendor_bill" model="ir.actions.server" forcecreate="0"> ``` [^1]: https://github.com/odoo/enterprise/pull/76004 Forward-Port-Of: odoo/enterprise#82546
**Steps to reproduce:** - Install Accounting - Activate a foreign currency (e.g. EUR) - Make sure there are several rates with today rate different than others - Go to "Accounting / Configuration / Accounting / Chart of Accounts" - Add a default tax to "Expenses" account - Create an invoice: * Customer: [any] * Currency: [EUR] (i.e. the foreign currency) * Invoice Date: [a date in the past where the currency rate is different than today] * Invoice Lines: [any] - Confirm th
Original PR description
**Steps to reproduce:** - Install Accounting - Activate a foreign currency (e.g. EUR) - Make sure there are several rates with today rate different than others - Go to "Accounting / Configuration /…
**Steps to reproduce:** - Install Accounting - Activate a foreign currency (e.g. EUR) - Make sure there are several rates with today rate different than others - Go to "Accounting / Configuration / Accounting / Chart of Accounts" - Add a default tax to "Expenses" account - Create an invoice: * Customer: [any] * Currency: [EUR] (i.e. the foreign currency) * Invoice Date: [a date in the past where the currency rate is different than today] * Invoice Lines: [any] - Confirm the invoice - Go to "Accounting / Reporting / Management / Unrealized Currency Gains/Losses" - Set date filter to "Today" - If there is no adjustement to do, check if the following message is displayed: "You are using custom exchange rates. => Reset to Odoo’s Rate" If it's the case, reset to Odoo's rate (i.e. Today's rate) - Click on "Adjustement Entry" button: * Journal: Miscellaneous Operations * Expense Account: Expenses * Income Account: [any] - Create Entry **Issue:** The values (debit/credit) of the created entry are 0, which is not the case when there is no default tax on the expense account. **Cause:** "_sync_dynamic_lines" is executed on the created entry. If a default tax is set on the expense account, "_sync_tax_lines" is also executed. As only debit and credit values are set on the invoice lines of the entry (neither balance nor amount_currency), the sync method messes up with the value of debit and credit, resetting them to 0 (via multiple recompute). **Solution:** Skip invoice sync. The values computed in "Multicurrency Revaluation Wizard" should be the ones that are used. opw-4664255 Forward-Port-Of: odoo/enterprise#83570
steps to reproduce: - set up ONSS data about the company in Payroll settings / BE L10N (where ONSS number is consisting of special characters - dots or dashes) - go to Payroll / Reporting / DMFA - create a new DMFA and generate an XML report - it should throw error saying expected `int` (since ONSS is a Char field) fix: - while performing the export, filtered the digits only from these fields task-4502689 Forward-Port-Of: odoo/enterprise#80876
Original PR description
steps to reproduce: - set up ONSS data about the company in Payroll settings / BE L10N (where ONSS number is consisting of special characters - dots or dashes) - go to Payroll / Reporting / DMFA - create a new DMFA and generate an XML report - it should throw error saying expected `int` (since ONSS is a Char field) fix: - while performing the export, filtered the digits only from these fields task-4502689 Forward-Port-Of: odoo/enterprise#80876
-- Context -- When no seller is defined on the product that is included in the approval request, you cannot generate an RFQ. Adding a seller in the product should allow creating the RFQ without re-setting the request to draft. -- Behavior before the fix -- You had to reset the request to draft before being able to generate the RFQ when a seller has been added to the product. -- Behavior after the fix -- You can. There was a missing field in the depends of the compute method for the sell
Original PR description
-- Context -- When no seller is defined on the product that is included in the approval request, you cannot generate an RFQ. Adding a seller in the product should allow creating the RFQ without re-setting the request to draft. -- Behavior before the fix -- You had to reset the request to draft before being able to generate the RFQ when a seller has been added to the product. -- Behavior after the fix -- You can. There was a missing field in the depends of the compute method for the seller ids. task-4680780 Forward-Port-Of: odoo/enterprise#83876 Forward-Port-Of: odoo/enterprise#82874
This work appears to adjust how Documents and Knowledge pages are handled, but the pull request details are still marked as work in progress. The likely business impact is limited until the final purpose and user-facing behavior are clarified.
### Steps to reproduce: - Accounting > Reporting > Partner Ledger - Select multiple partners - Select "Customer Statements" as report - Click "Send" - Go to the one of the partner in question an dopen the generated PDF - All current companies show in the header and other currencies are present ### Cause: When sending to multiple partners, the action is dispatched with to cron_threads so a new `env` is created. This `env` has a key `companies` containing all companies that exist in the
Original PR description
### Steps to reproduce: - Accounting > Reporting > Partner Ledger - Select multiple partners - Select "Customer Statements" as report - Click "Send" - Go to the one of the partner in question an…
### Steps to reproduce: - Accounting > Reporting > Partner Ledger - Select multiple partners - Select "Customer Statements" as report - Click "Send" - Go to the one of the partner in question an dopen the generated PDF - All current companies show in the header and other currencies are present ### Cause: When sending to multiple partners, the action is dispatched with to cron_threads so a new `env` is created. This `env` has a key `companies` containing all companies that exist in the DB. When the `_init_options_companies` is called for the report it adds `self.env.companies` to the option ([code](https://github.com/odoo/enterprise/blob/4ef74fd9527a28616bf81c9716d6000aa25b839e/account_reports/models/account_report.py#L1276)). So in the end all companies appear on the report. ### Solution: Add 'forced_companies' in the options before calling the `cron`. The format of 'forced_companies' had to be changed to only contain ids because fields cannot be added in `send_and_print_values` as it's a JSON fields. opw-4635283 Forward-Port-Of: odoo/enterprise#83862 Forward-Port-Of: odoo/enterprise#82320
This reverts commit cbcff76a94750a6759fd72d9c952d785e603a974. Fix in community was changing all the xml files generated, whereas it should only have had an impact on the invoice report. opw-4661577 Forward-Port-Of: odoo/enterprise#83827 Forward-Port-Of: odoo/enterprise#83783
Original PR description
This reverts commit cbcff76a94750a6759fd72d9c952d785e603a974. Fix in community was changing all the xml files generated, whereas it should only have had an impact on the invoice report. opw-4661577 Forward-Port-Of: odoo/enterprise#83827 Forward-Port-Of: odoo/enterprise#83783
Before this commit: The technical name was not clearly visible in dark mode, making it difficult for users to read. After this commit: The technical name is now clearly visible in dark mode. Task-4680365 Forward-Port-Of: odoo/enterprise#82429
Original PR description
Before this commit: The technical name was not clearly visible in dark mode, making it difficult for users to read. After this commit: The technical name is now clearly visible in dark mode. Task-4680365 Forward-Port-Of: odoo/enterprise#82429
Steps to reproduce: - insert a pivot into a spreadsheet - add the dynamic pivot somewhere with the formula =PIVOT(1) - right click on the values and sort them - open the side panel - update anything (e.g. the domain) => the sorting is dropped. Since commit 93ffeeefe86, measures are identified with the `id` property, not the name. Task: 4746057 opw-4741934 Forward-Port-Of: odoo/enterprise#83903
Original PR description
Steps to reproduce: - insert a pivot into a spreadsheet - add the dynamic pivot somewhere with the formula =PIVOT(1) - right click on the values and sort them - open the side panel - update anything (e.g. the domain) => the sorting is dropped. Since commit 93ffeeefe86, measures are identified with the `id` property, not the name. Task: 4746057 opw-4741934 Forward-Port-Of: odoo/enterprise#83903
Steps: - duplicate a worksheet template - add a field on the new template - print the original template --> error : field doesn't exist on original worksheet model Current behaviour: Duplicating a worksheet template creates a new model, but the _generate_qweb_report_template method doesn't create a new view for the new template because we copied the original one. It also removes the customizations on the original template's view New behaviour: A new view is created for the dupli
Original PR description
Steps: - duplicate a worksheet template - add a field on the new template - print the original template --> error : field doesn't exist on original worksheet model Current behaviour: Duplicating a worksheet template creates a new model, but the _generate_qweb_report_template method doesn't create a new view for the new template because we copied the original one. It also removes the customizations on the original template's view New behaviour: A new view is created for the duplicated template and remove the duplicate option from the list view, as it is already hidden in form view opw-4664600 opw-4656835 Forward-Port-Of: odoo/enterprise#83529 Forward-Port-Of: odoo/enterprise#83166
In this PR we add the following wage types: - Complementary LPP - Alimony Deduction - Deduction for prosecution office Forward-Port-Of: odoo/enterprise#83885
Original PR description
In this PR we add the following wage types: - Complementary LPP - Alimony Deduction - Deduction for prosecution office Forward-Port-Of: odoo/enterprise#83885
**Steps to reproduce:** - Install Accounting - In Bank journal settings, make sure that there's no Outstanding Payments account - Create a bill for a customer - Confirm it - Create a second bill for the same customer - Confirm it - Go to the bills list - Select the 2 created bills - Create a payment via "Pay" button: * Journal: Bank * Payment Method: Manual Payment * Group Payments: [checked] - Do not validate the payment - Go to "Accounting / Vendors / Payments" - Selec
Original PR description
**Steps to reproduce:** - Install Accounting - In Bank journal settings, make sure that there's no Outstanding Payments account - Create a bill for a customer - Confirm it - Create a second bill for…
**Steps to reproduce:** - Install Accounting - In Bank journal settings, make sure that there's no Outstanding Payments account - Create a bill for a customer - Confirm it - Create a second bill for the same customer - Confirm it - Go to the bills list - Select the 2 created bills - Create a payment via "Pay" button: * Journal: Bank * Payment Method: Manual Payment * Group Payments: [checked] - Do not validate the payment - Go to "Accounting / Vendors / Payments" - Select the created payment and create a batch - Validate the batch payment => The payment status of both bills is "In Payment" - From Accounting dashboard, go to transactions of Bank journal (reconciliation widget) - Create a new transaction for the previous customer with the amount of the batch payment - In the reconciliation widget, go to "Batch Payments" tab - Select the created batch payment - Validate to reconcile - Check the bills list **Issue:** Only one of the bills has its payment status set to "Paid", the other one staying in "In Payment" status. **Cause:** In the method that checks which account move lines are included in the batch payment, we loop on each linked move line and take the "min" between the remaining amount of the batch payment and the amount of the move line until the remaining amount reaches 0. However, for vendor bills, these amounts are negative and taking the "min" amount returns the remaining amount directly, resulting in only having 1 move line set to reconcile. opw-4595006 Forward-Port-Of: odoo/enterprise#83634
Fix certificate generation for AR companies when other LATAM countries are installed. opw-4584457 Forward-Port-Of: odoo/enterprise#82527
Original PR description
Fix certificate generation for AR companies when other LATAM countries are installed. opw-4584457 Forward-Port-Of: odoo/enterprise#82527
The lack of a wait on the pdf's iframe causes a race condition in `sign/static/src/components/sign_request/document_signable.js`, which *can* cause the PDFIframe's `contentDocument` to be reset in the setTimeout(() => this.initializeIframe(), 1); interval as the document ?gets reinitialised?, leading to an error in `initializeIframe`. I assumed it would be necessary to wait for the iframe's `readyState` to be `"complete"`, however after the iframe triggers I was not able to "see" th
Original PR description
The lack of a wait on the pdf's iframe causes a race condition in `sign/static/src/components/sign_request/document_signable.js`, which *can* cause the PDFIframe's `contentDocument` to be reset in the
setTimeout(() => this.initializeIframe(), 1);
interval as the document ?gets reinitialised?, leading to an error in `initializeIframe`.
I assumed it would be necessary to wait for the iframe's `readyState` to be `"complete"`, however after the iframe triggers I was not able to "see" the frame in any other `readyState`, so seems like an unnecessary complexity after all. Hopefully this doesn't come back to bite...
https://runbot.odoo.com/odoo/error/181583
Forward-Port-Of: odoo/enterprise#83937-- How to reproduce -- Duplicate two or more belgian employees. -- Reason -- The sdworx code check constraint was wrongly single record. -- Fix -- This commit fixes the issue by converting the check to multi records. task-4708324 Forward-Port-Of: odoo/enterprise#83852 Forward-Port-Of: odoo/enterprise#83026
Original PR description
-- How to reproduce -- Duplicate two or more belgian employees. -- Reason -- The sdworx code check constraint was wrongly single record. -- Fix -- This commit fixes the issue by converting the check to multi records. task-4708324 Forward-Port-Of: odoo/enterprise#83852 Forward-Port-Of: odoo/enterprise#83026
Coming From: https://github.com/odoo/enterprise/pull/69708 Forward-Port-Of: odoo/enterprise#83789
Original PR description
Coming From: https://github.com/odoo/enterprise/pull/69708 Forward-Port-Of: odoo/enterprise#83789
Steps: - Go to Payroll > Salary Structures > Stipend > Net. - Check 'Python Code' in Computation. - Generate payslip and check accounting/payment entries. Issue: - Net salary rule did not include the GROSS category. - Net salary rule includes the BASIC category which is unnecessary. - Stipend amount was not reflected in reports and COA entries. Fix: - Removed the 'BASIC' amount calculation to the net salary rule for the stipend. - Added the 'GROSS' amount calculation to the net sal
Original PR description
Steps: - Go to Payroll > Salary Structures > Stipend > Net. - Check 'Python Code' in Computation. - Generate payslip and check accounting/payment entries. Issue: - Net salary rule did not include the GROSS category. - Net salary rule includes the BASIC category which is unnecessary. - Stipend amount was not reflected in reports and COA entries. Fix: - Removed the 'BASIC' amount calculation to the net salary rule for the stipend. - Added the 'GROSS' amount calculation to the net salary rule for the stipend. - Ensured that stipend amounts are included in reports and COA by updating the net salary rule logic. Task - 4668024 Forward-Port-Of: odoo/enterprise#83123
*: 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 al
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) Forward-Port-Of: odoo/enterprise#83750 Forward-Port-Of: odoo/enterprise#83443
The UAN, PAN and ESIC number fields on the IN employee have a unique constraint. However, they are not set to not being copied upon record duplication, which would cause duplication impossible. This PR fixes the issue by not copying the value of those field upon duplication. task-4708324 Forward-Port-Of: odoo/enterprise#83029
Original PR description
The UAN, PAN and ESIC number fields on the IN employee have a unique constraint. However, they are not set to not being copied upon record duplication, which would cause duplication impossible. This PR fixes the issue by not copying the value of those field upon duplication. task-4708324 Forward-Port-Of: odoo/enterprise#83029
Since we didn't wait for synchronization when clicking on the order button, tours are too fast and the response from the server isn't received in time. This commit adds a wait to ensure that the synchronization is complete before proceeding with the next step. Runbot: 181579 Forward-Port-Of: odoo/enterprise#83795
Original PR description
Since we didn't wait for synchronization when clicking on the order button, tours are too fast and the response from the server isn't received in time. This commit adds a wait to ensure that the synchronization is complete before proceeding with the next step. Runbot: 181579 Forward-Port-Of: odoo/enterprise#83795
In this PR we modify the gantt_model to only display 1 day/week/month at a time Forward-Port-Of: odoo/enterprise#83505
Original PR description
In this PR we modify the gantt_model to only display 1 day/week/month at a time Forward-Port-Of: odoo/enterprise#83505
This commit modifies Elvera and Roque demo data for hr mexican localization target: 17.0 -> master task-4486643 Forward-Port-Of: odoo/enterprise#82526 Forward-Port-Of: odoo/enterprise#78048
Original PR description
This commit modifies Elvera and Roque demo data for hr mexican localization target: 17.0 -> master task-4486643 Forward-Port-Of: odoo/enterprise#82526 Forward-Port-Of: odoo/enterprise#78048
14 changes
New functionality added to Odoo
Belgian payroll declarations can now be sent to and synchronized with the official ONSS portal through a dedicated SFTP connection. This reduces manual handling of DmfA files, improves compliance workflows, and includes fixes that make declaration generation and signature handling more reliable.
Resolved issues and error corrections
Users can now assign credit card journals when linking online accounts, matching the existing behavior for bank journals. This fixes a selection limitation in the online synchronization setup and helps keep credit card account connections properly organized.
Original PR description
In the account online link form view, you have a tab with the tree view of the existing online accounts. In that tab, you can directly assign a bank journal to an online account. But you can't do it for credit card journal as they were not added to the domain. This PR adds the credit type journal in two domains. opw-4698397
Bank statement lines imported through bank synchronization now keep the correct transaction date even when a default invoice or bill date is configured. This prevents misleading accounting dates and reduces the risk of reconciliation or reporting errors.
Original PR description
The date used in statement lines is invalid when lines are created via bank synchronization, and the user has configured a default date for the Invoice/Bill Date field. Steps to reproduce: - Set a default value for the Invoice/Bill Date field. - Connect to Demo Bank and import the test statement line. - Check the statement line date; it will use the default Invoice/Bill Date value instead of the correct one. The issue comes from the fact that during the `st_line.move_id.write(to_write)`, the date field gets considered 'dirty' by the ORM (unless it is explicitly set in the vals), and when the `account.move.line` tries to set-up its date, which is related to the move, the compute method for the date is triggered as the field was flagged as dirty. opw-4662209
Approval purchase requests now allow RFQ creation as long as the product has a vendor, even if the requested quantity does not match a vendor pricing rule. This prevents valid purchase requests from being blocked unnecessarily and keeps purchasing workflows moving.
Original PR description
This commit backports a change done in https://github.com/odoo/enterprise/pull/83876. The check on the product vendor was based on the `_select_seller` method, which does not give any result if the quantity does not match any vendor. However, the check should be more permissive and allow the RFQ creation if a vendor exists, no matter the quantity. Part of task-4680780 Backport of https://github.com/odoo/enterprise/pull/83876
Odoo now checks incoming UrbanPiper orders to avoid creating duplicate draft orders when the same delivery request is received through multiple domain webhooks. This helps businesses keep point-of-sale delivery orders accurate and reduces manual cleanup.
Original PR description
In this commit, --------------- When multi-domains are configured in Odoo, it will generate various webhooks at UrbanPiper, which leads to the creation of duplicate draft orders along with the original order. Added a check to restrict duplicate orders with the same delivery ID and the same delivery provider. task - 4727174
Miscellaneous changes
**Issue** Menu items starting with helpdesk in their URL were not dispalyed to the public user in some cases. **Steps to reproduce** - Have `website_helpdesk` installed. - Activate the website form for a helpdesk team. - Create a menu item for the website, using a URL starting with helpdesk, e.g. `/helpdesk-123-test` - This menu is always invisible to the public user. **Cause** This issue was fixed in previous versions, but it appears the duplicated `_compute_visible` code present
Original PR description
**Issue** Menu items starting with helpdesk in their URL were not dispalyed to the public user in some cases. **Steps to reproduce** - Have `website_helpdesk` installed. - Activate the website form…
**Issue** Menu items starting with helpdesk in their URL were not dispalyed to the public user in some cases. **Steps to reproduce** - Have `website_helpdesk` installed. - Activate the website form for a helpdesk team. - Create a menu item for the website, using a URL starting with helpdesk, e.g. `/helpdesk-123-test` - This menu is always invisible to the public user. **Cause** This issue was fixed in previous versions, but it appears the duplicated `_compute_visible` code present in `website.py` was not deleted in forward ports of the fix (see enterprise PR 63105). https://github.com/odoo/enterprise/blob/b320390d23d3f009beb809e0334c8fa61c44d824/website_helpdesk/models/website.py#L24-L26 As a result, the menu item starting with `/helpdesk` is matched as a helpdesk menu, but will logically not be part of the helpdesk published menus: https://github.com/odoo/enterprise/blob/b320390d23d3f009beb809e0334c8fa61c44d824/website_helpdesk/models/website.py#L30-L32 opw-4560291 Forward-Port-Of: odoo/enterprise#82824
Open Trial Balance report in debug mode Access report options In Column tab, check 'Blank if Zero' for all columns Go back to report Issue: If Initial/End Balance columns are blank, also the total line will be blank. This occurs since f3c230817087d452f810b8473f813add0ead30d0 were the formatting of values has been delayed to improve performances but the exception on 'blank_if_zero' was lost opw-4624006 Forward-Port-Of: odoo/enterprise#83493
Original PR description
Open Trial Balance report in debug mode Access report options In Column tab, check 'Blank if Zero' for all columns Go back to report Issue: If Initial/End Balance columns are blank, also the total line will be blank. This occurs since f3c230817087d452f810b8473f813add0ead30d0 were the formatting of values has been delayed to improve performances but the exception on 'blank_if_zero' was lost opw-4624006 Forward-Port-Of: odoo/enterprise#83493
Currently, when validating deliveries, if multiples attachments are posted in the same chatter message, the printing jobs do not complete. Steps to reproduce: ------------------- * Install fedex * In operation types, select Delivery Orders then hardware * In print on validation, enable Carrier Labels and Export Documents * In the shipping methods, select fedex international * Change Label format to ZPL11 * Connect the database to an iot box * Set up the shipping labels to be send on z
Original PR description
Currently, when validating deliveries, if multiples attachments are posted in the same chatter message, the printing jobs do not complete. Steps to reproduce: ------------------- * Install fedex * In…
Currently, when validating deliveries, if multiples attachments are posted in the same chatter message, the printing jobs do not complete. Steps to reproduce: ------------------- * Install fedex * In operation types, select Delivery Orders then hardware * In print on validation, enable Carrier Labels and Export Documents * In the shipping methods, select fedex international * Change Label format to ZPL11 * Connect the database to an iot box * Set up the shipping labels to be send on zebra printer * Set up commercial invoice (/invoice) to be sent to another printer * Create a sale order, using fedex international as shipping * Confirm the SO * Select the delivery * Validate the delivery > Observation: Nothing prints, jobs are sent to CUPS bu not printing Why the fix: ------------ https://github.com/odoo/enterprise/blob/8075101192fb81a78f2a984cf2adf67fc77c0194/delivery_fedex_rest/models/delivery_fedex.py#L192-L196 As show, when sending the shipping, if the invoice is generated, it gets added to the attachements. The function `message_post` will post all attachments in the same chatter message. In `delivery_iot` the `message_post` function is overridden to allow sending the printing jobs to the iot. https://github.com/odoo/enterprise/blob/8075101192fb81a78f2a984cf2adf67fc77c0194/delivery_iot/models/stock_picking.py#L33-L46 Here, `attachments_names` will both contain `Label` and `ShippingDoc`. Since we enter the first if condition, the report is related to the shipping labels. Then we send the data related to all attachments to the device linked to the shipping labels, aka the zebra printer. Since the other attachment is of type PDF, the zebraprinter does not know what to do with it and ends up printing nothing. Since we can have multiple different attachment, the if/elseif condition does not make sense. By breaking it in two if, we can send both reports separately, while still keeping all attachments in the same chatter message. opw-4546715 Forward-Port-Of: odoo/enterprise#82094
Issue : Given a pivot grouped by date with anything else than year as aggregate (I tried with week, quarter and month), Given the pivot is exploded When I autofill the date cells and the date passes from one year to another, it crashes hard New behaviour: For bounded date fields, the autofill loop around when reaching the upper bound. Task: 4700703 Forward-Port-Of: odoo/enterprise#82980
Original PR description
Issue : Given a pivot grouped by date with anything else than year as aggregate (I tried with week, quarter and month), Given the pivot is exploded When I autofill the date cells and the date passes from one year to another, it crashes hard New behaviour: For bounded date fields, the autofill loop around when reaching the upper bound. Task: 4700703 Forward-Port-Of: odoo/enterprise#82980
- Adding 'invoice_received' as an accepted state in account_move.py -> _compute_l10n_mx_edi_cfdi_state_and_attachment to enable SAT status display on vendor bills in 17.0, making SAT status no longer remain None. - Making adjustments to functions updating SAT status related fields for vendor bills. - Adding a test for SAT status for creating and cancelling vendor bills. The change necessary to display 'Update SAT' button was already implemented in 17.0 in https://github.com/odoo/enterpr
Original PR description
- Adding 'invoice_received' as an accepted state in account_move.py -> _compute_l10n_mx_edi_cfdi_state_and_attachment to enable SAT status display on vendor bills in 17.0, making SAT status no longer remain None. - Making adjustments to functions updating SAT status related fields for vendor bills. - Adding a test for SAT status for creating and cancelling vendor bills. The change necessary to display 'Update SAT' button was already implemented in 17.0 in https://github.com/odoo/enterprise/commit/931d7b199f1183acfbb42325025a6b62b2e73de1 but not forward ported yet. task-4368532 Forward-Port-Of: odoo/enterprise#83842 Forward-Port-Of: odoo/enterprise#80201
…n manual line with tax - Open the bank rec widget - Set a tax on a line - Change the currency to one that is not the journal one nor the transaction one => Traceback '_prepare_counterpart_amounts_using_st_line_rate' wasn't managing this case. opw-4526096 Forward-Port-Of: odoo/enterprise#83809
Original PR description
…n manual line with tax - Open the bank rec widget - Set a tax on a line - Change the currency to one that is not the journal one nor the transaction one => Traceback '_prepare_counterpart_amounts_using_st_line_rate' wasn't managing this case. opw-4526096 Forward-Port-Of: odoo/enterprise#83809
Before this commit: The technical name was not clearly visible in dark mode, making it difficult for users to read. After this commit: The technical name is now clearly visible in dark mode. Task-4680365 Forward-Port-Of: odoo/enterprise#82429
Original PR description
Before this commit: The technical name was not clearly visible in dark mode, making it difficult for users to read. After this commit: The technical name is now clearly visible in dark mode. Task-4680365 Forward-Port-Of: odoo/enterprise#82429
Steps: - duplicate a worksheet template - add a field on the new template - print the original template --> error : field doesn't exist on original worksheet model Current behaviour: Duplicating a worksheet template creates a new model, but the _generate_qweb_report_template method doesn't create a new view for the new template because we copied the original one. It also removes the customizations on the original template's view New behaviour: A new view is created for the dupli
Original PR description
Steps: - duplicate a worksheet template - add a field on the new template - print the original template --> error : field doesn't exist on original worksheet model Current behaviour: Duplicating a worksheet template creates a new model, but the _generate_qweb_report_template method doesn't create a new view for the new template because we copied the original one. It also removes the customizations on the original template's view New behaviour: A new view is created for the duplicated template and remove the duplicate option from the list view, as it is already hidden in form view opw-4664600 opw-4656835 Forward-Port-Of: odoo/enterprise#83529 Forward-Port-Of: odoo/enterprise#83166
…arning domain The unposted entries warning was sometimes triggered unnecessarily due to the domain used for querying move not accounting for the companies accessible by the report. This led to cases where unposted entries from unrelated companies were considered, resulting in misleading warnings. This commit addresses the issue by using the company IDs returned by `get_report_company_ids()` to properly scope the domain. no-task Forward-Port-Of: odoo/enterprise#83846 Forward-Port-Of
Original PR description
…arning domain The unposted entries warning was sometimes triggered unnecessarily due to the domain used for querying move not accounting for the companies accessible by the report. This led to cases where unposted entries from unrelated companies were considered, resulting in misleading warnings. This commit addresses the issue by using the company IDs returned by `get_report_company_ids()` to properly scope the domain. no-task Forward-Port-Of: odoo/enterprise#83846 Forward-Port-Of: odoo/enterprise#83025