Friday, April 24, 2026
25 changes · saas-18.3
Resolved issues and error corrections
This update resolves an issue where barcode quantities were displayed with slight rounding errors due to how JavaScript handles decimal numbers. The fix ensures accurate quantity representation, particularly when dealing with batch transfers and wave transfers, improving data reliability.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to Settings and enable: * Storage Locations (Warehouse). * Batch, Wave & Cluster Transfers. * Create a Product and set its on-hand quantity to…
**Steps to reproduce:**
* Install `stock` module.
* Go to Settings and enable:
* Storage Locations (Warehouse).
* Batch, Wave & Cluster Transfers.
* Create a Product and set its on-hand quantity to 60.
* Go to Inventory → Configuration → Operation Types and create a new operation type:
* Set Type of Operation to Internal Transfer.
* In the Barcode App tab, enable Group batch lines.
* Go to Inventory → Operations → Internal Transfers and create a new transfer:
* Select the newly created Operation Type.
* Add the created Product with quantity 4.4.
* Mark the transfer as To Do.
* Create another Internal Transfer with the same configuration:
* Select the same Operation Type.
* Add the same Product with quantity 48.8.
* Mark the transfer as To Do.
* Open the Internal Transfers list view.
* Select both created transfers.
* Click Action → Add to Wave Transfer.
* Choose A new Wave Transfer and confirm.
* In the popup, select both transfers and add them to the wave.
* Open the Barcode application.
* Open the created operation and select the Batch on the right side
to open the wave transfer in the barcode interface.
**Observed behavior:**
- The grouped line quantity is displayed as 53.99999996 instead of
the expected value(53.2).
**Cause:**
- When the Barcode app loads data,` _createState()` is executed,
which calls `groupLines()`.
- Inside this method, quantities are aggregated using standard
JavaScript floating-point addition:
https://github.com/odoo/enterprise/blob/08d0a7f480046bb489ca69e7b3535e99cb20eee5/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L204-L205
- Since JavaScript stores numbers as binary floating-point values,
decimals like 4.4 and 48.8 cannot be represented exactly.
Repeated additions accumulate precision errors, producing results
like 53.99999996 instead of 53.2.
**Fix:**
- Aggregate quantities using `formatFloat` with the barcode precision
before converting them back to floats
- `formatFloat` rounds the value according to the configured precision
of the barcode model, ensuring the intermediate result is normalized
after each addition. Converting the formatted value back with
`parseFloat` guarantees the stored number respects the expected
decimal precision and prevents floating-point accumulation errors.
---
opw-5932329
Forward-Port-Of: odoo/enterprise#113927
Forward-Port-Of: odoo/enterprise#110241This update addresses a critical issue where Odoo would crash when attempting to download a URL document alongside a spreadsheet. The fix ensures stable downloads of combined documents, improving user experience and preventing data loss. This resolves a reported bug impacting users accessing and sharing documents.
Original PR description
Try to download a url document along with a spreadsheet. `onDownload` crash when trying to download a url document. Task: 5485662 Forward-Port-Of: odoo/enterprise#113645 Forward-Port-Of: odoo/enterprise#112513
This update resolves an issue where editing bank reconciliation lines with analytic distributions would prevent account changes from being applied correctly. The fix ensures accurate account updates by disabling inverse methods during editing and explicitly recreating analytic lines upon saving. This improves the reliability of bank reconciliation processes.
Original PR description
Before this commit, editing a line with an analytic distribution caused inconsistent behavior when changing the account. When an analytic distribution was present, editing the line created analytic lines linked to the move line. However, changing the account from the form view in the bank reconciliation widget triggered _inverse_account_id, which in turn called _inverse_analytic_distribution. This resulted in unlinking the analytic_line_ids from the move line, preventing the account change from being applied. On a second attempt, the account could be modified because there were no longer any analytic lines to unlink. This led to orphaned analytic lines not linked to any journal item. To fix this, the inverse method is now disabled while editing the line in the form view. Upon saving, the analytic_line_ids are explicitly unlinked, and _create_analytic_lines is triggered during the update to correctly recreate the analytic lines. opw-6107329
This update corrects a display issue where the 'Update Payment' button remained visible after processing batch payments for Mexican CFDI invoices. The fix addresses a technical error in how the system compares invoice UUIDs, ensuring the button only appears for the relevant invoices, specifically the PDD payment, when a batch payment is created.
Original PR description
backport of f41900a4353ea867b08f71ed64f8702a13411bac - Create one invoice with the PUE payment policy. - Create another invoice with the PDD payment policy. - Send both invoices to the CFDI. - Create a batch payment for both and reconcile. - Click on Update Payment on one of the invoices. The Update Payment button does not disappear. In the method _l10n_mx_edi_cfdi_invoice_get_payments_diff, we compare the current UUIDs and the previous UUIDs to determine if the button should be shown. However, when there is a batch payment, the current UUID list includes the UUIDs of all invoices in the batch, including the PUE payment (which should normally be filtered out by the continue). The previous UUID list includes only the UUID of the PDD payment. opw-6055781 Forward-Port-Of: odoo/enterprise#114440
This update fixes an issue where group payments were incorrectly calculating amounts for vendor bills with multiple installments. Now, payments accurately reflect the full amount of the first bill and only the initial installment of subsequent bills, ensuring accurate accounting for recurring payments. This improves the reliability of our payment processing.
Original PR description
Steps to reproduce: 1- Install Accounting and make sure "Batch Payments" is enabled in settings 2- Go to [Accounting -> Vendors -> Bills] 3- Create two bills for the same vendor, ensuring one of them has multiple installments (i.e payment term with 3 installments) 4- Confirm the bills 5- In list view, select both bills and another bill from a different vendor and click on Pay 6- Select "Group Payments" and confirm the payment Description of issue: The batch payment of the first vendor has the full amount for both bills Expected behavior: The payment should consider the full amount of the first bill and the first installment only of the second bill opw-5969972 Forward-Port-Of: odoo/odoo#257871
This update prevents unauthorized users from accessing asset information within invoices. Previously, users on certain groups could view assets linked to invoices, leading to errors. Now, access is restricted to users within the 'account.group_account_readonly' and 'account.group_account_invoice' groups, ensuring data security and proper workflow.
Original PR description
Only groups `account.group_account_readonly`, `account.group_account_invoice` or higher have access to model `account.asset`, therefore if an user goes to see an invoice with assets and they are not on either group, they will receive an error and won't be able to access said invoice. How to reproduce: - Create a vendor bill - Create an account.asset and link it to said account.move - Go to the form view with an user that it's on group "Purchase: User" for example --> They get a traceback --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#113858 Forward-Port-Of: odoo/enterprise#112890
A recent update caused an error when refreshing the Generic Tax Report page. This was due to a change in how the report was loaded, leading to incorrect data. The fix ensures the report loads correctly after a refresh, maintaining consistent functionality.
Original PR description
Currently an error occurs when user refreshes on Generic tax report. **Steps to produce:** * Install accountant (with demo) * Search Tax Returns > Enter values and `Apply`>Generic Tax report *…
Currently an error occurs when user refreshes on Generic tax report. **Steps to produce:** * Install accountant (with demo) * Search Tax Returns > Enter values and `Apply`>Generic Tax report * Refresh the page and error will occur on the terminal. **Error:** `ValueError: Expected singleton: account.report()` **Cause:** After a refresh, the ORM call [1] is executed. However, since the report view has changed, `reportId` becomes `undefined`, as it no longer exists in the context. This issue did not occur in `18.2` because, prior to refactor [2] , the report view remained unchanged after a refresh. As a result, it consistently received the same parameters. **Solution:** * Use the stored action `account_reports.action_account_report_gt` similarly to the issue solved in [3] [1]: https://github.com/odoo/enterprise/blob/1094409426eb8c7d24f385dc28e0011a75b2019d/account_reports/static/src/components/account_report/controller.js#L183-L193 [2]: https://github.com/odoo-dev/enterprise/commit/ff7a5f529c9984c2bfd7950136bcf8c0ecae3964 [3]: https://github.com/odoo/enterprise/pull/47896 **Sentry-6612074136**
This update resolves an issue that prevented users from discarding currency rate changes in the accountant module after manual updates. The fix ensures the necessary configuration is initialized, preventing a 'singleton' error that occurred in Odoo 18.3 and later. This ensures data consistency and prevents disruptions during currency rate synchronization.
Original PR description
This error occurs when a user attempts to discard changes after manually syncing currency rates. The issue arises because the `res.config.settings` record was not initialized beforehand. This error…
This error occurs when a user attempts to discard changes after manually syncing currency rates. The issue arises because the `res.config.settings` record was not initialized beforehand. This error occurs `saas-18.3` onwards after the following commit ff7a5f529c9984c2bfd7950136bcf8c0ecae3964 The error occurs on line: https://github.com/odoo/enterprise/blob/79a15ac661d6fb8b6afc9ef791f5fae9349ae2a2/currency_rate_live/models/res_config_settings.py#L1375 **Steps to replicate** * Install `accountant` * Enable Multi-Currency * Settings > Select Journal Under Tax periodicity (Do not save!) * Automatic Currency Rates > Next Run > Update now (reload button) > Discard `ValueError: Expected singleton: res.config.settings()` **Solution:** * Set Journal in `res_config_settings` similar to `saas-18.2` which initialized the `res_config_settings` model as shown below: https://github.com/odoo/enterprise/blob/fd82255b6a597627ff04d4cf65f8238ba8b921c7/accountant/__init__.py#L23-L24 **Sentry-6740605775**
This update resolves an issue where the 'Returns' button and Return Period options were missing when viewing variant reports (like RCE Purchase 8.5). The fix ensures these features now correctly display based on the report's root type, addressing a discrepancy in how variant reports handle return data.
Original PR description
Since the Accounting Returns refactor https://github.com/odoo/enterprise/pull/81569 the “Returns” button and the Return-Period date mode only appear when the current `account.report` carries at least…
Since the Accounting Returns refactor https://github.com/odoo/enterprise/pull/81569 the “Returns” button and the Return-Period date mode only appear when the current `account.report` carries at least one return type (i.e., `self.return_type_ids` is non-empty). Localization modules (e.g., PE) attach `account.return.type` to the filing (root) VAT report, while ledger/variant reports (e.g., VAT Report (RCE Purchase 8.5) (PE)) are presentation variants and usually do not repeat that configuration. As a result, opening a variant report yields: No Returns button, because _init_options_buttons() checks only `self.return_type_ids`. No Return Period chip and wrong/no return-period boundaries, because the date initializers also check/use only `self.return_type_ids`. Even if the button is shown by a downstream customization, `action_open_returns() would still open an empty list because it filters on `self.return_type_ids.ids`. Why the issue happens: Variant reports (like RCE 8.5) have `self.root_report_id` pointing to their root VAT report, which does carry `return_type_ids`. But the in odoo we checks/uses only the current report’s`return_type_ids`, which is empty on variants. Hence: missing Returns button, missing Return Period, and wrong/empty return filtering. Fix: Adopt the reporting engine’s existing “inherit from root when on a variant” pattern and its already used elsewhere for `variants_source_id`, custom handlers ... Introduce a tiny helper: Prefer explicit types on the current report if present; otherwise fall back to the root’s types. Replace direct uses of self.return_type_ids by the effective types in: _init_options_buttons: show Returns on variants too. _init_options_return_periodicity: enable Return Period on variants when the root has exactly one type. _init_options_date(return-period branch): compute correct boundaries from effective types. _get_shifted_dates_period(return-period branch): shift using effective types. _get_date_bounds_info(..., 'previous_return_period'): validate count and compute previous period from effective types. action_open_returns: filter the list view by the types of variants if present or the root instead if the variant’s empty. Before this commit: On VAT Report (RCE Purchase 8.5) (PE): no Returns button is shown when you are in variant. After this commit: Returns button appears. Return Period mode works Open Returns action lists the correct returns (filtered by the effective type). Steps to reproduce: Install PE_reporting module make sure dev move is on Accounting -> Reporting -> tax reports Click on reports and switch from `Report: Group by: Account > Tax` to `RCE Purchase 8.4` Return Button is not there any more :( [opw-4973204](https://www.odoo.com/odoo/my-tasks/4973204)
This update resolves an issue that prevented the Payroll module from upgrading correctly after a specific configuration change (deleting a 'Worker' structure type). The fix restricts user deletion of structure types, preventing a ParseError and ensuring smooth module upgrades. This improves overall system stability.
Original PR description
Currently, a ParseError is arising when the user upgrades the `hr_payroll` module after deleting the `Worker` in Structure Types. Steps to Reproduce: --- - Install `Payroll` module (without demo…
Currently, a ParseError is arising when the user upgrades the `hr_payroll` module after deleting the `Worker` in Structure Types.
Steps to Reproduce:
---
- Install `Payroll` module (without demo data).
- Payroll > Configuration > Structures > Delete `Worker Pay`
- Configuration > Structure Types > Delete 'Worker'
- Now upgrade the `Payroll` module
Traceback:
---
```py
ValueError: External ID not found in the system: hr.structure_type_worker
ParseError: while parsing /home/odoo/src/enterprise/saas-18.4/hr_payroll/data/hr_payroll_structure_data.xml:15, somewhere inside <record id="structure_worker_001" model="hr.payroll.structure">
<field name="name">Worker Pay</field>
<field name="type_id" ref="hr.structure_type_worker"/>
```
At [1], we reference the ID of the `Worker` record. After deletion, that record no longer exists, which results in a ParseError.
Solution:
---
Users are restricted from deleting the Structure Type.
[1]- https://github.com/odoo/enterprise/blob/92ad37e25deeb1f9f1f24f85b085b575e70c0a5d/hr_payroll/data/hr_payroll_structure_data.xml#L15-L20
sentry-6377659355This update fixes an error where kit-based sales orders were incorrectly calculating costs. Previously, the system multiplied kit quantities by batch sizes, leading to inflated prices. The fix ensures accurate cost calculations for kits, aligning with expected inventory valuation methods.
Original PR description
### Issue: When a kit BoM has `product_qty` > 1 (e.g. 12 Kit X = 12 Comp A + 12 Comp B), the SO line cost after confirmation is multiplied by the batch size. Selling 1 Kit X shows a cost of 360…
### Issue: When a kit BoM has `product_qty` > 1 (e.g. 12 Kit X = 12 Comp A + 12 Comp B), the SO line cost after confirmation is multiplied by the batch size. Selling 1 Kit X shows a cost of 360 instead of 30. ### Cause: The method `_compute_average_price` uses `bom.explode(self, 1)`, which returns raw BoM line quantities for one full batch. It accumulates the total batch cost but returns it without dividing by `bom.product_qty`. ### Steps to Reproduce: - Costing Method = AVCO, Inventory Valuation = Automated - Comp A (cost 10), Comp B (cost 20), Kit X (cost 0) - Kit BoM: 12 Kit X = 12 x Comp A + 12 x Comp B - Create and confirm a SO for 1 x Kit X - Expected SO line cost: 30 - Actual SO line cost: 360 Solution: This fix mirrors the normalization already done in `_compute_bom_price`, which correctly divides by `bom.product_qty` and converts UoMs. opw-5969310 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253948 Forward-Port-Of: odoo/odoo#253406
This update fixes an issue where upgrade scripts within Odoo modules weren't properly organized, leading to potential logging and warning problems. Now, these scripts are correctly associated with the core upgrade package, ensuring smoother and more reliable updates and reducing potential errors.
Original PR description
The resulting modules should be bound to the `odoo.upgrade` package. Side effects: - the loggers created inside the upgrade scripts are now in the `odoo.upgrade` namespace. - warnings raised by bad usages in upgrade scripts are now correctly filtered. Forward-Port-Of: odoo/odoo#261050 Forward-Port-Of: odoo/odoo#258025
This update fixes an issue where deferred invoice moves weren't consistently linked to the correct customer partner. The change ensures that the `partner_id` is always taken from the original invoice line, maintaining accurate data and preventing discrepancies in financial reporting. This improves data integrity for deferred accounting processes.
Original PR description
When creating deferred move lines, the `partner_id` could be incorrectly influenced by the `default_partner_id` context key (e.g., when generating an invoice from a Sales Order). This led to inconsistencies where the deferred move lines did not match the partner on the original invoice line. This commit ensures the `partner_id` is explicitly taken from the source invoice line, guaranteeing data integrity across all deferred move lines. Steps: - Create a sale order for partner X, receive and confirm it - Create the invoice from the SO - Change partner to Y but keep X as delivery partner (not essential to reproduce bthough) - Set a deferred start date and a deferred end date on the invoice line, covering two full months - Confirm the invoice and open deferred moves via the smart button -> Note that one deferred move's lines get the partner id from the SO instead of the invoice opw-6095711 Forward-Port-Of: odoo/enterprise#114439
This update allows administrators to override the automatic resetting of subscription users. Previously, this process was difficult to manage, and this change provides greater control over subscription user management within the Odoo Enterprise system. This improves flexibility and aligns with evolving business needs.
Original PR description
After this commit, the auto resetting of subscription user is overridable. Doing business logic in CRUD methods makes them impossible to bypass, by encapsulating the logic in another method, it would be easily overridable. Forward-Port-Of: odoo/enterprise#114202 Forward-Port-Of: odoo/enterprise#114055
This update fixes a mobile issue where swiping between settings would sometimes cause a blank page. The change ensures the settings page fully loads before transitioning, resulting in a smoother and more reliable user experience.
Original PR description
Before this commit, swiping between settings for different apps on mobile devices would often result in a blank page. This occurred because the swipe method did not wait for the target page to render completely before completing the transition. This commit ensures the swipe action waits for the rendering process, preventing the blank state during app navigation. Forward-Port-Of: odoo/odoo#260737 Forward-Port-Of: odoo/odoo#260563
This update corrects a visual issue where adding a new shift sometimes resulted in duplicate employee names appearing in Gantt views. The fix ensures that when employee data changes (like adding a new shift), the display updates correctly, preventing the duplication of employee names. This improves the user experience and data accuracy within the Gantt view.
Original PR description
Sometimes, when adding a new shift (with an employee) in a gantt view that uses `PlanningEmployeeAvatar`, we can have twice the same employee. It can happens on groupby/filtering/reordering/etc.. An…
Sometimes, when adding a new shift (with an employee) in a gantt view that uses `PlanningEmployeeAvatar`, we can have twice the same employee. It can happens on groupby/filtering/reordering/etc.. An exemple could be to have a gantt view with Shift1 User1 we have: ``` +--------------+ | Shift1 User1 | +--------------+ ``` Add another shift (Shift 2) with User2. We'll have: ``` +--------------+ | Shift1 User1 | +--------------+ | Shift2 User1 | +--------------+ ``` instead of ``` +--------------+ | Shift1 User1 | +--------------+ | Shift2 User2 | +--------------+ ``` Because in this case, when we add Shift2, the view will append Shift1 and after it will rename the old Shift1 to Shift2, but in our case, the renaming is not done and so, it retains the old value. This is because in the `PlanningAvatarAction` setup we use `setupDisplayName`. The purpose of this function is to split the displayName contained in a `span` into two `span` elements using a `useEffect`. For example, `<span>Employee (Department)</span>` will be replaced by ```html <span>Employee</span><span class="..">(Department)</span> ``` in order to apply a “muted” style to the department. But to do this, the function will replace the original first span and overwrite it, ```xml <span t-if=“props.displayName” class="text-truncate flex-grow-1" t-esc=“props.displayName”/> ``` since it contains a `t-esc`, which allows Owl to remain “subscribed” to this element and notify components when to update if the displayName ever changes; however, by overwriting it, Owl is no longer aware of the change. Therefore, whenever a component's value changes (in our case, Shift1 becomes Shift2), it is never updated. In fact, manually manipulating the DOM in a useEffect, as `setupDisplayName` does, is not a good solution. To fix this flow, this commit adds a new `t-key` attribute to the original span with a value of `this.props.displayName`, which ensures that when the `t-key` changes value because `displayName` is updated, Owl will recognize that a change has occurred and will re-render. opw-6128168
This update fixes a bug where users received duplicate notifications when submitting the email reminder form for events. The form is now correctly embedded within the event page's HTML, preventing unwanted redirects and ensuring a smoother user experience. This resolves a display issue and improves overall event registration efficiency.
Original PR description
This PR fixes the email reminder form with multiple commits: - Commit 1 fixes the notifications displayed when the email form is submitted as the messages of those notifications are redundant. - Commit 2 inserts the form inside the HTML body instead of the interaction's HTML since the surrounding HTML of this last one may cause display issues as with the <a> tag redirecting the users on the talks page when they click on the form which should not happen. Task-5347538
This update ensures that menu links correctly point to newly created pages, even when the menu URL contains spaces. Previously, URLs with spaces would cause a 404 error. A warning is now displayed in the menu editor to alert users about potential issues with spaceful URLs, preventing confusion.
Original PR description
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a…
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a 404. **Steps to reproduce**: 1. Create a menu item with a URL containing spaces and no leading slash (e.g., "some url"). 2. Click the menu item -> a 404 page is displayed (expected). 3. Click "Create Page" -> the page is created and saved. 4. Click the menu item again -> it still returns a 404 (unexpected). **Issue**: During page creation, the path is slugified (e.g., "some url" -> "/some-url"). The controller then tries to link the menu to the new page by setting `page_id`. However, `pagenew()` only searches for menu URLs with a leading slash, so a menu saved as "some url" is not found when searching for "/some url". As a result, `page_id` is never set, and `_clean_url()` keeps resolving the menu to "/some url" instead of the page's actual URL "/some-url". Menus without spaces (e.g., "mypage") have the same issue where `page_id` is not set, but since `_clean_url()` prepends "/" and renders "/mypage", which matches the new page URL, the menu still resolves correctly. **Fix**: Match both URL formats (with and without leading slash) when linking a menu to a newly created page. Additionally, a warning is now shown in the menu editor when a URL contains spaces, since spaces are slugified during page creation, which could cause confusion. (Note: this is only a warning - URLs with spaces are still allowed.) task-[5095646](https://www.odoo.com/odoo/project/974/tasks/5095646) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260726 Forward-Port-Of: odoo/odoo#248967
This update addresses a technical detail related to our integration with Peppol, a key European payment network. By adding a new field to track the status of Peppol transactions, we ensure accurate processing and future-proof our system for evolving Peppol standards. This enhances the reliability of our international payments.
Original PR description
With the addition of new peppol_move_state for the Application Responses in Peppol, some checks to know wether the move was sent through Peppol were not updated. This commit does that by adding a common field for it. This is usefull as we might add some extra peppol_move_state values in the near future (Peppol supports more response types than we currently offer to our users). Forward-Port-Of: odoo/odoo#258598
This update corrects a bug where the DIAN web service was incorrectly overwriting customer contact information (names and emails) with fiscal data, leading to lost sales data. The fix now intelligently handles email differences, creating a separate invoicing contact if needed and giving users control over their existing data.
Original PR description
The DIAN web service was overwriting partner names and emails with fiscal data, causing data loss for CRM contacts. The fiscal email often differs from the commercial one, and the overwrite broke the sales flow by sending invoices to the wrong address. Users had no standard workaround short of manually re-entering emails after every invoice generation. Instead of blindly overwriting, only update empty fields and create a child invoicing contact when the DIAN email differs from the existing one. Also remove the automatic onchange and periodic re-fetch triggers to leave existing data under user control. task-5912005 Forward-Port-Of: odoo/enterprise#114017
This update resolves a minor issue in the Swiss payroll module (l10n_ch_hr_payroll_elm_transmission) where the minimum IS (Intermediary Swiss Franc) amount was incorrectly calculated. The fix ensures accurate reporting for Swiss tax compliance, preventing potential discrepancies and improving data integrity.
Original PR description
Forward-Port-Of: odoo/enterprise#114463
This update resolves a problem where sales orders using products with different projects for each company would fail to process correctly through the customer portal. The fix ensures the correct company context is used when accessing company-dependent fields, preventing errors and ensuring proper order processing across multiple companies. This improves the reliability of the sales process for businesses using multiple company accounts.
Original PR description
project_template_id is a company dependent field. When creating a project, it is called without the proper company context set up. When confirming an SO through the portal, the order's env is setup…
project_template_id is a company dependent field. When creating a project, it is called without the proper company context set up. When confirming an SO through the portal, the order's env is setup without a company and `.with_user(SUPERUSER_ID)`, making future company_dependent variables use OdooBot's company. Following examples earlier in the function, call `.with_company` while accessing project_template_id. Steps to reproduce: 1. Install Sales and Project 2. Create second company 3. Create Customer with portal access, under created company 4. Create service product with different projects for each company 5. Create sales order with customer and service product, send to customer 6. Login as customer on portal, accept and sign SO a. Should stall, RPC Error in console Ticket: opw-6082772 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#260387
This update fixes an issue where the 'Total' line was missing from reports like the Trial Balance when 'Hide lines at 0' was enabled. The change ensures that all report-level totals are always printed, improving the accuracy and completeness of financial reports. This enhancement provides a more reliable view of financial data.
Original PR description
When "Hide lines at 0" is enabled, printing e.g. the Trial Balance will drop the report-level "Total" line when printing. This commit fixes that. The issue was introduced in this commit[^1], which didn't consider total lines without a parent (i.e. root total lines). [^1]: https://github.com/odoo/enterprise/commit/7fec18b99eb2aa5ebc357dcad5f95f234db5b7d8 Forward-Port-Of: odoo/enterprise#114084
This update corrects a previous issue where loyalty point history records only showed the net difference between earned and spent points in a single order. The fix now accurately tracks and records both the gross amount of points earned and the gross amount of points spent, providing a more complete and reliable record of customer loyalty transactions. This ensures accurate reporting and better customer understanding.
Original PR description
When a loyalty card both earned and spent points in the same POS order, the history entry only reflected the net difference instead of the gross amounts. The root cause was that the JS payload sent only a single `points` field representing the net change. Fix by tracking `points_earned` and `points_spent` separately in `couponData` and sending them to the server. opw-6041420 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258176 Forward-Port-Of: odoo/odoo#256022
This update fixes a problem in our restaurant POS system where opening an order with a connected Fiskaly transaction on a second device would cause duplicate transaction attempts and errors. The fix ensures that transaction state information is properly saved and shared between devices, preventing these errors and improving the reliability of Fiskaly integration.
Original PR description
In a restaurant POS, when an order with an active Fiskaly transaction is opened on a second device, `transactionState` and `tx_revision` were not available (uiState is not persisted to the server), causing the new device to attempt creating a duplicate transaction with a stale revision, which resulted in a Fiskaly API error. opw-6147654 Forward-Port-Of: odoo/enterprise#114911 Forward-Port-Of: odoo/enterprise#114599