Thursday, March 12, 2026
32 changes · saas-19.2
Enhancements to existing features
This update adds a barcode (GTIN) to product data within our website, enhancing its visibility on search engines like Google. This change improves SEO and ensures compliance with Google Merchant Center guidelines, ultimately driving more traffic and sales.
Original PR description
Include the barcode (GTIN) in product micro-data to improve SEO indexing and comply with Google Merchant Center requirements. Added gtin property to the JSON-LD metadata in product.product. Affected Version: 19.0 Task: 5953441 Forward-Port-Of: odoo/odoo#252823
This update enhances the accuracy of leave accrual calculations within the payroll system by ensuring proper tracking of leave requests and addressing potential date format issues. It also includes security enhancements to restrict access to tracking data and improves the generation of work entries for leaves, resolving a previous bug.
Original PR description
Accrual is computed based on tracking values, checking added or removed leaves in a given request, based on their datetimes. This feature does not seems tested currently, so let us cover it. That way we ensure future changes in tracking model do not break current feature. By the way, fix an ACL issue when trying to access tracking values and not being admin. By the way, fix date / datetime issue when generating work entries. By the way, fix leaves support when generating work entries. Task-5935695 ([mail, various] Cleanup and test tracking usage) Prepares Task-3645865 ([mail] In-body tracking) Co-Authored-By: Prakash Prajapati <ppr@odoo.com> Forward-Port-Of: odoo/enterprise#110302
This update simplifies the partner list by adding a direct 'unselect' button whenever a partner is selected. Previously, users had to hover to remove a selected customer, which was confusing and inefficient. This change improves usability and ensures partners can be easily removed from the list.
Original PR description
Before this commit: ==== - Initially if partner is selected then hovering over partner shows option to remove the partner, until user won't be able to get how to remove the customer if selected. - Not good from user perspective. Following this commit: ==== - Unselect button will be shown everytime instead of hovering if partner is selected so that when user open the partner list, user can easily unselect the partner. task-5945904 Forward-Port-Of: odoo/odoo#249405
This update enhances the Turkish localization for Odoo, specifically addressing invoicing and VAT compliance. Key changes include mandatory fields for tax exemption reasons and shipping methods, as well as fixes for error messages and UBL generation to ensure accurate VAT reporting and improved invoice processing.
Original PR description
This commit adds the following improvements and bug fixes to the turkish localization: - Make shipping method required for GiB export invoices - Make Exemption Reason mandatory when Invoice Type is Tax Exempt - Ensure Invoice Type is selected when Invoice Scenario is set - Hide the nilvera send status for Vendor Bills - Adjust the error message for missing CTSP numbers on invoice lines - Allow resetting Vendor Bills to draft - Give priority to the currency rate on the invoice when generating UBL - Create a new bridge module to bypass the VAT validation for test VAT numbers - Fix bug in bulk customer verification task-5868201 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249247
Resolved issues and error corrections
This update resolves an issue where order validation was sometimes skipped due to data serialization delays during the tour process. The change adds a mandatory step to select the invoice before order validation, ensuring invoices are correctly generated. Unnecessary tour steps have also been removed.
Original PR description
pos*: point_of_sale, pos_sale, l10n_sa_edi_pos, l10n_es_pos,l10n_be_pos_sale When invoice selection takes longer, and the order validation button is clicked immediately after, the tour may serialize data before the invoice field has settled. This can cause invoice generation to be skipped during order validation Since the delay between tour steps was removed, this commit adds an explicit step to ensure the invoice is selected before validating the order. Additionally, removed unused tour `PosSettleAndInvoiceOrder` Task-5897375 Err-237600, 238502 Related-https://github.com/odoo/enterprise/pull/106863
This update resolves a bug where order validation was sometimes skipped due to data serialization issues during POS tours. The change adds a required step to ensure the invoice is selected before order validation, guaranteeing accurate invoice generation and order processing. This improves the reliability of the POS system for users.
Original PR description
pos*: l10n_ec_edi_pos, l10n_it_pos When invoice selection takes longer, and the order validation button is clicked immediately after, the tour may serialize data before the invoice field has settled. This can cause invoice generation to be skipped during order validation Since the delay between tour steps was removed, this commit adds an explicit step to ensure the invoice is selected before validating the order. Task-5897375 Err-237600, 238502, 238503, 238504 Related-https://github.com/odoo/odoo/pull/247770
This update ensures that customers receive a receipt email only after their online payment for self-orders has been successfully validated. Previously, receipts were sent prematurely, leading to customer confusion. This change improves the customer experience by aligning receipt delivery with actual payment confirmation.
Original PR description
In self-order with online payment, the receipt email could be sent when the order was created (before payment validation), which confirms the order too early for customers. This change ensures receipt sending is aligned with actual payment success in the online self-order payment flow. Steps to reproduce: ------------------- * Configure self-order with a preset that has a receipt mail template. * Place a non-zero self-order using online payment and reach the payment step. * Check customer mailbox before validating payment. > Observation: A confirmation email can be sent before the payment is confirmed. Why the fix: ------------ Receipt emails must reflect a successful payment outcome, not just draft order creation. The online self-order payment success path now triggers receipt sending after the order transitions from draft to paid/done, preventing premature emails. opw-5938299 Forward-Port-Of: odoo/odoo#252797 Forward-Port-Of: odoo/odoo#251220
This update resolves an issue where clicking images with 'Pop-up on Click' enabled would cause a website crash. The fix ensures that the image gallery code initializes correctly, preventing errors when images aren't part of a carousel. Additionally, the popup functionality has been restricted to product images.
Original PR description
Steps to produce: --- - Install `website_sale` module. - Go to website > open editor. - Add an image snippet to the homepage. - Click on the image and enable `Pop-up on Click`, then save. - Click on…
Steps to produce:
---
- Install `website_sale` module.
- Go to website > open editor.
- Add an image snippet to the homepage.
- Click on the image and enable `Pop-up on Click`, then save.
- Click on the image.
Traceback:
---
`TypeError: Cannot read properties of undefined (reading 'length')`
Root cause:
---
- In the `setup` method, when the image is not part of a carousel,
the element `.carousel-indicators` does not exist. As a result,
`indicatorEl` is null, and the guarded block(at [1]) is skipped.
Because of this, `this.liEls` is never initialized.
- Later, when the `onSlidCarousel` method is executed,
its internal condition evaluates and find `liEls` as null and
then `hide` method is called(see [2]).
- Inside the `hide` method, the code attempts to iterate
over `this.liEls`(see [3]).
Solution:
---
- Initialized `liEls` in `setup()` to ensure it is always defined.
- Added a length check in `onSlidCarousel()` to execute the logic
only when `liEls.length > 0`.
- This prevents this.page from being computed using invalid
values and avoids it being set to `NaN`.
- Additionally, as requested by the boje(po), hide the popup
on click setting on product images.
**Alternative approaches:**
1. We can also call the `onSlideCarousel` method from `setup`
when multiple images are present.
2. Also, we can add a simple check inside the `onSlideCarousel`
method to ensure that `liEls` is defined before proceeding.
[1]: https://github.com/odoo/odoo/blob/945f44e55f9a67b0744a183200de728b00202b1c/addons/website/static/src/snippets/s_image_gallery/gallery_slider.js#L31-L57
[2]: https://github.com/odoo/odoo/blob/945f44e55f9a67b0744a183200de728b00202b1c/addons/website/static/src/snippets/s_image_gallery/gallery_slider.js#L144-L152
[3]: https://github.com/odoo/odoo/blob/945f44e55f9a67b0744a183200de728b00202b1c/addons/website/static/src/snippets/s_image_gallery/gallery_slider.js#L119-L120
opw-5921123
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#247936This update resolves an issue where users could inadvertently add partners from different companies when managing multiple companies within Odoo. This change ensures partners are correctly associated with their respective companies, improving data accuracy and streamlining accounting processes. It's a necessary fix for reliable multi-company operations.
Original PR description
Before this commit, it was possible to add a partner that was from another company when multiple companies were selected. task-5941113 Forward-Port-Of: odoo/enterprise#108048 Forward-Port-Of: odoo/enterprise#107546
This update corrects a technical issue preventing electronic invoices under the RIMPE Emprendedor regime from being properly processed. The change ensures the correct string value is used, aligning with SRI specifications and resolving a validation error during the invoice signing process. This ensures compliance and accurate invoice generation for Ecuadorian businesses.
Original PR description
Corrected the hardcoded string for the RIMPE Emprendedor regime to match the SRI structure According to SRI technical specifications, the <contribuyenteRimpe> tag only accepts two specific values:…
Corrected the hardcoded string for the RIMPE Emprendedor regime to match the SRI structure According to SRI technical specifications, the <contribuyenteRimpe> tag only accepts two specific values: CONTRIBUYENTE RÉGIMEN RIMPE (Fixed value) CONTRIBUYENTE NEGOCIO POPULAR - RÉGIMEN RIMPE Steps to reproduce: Install l10n_ec_edi module Go to Settings > Invoicing > Ecuadorian Localization In Electronic Invoicing > Regime, select rimpe_emprendedor In Electronic Invoicing > Regime, configure a SRI Connection Post an customer invoice **Validation error occurring during the electronic signing process (using .p12 certificates):** `35 - Se encontró el siguiente error en la estructura del comprobante: cvc-pattern-valid: Value 'CONTRIBUYENTE EMPRENDEDOR - RÉGIMEN RIMPE' is not facet-valid with respect to pattern 'CONTRIBUYENTE RÉGIMEN RIMPE|CONTRIBUYENTE NEGOCIO POPULAR - RÉGIMEN RIMPE' for type 'contribuyenteRimpe'.. - ARCHIVO NO CUMPLE ESTRUCTURA XML - ERROR ` Forward-Port-Of: odoo/enterprise#109147
This update resolves an issue where temporarily disabled products weren't appearing correctly in the self-order POS configuration. The fix ensures that product snoozes are now accurately reflected in real-time, based on updates from the cashier screen. This improves the accuracy of product availability displayed to the cashier.
Original PR description
The `pos_snooze_ids` was not included in the `load_pos_self_data_fields` so the field was not accessible in the config in self and it would not display the temporary disabled products. I added it now so that products will be disabled in real time based on updates from the cashier screen --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252686
This update resolves an issue where Discuss calls could fail due to race conditions when retrieving channel data. By delaying the call until channel information is fully loaded, the system now reliably starts calls without encountering stale data and ensuring a smoother user experience. This fix was triggered by a test failure and improves overall call stability.
Original PR description
...in crosstab call test The "join/leave sounds are only played on main tab" test could race with the initial `channels_as_member` fetches triggered when opening Discuss in both tab Those fetches return full channel data, including `rtc_session_ids`. one of their responses could arive after the call had already progressed or ended and overwrite the state with stale RTC data Wait for `channels_as_member` to be fully processed after opening Discuss in each tab before starting the call. fix for: https://runbot.odoo.com/odoo/runbot.build.error/241061 Forward-Port-Of: odoo/odoo#253005
This update ensures that when a POS order is cancelled, the system accurately recalculates the outstanding payment amount. Previously, cancelled order lines were incorrectly included in payment totals, leading to inaccurate reporting. This fix prevents double-counting rolled-back payments, improving financial accuracy.
Original PR description
Add `pos_order_line_ids.order_id.state` to the depends of `_compute_pos_amount_unsettled` so that cancelling a POS order triggers a recompute. Also exclude cancelled order lines from `total_pos_paid` to avoid counting payments that were rolled back. opw-5997872 Forward-Port-Of: odoo/enterprise#109542
This update fixes an issue where currency exchange difference values were missing from DATEV exports. The fix adjusts how the export generates amounts, ensuring accurate reporting of exchange rates for DE company transactions. This improves the reliability of financial data sent to DATEV.
Original PR description
**Steps to reproduce: 1. Create DE company (EUR currency) 2. Add USD -> EUR exchange rates for XX/01/26 and XX/15/26 (XX is target month) 3. Install l10n_de_reports 4. Make sure bank journal has…
**Steps to reproduce: 1. Create DE company (EUR currency) 2. Add USD -> EUR exchange rates for XX/01/26 and XX/15/26 (XX is target month) 3. Install l10n_de_reports 4. Make sure bank journal has 'outstanding receipts' set for incoming manual payment [Accounting -> Config -> Journals -> Bank] 5. Create USD invoice for XX/02/26 and confirm it 6. Register a Payment for XX/16/26 and confirm it (you should see the exchange difference entry matched alongside the payment) 7. Go to [Accounting -> Reporting -> General Ledger] and export DATEV data **Description of issue: The currency exchange rate difference entries in the exported file are shown as 0 **Expected behavior: The actual currency exchange difference values should be displayed **Why this happens? The DATEV export currently sets the amount based on 'amount_currency'. For currency exchange difference entries, this value is 0.0 in the General Ledger, resulting in 0 values in the export. **The fix: Updated the logic to use the line balance when the entry is identified as a currency exchange difference. opw-5358954 Forward-Port-Of: odoo/enterprise#109655 Forward-Port-Of: odoo/enterprise#107268
This update adjusts the order in which taxes are processed for Mexican accounting (l10n_mx). Previously, the order caused incorrect tax calculations due to how taxes are prioritized. This change ensures accurate tax calculations, preventing potential financial discrepancies for Mexican users.
Original PR description
The current layout has the IEPS first, then IVA, and finally the Withholding, this will cause calculations to be wrong because of tax hierarchy. Most users are not aware that the tax order affects the calculation, so this would help prevent incorrect results. task-5247176 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252780
This fix resolves an issue where the price calculation from a BOM was incorrect when the BOM was created for a product with multiple variants. The update ensures that work center efficiency is properly considered during the cost computation, leading to accurate pricing.
Original PR description
**Issue** Computing the price from BOM can be incorrect when the BOM is defined on a multi-variant product. **Steps to reproduce** - Create a product with several variants - Create a BOM for that…
**Issue**
Computing the price from BOM can be incorrect when the BOM is defined on a multi-variant product.
**Steps to reproduce**
- Create a product with several variants
- Create a BOM for that product without specifying the product variant
- Define an operation restricted to a specific variant V
- Associate the operation with a workcenter with:
- Non-null cost per hour (e.g. 100)
- Time efficiency lower than 100% (e.g. 50%)
- Go to the product page > Variants > variant V
- Click on "Compute price from BOM"
-> The result will be 100 instead of 200 in this example.
Please notice that the price is correctly computed in the BOM overview
**Cause**
Accessing the BOM triggers a `web_read` including `operation_ids`,
which requires computing `time_total`:
https://github.com/odoo/odoo/blob/233316f322d891ebaadb51412ea0df039bfd312a/addons/mrp/models/mrp_routing.py#L77
During this computation, the associated product is retrieved:
https://github.com/odoo/odoo/blob/233316f322d891ebaadb51412ea0df039bfd312a/addons/mrp/models/mrp_routing.py#L106
But since no product is given in the context and the BOM has been created without specifying the product variant
(`bom_id.product_id` is empty), then it retrieves all the product variant associated to the BOM, which leads to
arbitrary default value that ignores work center efficiency:
https://github.com/odoo/odoo/blob/233316f322d891ebaadb51412ea0df039bfd312a/addons/mrp/models/mrp_routing.py#L107-L111
While clicking on "Compute price from BOM":
https://github.com/odoo/odoo/blob/233316f322d891ebaadb51412ea0df039bfd312a/addons/mrp_account/models/product.py#L33
it will ultimately needs to compute the cost:
https://github.com/odoo/odoo/blob/233316f322d891ebaadb51412ea0df039bfd312a/addons/mrp_account/models/product.py#L74
which relies on `time_total`:
https://github.com/odoo/odoo/blob/233316f322d891ebaadb51412ea0df039bfd312a/addons/mrp/models/mrp_routing.py#L131
and since no context is provided, `time_total` is already in the cache, so the default value is used.
Please notice that in BOM overview, the problem does not occur because the provided context retriggers the compute method:
https://github.com/odoo/odoo/blob/233316f322d891ebaadb51412ea0df039bfd312a/addons/mrp/report/mrp_report_bom_structure.py#L806
https://github.com/odoo/odoo/blob/233316f322d891ebaadb51412ea0df039bfd312a/addons/mrp/report/mrp_report_bom_structure.py#L835
opw-5909570
Forward-Port-Of: odoo/odoo#248758This update corrects a bug where employees were consistently shown the oldest payslip version. The fix directly passes the correct payslip version to prevent a race condition in the system's version calculation, ensuring employees always see the most up-to-date payslip information.
Original PR description
[FIX] hr_payroll: adjust proper version in payslip Bug reproduction: Select an employee that has at least 1 payslip already, go to employee tab -> smart button payslip -> then you are in list view of…
[FIX] hr_payroll: adjust proper version in payslip
Bug reproduction: Select an employee that has at least 1 payslip already, go to employee tab -> smart button payslip -> then you are in list view of payslips -> off cycle -> then your version is the first version of the employee, even though you are trying to create a payslip with the latest version of you.
Bug cause:
1 - Before version saas-19.2, date_from in hr_payslip is used to determine the version_id (in compute_version_id)
2 - When version>=19.2, date_to is used for version_id calculation, also employee_id is passed in context when we are coming from smart payslip button.
3 - Both compute_version_id (due to employee context) and compute_date_to triggers in hr_payslip and there is kind of race condition in here.
3.1 - Even though sometimes date_to is started to calculate before, when version_id is calculating the date_to is always False, the computation is not done yet.
3.2 - Since date_to is false, _get_version in hr_employee returns the first version of the employee, that's why in UI it is always the first version.
Bug solution:
1 - I passed the version_id from smart button to the payslip directly to prevent unwanted behavior.
task - 6014170This update ensures that all event registration answers – including free-text responses – are correctly synchronized with the POS system. Previously, only selection-based answers were sent, leading to lost data. This fix corrects a technical issue that prevents accurate order processing during event ticket purchases.
Original PR description
## Steps to reproduce: - Configure event registration with only free-text fields (no selection field). - Open the POS, add an event ticket product, and fill in the registration form. - Click Payment…
## Steps to reproduce: - Configure event registration with only free-text fields (no selection field). - Open the POS, add an event ticket product, and fill in the registration form. - Click Payment and validate the order. ## Issue: - Registration answers were only sent to the backend when at least one selection-type question was filled. - When no selection field was present, free-text answers were not synced at all. ## Reason: - The `registration_answer_ids` and `registration_answer_choice_ids` One2many fields on EventRegistration both point to the same `registration_id` Many2one field on EventRegistrationAnswer. https://github.com/odoo/odoo/blob/c738d049fe09101bd14dce0710c2659a4a6eca39/addons/event/models/event_registration.py#L83-L85 - This caused data loss during the POS model synchronization, as entries were overwritten in the `inverseMap`. https://github.com/odoo/odoo/blob/c738d049fe09101bd14dce0710c2659a4a6eca39/addons/point_of_sale/static/src/app/models/related_models/model_defs.js#L59-L75 ## Fix: - Send all registration answers (free-text and selection-based) exclusively via `registration_answer_choice_ids`. task-5438565 Forward-Port-Of: odoo/odoo#252932 Forward-Port-Of: odoo/odoo#242465
This update resolves an error that occurred when users attempted to generate lots without a defined sequence. The fix ensures the system handles cases where a product's lot sequence is not yet created, preventing a critical error and allowing lot generation to proceed smoothly. This improves the reliability of inventory management.
Original PR description
Currently, an error occurs when a user tries to generate lots while providing a lot number. **Steps to replicate:** - Install purchase (without demo). - Create a product `test`. - Install stock and…
Currently, an error occurs when a user tries to generate lots while providing a lot number.
**Steps to replicate:**
- Install purchase (without demo).
- Create a product `test`.
- Install stock and turn on `Lots and Serial Numbers`
- Open the product `test` and turn on `Track Inventory` `by Lots`.
- Open Receipts > add the product `test`> give demand as 3 > and go to its form view using view button.
- Click `Generate Lots` > type `lot1` in `First lot Number` > Generate > Error-1
- Click `Generate Lots` > type 0 in Quantity received > Generate > Error-2.
**Error-1:**
```
File '/home/odoo/odoo18/community/addons/stock/models/stock_move.py', line 1026, in action_generate_lot_line_vals
if (first_lot and first_lot == product.lot_sequence_id.get_next_char(first_number)):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File '/home/odoo/odoo18/community/odoo/addons/base/models/ir_sequence.py', line 237, in get_next_char
interpolated_prefix, interpolated_suffix = self._get_prefix_suffix()
^^^^^^^^^^^^^^^^^^^^^^^^^
File '/home/odoo/odoo18/community/odoo/addons/base/models/ir_sequence.py', line 227, in _get_prefix_suffix
self.ensure_one()
File '/home/odoo/odoo18/community/odoo/orm/models.py', line 5640, in ensure_one
raise ValueError('Expected singleton: %s' % self)
ValueError: Expected singleton: ir.sequence()
```
**Error-2:**
```
File '/home/odoo/odoo18/community/addons/stock/models/stock_move.py', line 1025, in action_generate_lot_line_vals
first_number = product.lot_sequence_id.number_next_actual - product.lot_sequence_id.number_increment
^^^^^^^
UnboundLocalError: cannot access local variable 'product' where it is not associated with a value
```
---
**Cause:**
- Both errors originated through a recent [PR].
**Error-1 (Expected singleton: ir.sequence()):**
- As the product was already created before Inventory was installed, the `lot_sequence_id` was empty. (Note:`lot_sequence_id` field has a default value , but default value
assignment triggers only during the record creation, any records created
before stock is installed will not be assigned any value for
`lot_sequence_id`.)
- As no `lot_sequence_id` is assigned to `test` product the line [1] calls `get_next_char()` on an empty recordset which further calls `_get_prefix_suffix()` [2] and raises singletonerror from [here].
**Error-2 (UnboundLocalError: cannot access local variable 'product'):**
- As the `Received Quantity` was given 0, the `count` argument is received as 0 and as a result the `lot_qties` [3] and `lot_names` [4] are received as empty lists.
- This causes their [zip] to be empty list too and the loop never runs, so assignment to [product] variable never happens and causes the error to occur from here [5].
---
**Solution:**
**Error-1:**
- Now we perform write on `product.lot_sequence_id` only if it exists, otherwise we skip it.
**Error-2:**
- Moved the static assignment of variable `product` and `location_dest_id` outside the loop, this will also prevent the browse being called multiple times for browsing the same record.
[PR]: https://github.com/odoo/odoo/pull/240368
[1]: https://github.com/odoo/odoo/blob/7ab52c1675b9764d11454c7b5216064bec4628f8/addons/stock/models/stock_move.py#L1026
[2]: https://github.com/odoo/odoo/blob/7ab52c1675b9764d11454c7b5216064bec4628f8/odoo/addons/base/models/ir_sequence.py#L237
[here]: https://github.com/odoo/odoo/blob/7ab52c1675b9764d11454c7b5216064bec4628f8/odoo/addons/base/models/ir_sequence.py#L227
[3]: https://github.com/odoo/odoo/blob/7ab52c1675b9764d11454c7b5216064bec4628f8/addons/stock/models/stock_move.py#L989
[4]: https://github.com/odoo/odoo/blob/7ab52c1675b9764d11454c7b5216064bec4628f8/addons/stock/models/stock_move.py#L994
[zip]: https://github.com/odoo/odoo/blob/7ab52c1675b9764d11454c7b5216064bec4628f8/addons/stock/models/stock_move.py#L1000
[product]: https://github.com/odoo/odoo/blob/7ab52c1675b9764d11454c7b5216064bec4628f8/addons/stock/models/stock_move.py#L1004
[5]: https://github.com/odoo/odoo/blob/7ab52c1675b9764d11454c7b5216064bec4628f8/addons/stock/models/stock_move.py#L1025
sentry-7254849206,7265844194
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#248846This update resolves an issue where payments weren't automatically matched to invoices when 'Outstanding Receipts' accounts were configured in the bank journal. The fix allows for amount matching, ensuring payments are correctly reconciled with invoices, even with this account setting in place. This improves the accuracy of financial reporting.
Original PR description
Steps to reproduce - Have a Bank journal with Outstanding Receipts accounts set - Create and confirm an invoice with a payment reference - Create the payment - Create a bank transaction with: - Label: any label - Partner: invoice partner - Amount: invoice full amount Issue: Transaction won't be matched automatically Analysis: Transaction will be automatically matched if the outstanding receipts account is not set. It occurs because in case it is set, the sytem will only try to match the communication pattern against the journal item of the payment, without trying amount matching Note: another solution could be to relax the communication matching. In the user case the invoice payment reference is something like `TEST-12345` and the payment communication `AAAAAAAAAAA /BBBBBBBBBBB TEST 12345` opw-5872387 Forward-Port-Of: odoo/enterprise#109992 Forward-Port-Of: odoo/enterprise#108564
This update resolves a bug where the barcode scanning app incorrectly identified products when using barcodes that include product prices (starting with '23'). The fix adds logic to handle these barcodes, mirroring the functionality in the Point of Sale app, ensuring accurate product recognition.
Original PR description
Issue ----- Barcode app doesn't match products when using price-embedded barcodes. Steps to reproduce ----- - Use default nomenclature (so price embedded barcodes are 23...) - Create a product with barcode 2355555000004 - Go to barcode and scan 2355555009502 > The product isn't recognised Cause ----- There is no logic in place to handle such barcodes, but it can be added to mimic how it works in POS. https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/point_of_sale/static/src/app/screens/product_screen/product_screen.js#L212 ----- Ticket: opw-5901412 Forward-Port-Of: odoo/enterprise#110034 Forward-Port-Of: odoo/enterprise#109627
This update fixes an error in how outstanding amounts are calculated when a down payment is reversed with a credit note. Previously, the system incorrectly produced negative amounts, leading to incorrect settlement calculations. Now, the system accurately reflects the remaining balance, ensuring proper financial reporting.
Original PR description
When having a down payment that is reversed by a credit note, the amount unpaid is wrongly computed. This is because we take the sum of invoice lines price total, regardless they come from invoice or credit note. Therefore we end up with negative value. Steps: - Have a SO for 500 - Make a downpayment for 300, confirm - Make a credit note for the downpayment invoice, confirm -> SO's amount unpaid is -100, it should be 500. If you now settle the SO, the amount unpaid will be -300 instead of 0. opw-5175562 Forward-Port-Of: odoo/odoo#253135 Forward-Port-Of: odoo/odoo#233248
This update corrects a validation error that occurred when sending invoices to Peppol. The system previously used an outdated UoM conversion ('QT') that is no longer compliant with UN/ECE standards. This fix ensures invoices meet current regulatory requirements for international exchange.
Original PR description
Currently, the Odoo UoM 'qt (US)' is converted to 'QT', which is not valid anymore. Based on investigation, this was originally set to QT following this link: https://unece.org/fileadmin/DAM/cefact/recommendations/rec20/rec20_rev3_Annex2e.pdf But this document seems dated from 2005. Step to reproduce: - Create an invoice with a line with 'qt (US)' as UoM - Try to send the invoice to Peppol - You will get a validation error: "[BR-CL-23]-Unit code MUST be coded according to the UN/ECE Recommendation 20 with Rec 21" Also removed the link to unece.org since the link is no longer valid. opw-5961476 Forward-Port-Of: odoo/odoo#252803 Forward-Port-Of: odoo/odoo#252174
This update resolves an issue where early payment discounts weren't correctly processed when invoices were generated in the Factur-X format. The change adds the necessary handling for Early Payment Discounts (EPD) within this format, ensuring accurate invoice generation and compliance. This improves the accuracy of financial reporting.
Original PR description
Added the handling of early payment discount in the factur-x format. opw-5265981 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252411 Forward-Port-Of: odoo/odoo#244659
This update fixes an issue where the available quantity for rental products was incorrectly displayed on the ecommerce page when 'continue selling' was enabled. The fix ensures that the displayed quantity accurately reflects the available rental units based on the selected renting period, improving the customer experience. This resolves a discrepancy in how rental stock availability is calculated.
Original PR description
**Issue**: The displayed available quantity on the ecommerce product page is incorrect for rental products when "continue selling" is enabled. **Steps to reproduce**: - Create a rental product…
**Issue**: The displayed available quantity on the ecommerce product page is incorrect for rental products when "continue selling" is enabled. **Steps to reproduce**: - Create a rental product tracked in stock with a quantity of 5 - Enable "continue selling" and "show available quantity below 10" - Go to the ecommerce page of this product - Rent 3 units for a given period, confirm and pay - Return to the ecommerce product page -> Whatever the selected renting period, the displayed quantity is always 2 **Cause**: The website displays `free_qty`: https://github.com/odoo/enterprise/blob/41c729e22c5fd1abb690f8335e933f793be0b319/website_sale_stock_renting/static/src/xml/website_sale_stock_renting_product_availability.xml#L15 `free_qty` is computed in: https://github.com/odoo-dev/odoo/blob/0935829ddaecd7b2b6eec9157f8f790b546d06ff/addons/website_sale_stock/models/product_template.py#L36 which leads to: https://github.com/odoo/enterprise/blob/41c729e22c5fd1abb690f8335e933f793be0b319/website_sale_stock_renting/models/website.py#L10 and ultimately relies on: https://github.com/odoo/odoo/blob/37bf1703c7478a3010b71cd60bbb43b3295a605b/addons/stock/models/product.py#L213 This computation does not take the selected renting period into account. There is a period-aware computation here: https://github.com/odoo/enterprise/blob/41c729e22c5fd1abb690f8335e933f793be0b319/website_sale_stock_renting/models/website.py#L15C17-L21C1 but it is only triggered when `product.allow_out_of_stock_order` is False (i.e. when "continue selling" is disabled). opw-[5354163](https://www.odoo.com/web#id=5354163&view_type=form&model=project.task) Forward-Port-Of: odoo/enterprise#105159 Forward-Port-Of: odoo/enterprise#103333
This update resolves an issue where purchase events weren't sending the correct data to Google Analytics. The fix converts a JSON string received from the website into a proper object, ensuring all purchase details (like transaction ID and value) are accurately tracked. This improves the accuracy of our website analytics.
Original PR description
## Description The `Tracking` interaction's `setup()` method reads order tracking info from the HTML `data-order-tracking-info` attribute and passes it directly to `_trackGa()` → `gtag()`. Since the…
## Description The `Tracking` interaction's `setup()` method reads order tracking info from the HTML `data-order-tracking-info` attribute and passes it directly to `_trackGa()` → `gtag()`. Since the DOM `dataset` API always returns strings, `gtag()` receives a JSON string instead of an object, causing GA4 to silently drop all purchase event parameters (`transaction_id`, `value`, `items`, etc.). Compare with `onAddToCart()` in the same file, which receives its data via `CustomEvent.detail` (already a JS object) and works correctly. **Impacted versions:** - 19.0 **Steps to reproduce:** 1. Configure a Google Analytics key in Website > Settings 2. Add a product to cart and complete checkout 3. On `/shop/confirmation`, inspect the dataLayer or GA4 debug view **Current behavior:** - `add_to_cart` event fires with correct ecommerce parameters (object) - `purchase` event fires with a JSON **string** instead of an object — GA4 silently drops the parameters **Expected behavior:** - `purchase` event fires with a parsed object containing `transaction_id`, `value`, `currency`, `tax`, `items` **Fix:** Add `JSON.parse()` to convert the data attribute string back to an object before passing it to `gtag()`. --- I hereby confirm I have signed the Odoo CLA (included in this PR as `doc/cla/corporate/comma.md`). Forward-Port-Of: odoo/odoo#253074
This update ensures invoices are generated correctly by only using bank accounts that are authorized for outgoing payments. Previously, errors could occur if an invalid bank account was selected. Now, the system prioritizes customer and payment journal banks, ensuring smoother transactions and preventing potential payment failures.
Original PR description
Before this commit: --- - Invoice generation could fail when the selected partner or company bank did not allow outgoing payments. - The first available bank account was used without checking whether it was valid for out payments. After this commit: --- - Select only bank accounts that allow outgoing payments. - Prioritize customer banks for refunds, then payment journal banks, and finally company banks as fallback. - Prevent errors caused by untrusted or unsupported bank accounts. task-5954530 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253158 Forward-Port-Of: odoo/odoo#250062
This update fixes an issue where cancelled stock moves were incorrectly impacting the calculation of kit costs in sales orders. The change ensures that only completed stock moves are used when determining kit component values, resulting in more accurate sales order pricing. This improves the reliability of sales reporting.
Original PR description
Currently cancelled moves are also being used when getting the value. This is already done in the main method: https://github.com/odoo/odoo/blob/049321aa5e0d4271050b406477bac5fb788b410b/addons/stock_account/models/account_move_line.py#L67 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253028
This update corrects tax reporting templates for Belgium, Netherlands, Luxembourg, and France, ensuring accurate UBL/CII tax category and exemption reason codes are used. Specifically, the BE tax template now correctly identifies tax codes for all taxes, resolving previous inconsistencies and improving compliance with international tax regulations.
Original PR description
Before this commit : NL,FR,LU tax templates did not define the UBL/CII tax category and exemption reason codes. In BE tax template, all cocontracting taxes had "AE" tax code and "VATEX-EU-AE" tax exemption reason code, even for non-0% cocontracting taxes. Some other taxes didn't have the correct codes. After this commit : All relevant NL,FR and LU tax templates now define their UBL/CII tax category and exemption reason codes. Specific reason codes are assigned where applicable. In BE tax template, taxes are now corrected, all taxes have their relevant tax codes. task-4976471 --- I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr) Forward-Port-Of: odoo/odoo#251262 Forward-Port-Of: odoo/odoo#250013
This update ensures that our UY e-invoicing process can correctly validate invoices by granting necessary permissions to access company-specific data. Previously, the system would fail if the user lacked specific group access, leading to validation errors. This change resolves that issue and improves the reliability of the UY e-invoicing feature.
Original PR description
This pull request makes a small update to the `_ucfe_inbox` method in `l10n_uy_edi_document.py` to ensure that company-specific fields are always accessed with the appropriate permissions. This is achieved by using the `sudo()` method when retrieving the `l10n_uy_edi_ucfe_commerce_code` and `l10n_uy_edi_ucfe_terminal_code` fields from the `company` record. * Ensured that `l10n_uy_edi_ucfe_commerce_code` and `l10n_uy_edi_ucfe_terminal_code` fields are accessed with elevated permissions by calling `company.sudo()` in the `_ucfe_inbox` method (`l10n_uy_edi_document.py`). Without this fix, if the user doesn't belong to group "base system", it won't be able to validate CFEs, receiving the following message: <img width="1272" height="400" alt="image" src="https://github.com/user-attachments/assets/ec4223fb-5b96-4a3e-babf-2f6a35ecd123" /> Forward-Port-Of: odoo/enterprise#105918
This update fixes a bug where invoices were being created for timesheets that had already been billed, leading to inaccurate financial records. The change prevents the system from generating new invoices for timesheets that have been fully invoiced, ensuring correct billing and reporting. This resolves a critical issue impacting invoice accuracy.
Original PR description
__ ## Short functional explanation of the error When we create an invoice for a quotation that holds a timesheet product and recorded timesheets for last month. In the wizard, we set the timesheet…
__ ## Short functional explanation of the error When we create an invoice for a quotation that holds a timesheet product and recorded timesheets for last month. In the wizard, we set the timesheet period from the first to the last day of last month. Then, we set the `Invoicing Switch Threshold` to the day of last month. We record another hour for the timesheet, for this product, for today. When we select last month as timesheet period when creating a new invoice, the 2 hours that have already been invoiced are reinvoiced. Moreover, once we confirm this second invoice, it is possible to create again and again invoices for these already invoiced timesheets, without changing the Invoicing Switch Threshold parameter. ## Reproduction Steps 1. Create a quotation. Add as a line a timesheet product. Set the quantity to 2. Validate and click on the smart button Recorded. 2. Record 2 hours with a random date for last month. 3. Create an invoice. In the wizard, set the timesheet period to the first -> the last day of last month. Confirm, and on the invoice form, set the invoice date to last month (after the day on which you recorded the timesheet hours) and confirm. 4. Click on configuration > settings. Search for Invoicing Switch Threshold, and set the date to the last day of last month. 5. Go back to the invoice you created. It should have the ribbon `Ìnvoicing App Legacy`. 6. Go back to the sales order. Click on the smart button Recorded and add one more hour to the timesheets, but this time in February. 7. Create an invoice. On the wizard, set the timesheet period to the first -> last day of last month. Click confirm. ### Expected behavior The system shouldn't let us create an invoice, as we have nothing to invoice, as all the timesheets have already been invoiced. ### Unexpected behavior An invoice is created with 2 hours. It doesn't take into account the hours added in February (normal) but reinvoices the timesheets that have already been invoiced (not normal). ## Origin of the issue When retrieving the quantities to invoice for the timesheets, we don't take into account the quantities already invoiced for the same timesheet. __ opw-5426434 Forward-Port-Of: odoo/odoo#250946
This commit addresses several improvements and bug fixes within the Field Service module, primarily focused on enhancing the reporting and usability for planning users. Key changes include accurate timesheet calculations, improved report visibility, and streamlined workflow adjustments to ensure data consistency and a better user experience.
Original PR description
This commit continues to review the new Field Service to make sure the features migrated from the old Field Service are still available and also improve a bit the flow to facilate the day to day of…
This commit continues to review the new Field Service to make sure the features migrated from the old Field Service are still available and also improve a bit the flow to facilate the day to day of planning users using Field Service feature. In detail, this commit will: - fix traceback and access rights on creation of worksheet - use generated timesheets of the intervention for the report. To do that a new one2many field called `intervention_timesheet_ids` is added in `planning.slot` model. And so instead of relying on 'timesheet_ids' of the slot, which are not necessarily linked to the intervention, we compute the effective hours based on the timesheets generated by the intervention, and use that field in the report and stat button. - change color of trash button in form view in gantt - make sure no planned shifts are not displayed - simplify kanban card when shift is not planned - some relabeling and change worksheet visibility condition in the report - hide resource_ids in calendar popover when empty - hide Field Service report if no customer report - compute is_absent field if shift is not completed - raises a user error when the user tries to reset the state of an intervention in draft if the state was in progress or completed - hides `Hide price on customer report` in settings of planning app if `Customer Report` feature is disabled - add space between worksheet and photos in the portal view and in Field Service report - compute quotations_count field in planning.slot only if the user has sales access - makes sure the context is reset before taking the display name of the customer set to set it to display name of the shift. Because before this commit, when the user creates a new shift and set a customer to the intervention, the display_name of the shift will contain the customer name but also his address which is not really expected. - reorder worksheets data/demo to have the one created in demo data first once the demo data are loaded - relabel email template in field service - order the tracking in planning.slot - reset SO when customer changes - show field service stat button in SO when SO is generated/linked to an intervention. - text white for conflicts tag in kanban otherwise the text is not correctly lisible in light mode. - fix worksheet visibility in portal/report - fix action_complete() and sale_line_id computation when no SO - review card_top of kanban card of planning slot - hide effective_hours and related fields from views/reports - remove group to prevent access errors in SO - hide partner_phone if no partner set on the shift - add photos in field service report - don't allow to add material on draft or published, we should only be able to add material when the intervention is in progress or completed task-5994280