Daily updates from Odoo
Tuesday, March 17, 2026
13 changes · 18.0
Resolved issues and error corrections
This update ensures that all users involved in an appointment booking – including internal staff and organizers – receive a notification, regardless of whether the booking syncs with external calendars. Previously, notifications were limited, leading to a poor user experience. This change simplifies the notification process and ensures everyone stays informed.
Original PR description
In [1] we prevented cancelation emails from being sent when the booking was synced via google or outlook calendar. However this means even followers who would not be notified by the mail provider (not assisting to the meeting) would not be notified. As well as the organizer who is doing to booking/cancelling from the perspective of the mail provider, as the meeting is created from their account. Instead we should keep sending the "appointment booked" template in all cases as it is only followed by internal users to whom it is always relevant. As for cancelation templates, it should stil be sent to internal users. Partners of the meeting however need not be notified and may be unsubscribed if syncing is enabled, as cancellation typically only happens once. task-5152917 [1]: https://github.com/odoo/enterprise/pull/60913
This update fixes a bug where project timesheets didn't accurately reflect labor costs when changing the employee assigned to a manufacturing order. The fix automatically updates the AAL (analytic accounting line) associated with the work center, ensuring accurate tracking of employee hours and costs within the project dashboard. This improves the reliability of project cost reporting.
Original PR description
### Steps to reproduce: - Create an MTO product and another Service product that create a project and task - Create a quotation with both products - Create two employees with different hourly cost - Go to Manufacturing order - Configure an employee to manufacture the product at a work station. - Observe the project dashboard - Go back to the MO and change the employee on the work station - Notice the project dashboard Timesheets section doesn't have any change on the amount ### Cause: This is happening because when changing the employee we don't modify anything in the AAL linked to the work station. As we only modify the AAL when the duration change. ### Fix: We call _create_analytic_entry when we change the employee on the work station to change the amount and the employee_id for the AAL. opw-5939321
This update fixes an issue where sales order margins were incorrectly calculated due to a misunderstanding of the company context. The fix ensures margins are accurately determined based on the company associated with the specific sales order line, regardless of the user's default company setting. This improves the reliability of margin reporting.
Original PR description
Steps to reproduce: - Have 2 companies: - Company A with a property_cost_method 'average' - Company B with a property_cost_method 'standard' - Create a sales order in B - Set the default company of the user to A. - Under certain scenarios, when we confirm the sales order, there will be a `flush_all`. - When that's the case, margins are recomputed with `line.product_id.categ_id.property_cost_method` as `average` instead of `standard`. In other words, it will take the property_cost_method from the `user.company_id` (A), instead of the property_cost_method from the `line.company_id` (B). This fix ensures the `property_cost_method` considered is the one related to the company of the sale order line. A similar issue was fixed on https://github.com/odoo/odoo/pull/192890 OPW-5939464 Forward-Port-Of: odoo/odoo#252161
This update fixes an issue where imported invoices incorrectly matched purchase orders when only part of the ordered quantity had been received. The change adds a crucial check to ensure invoice quantities align with the actual delivered quantities, preventing mismatched records and improving data accuracy. This ensures consistent reporting and avoids discrepancies between invoices and purchase orders.
Original PR description
## Issue: When a Purchase Order is created for a quantity of 2 and only 1 unit is received, importing a vendor bill with quantity 2 and the same unit price incorrectly results in a full match The PO…
## Issue: When a Purchase Order is created for a quantity of 2 and only 1 unit is received, importing a vendor bill with quantity 2 and the same unit price incorrectly results in a full match The PO is linked, but the bill line quantity is overwritten to 1 (the received quantity), leading to an inconsistency between the imported bill and the original document ## Cause: In `_match_purchase_orders()`, a match is performed based on `partner_id` and `amount_total`: https://github.com/odoo/odoo/blob/92a3fe87c711f18d955ddf454ce1f4194dfcda20/addons/purchase/models/account_invoice.py#L429-L439 However, the previous safeguard logic related to `total_match` is missing: https://github.com/odoo/odoo/blob/92a3fe87c711f18d955ddf454ce1f4194dfcda20/addons/purchase/models/account_invoice.py#L388-L400 This check is not only meant to compare total amounts; it should also ensure that the `amount_to_invoice` is consistent When the purchase method is based on received quantities, the full ordered quantity should not be considered a full match if part of it has not yet been delivered ## Steps to reproduce: We'll use the default company as vendor, choose depending on your setup - Install `purchase` - Create a Product (invoicing policy: ordered qty, and control policy: delivered qty) - Create and confirm a PO (Vendor: Default Company, Product: Created Product, Quantity: 2, Unit Price: 100) - Set the received quantity to 1 - Create and post an Invoice (Customer: Default Company, Product: Created Product, Quantity: 2, Unit Price: 100) - Download the PDF - Go in Bills and import the PDF Before the fix, the match should be done and there is a quantity mismatch opw-5043054
This update resolves an issue where the Public Administration (PA) invoice status wasn't correctly updated after SDI validation, leading to potential rejection errors. The fix ensures that the PA status accurately reflects the invoice's real-time state, improving data consistency and reducing processing delays. This change impacts Italian VAT compliance.
Original PR description
### Issue: After the SDI validation, the state was never updated to match the PA state, resulting in a mismatch with the actual status ### Cause: When `l10n_it_edi_state` is set to `forwarded`, the cron `cron_l10n_it_edi_download_and_update` doesn't consider that a new state could occur However, invoices sent to Public Administration can still be rejected after being forwarded It is not possible to reproduce the issue with the demo system, as it only sets the state to `forwarded` Ticket [link](https://www.odoo.com/odoo/project.task/5391891) opw-5391891
This update corrects a recent change that removed the ability to click on component lots within the traceability report. The initial removal was a poor workaround to limit breadcrumb size, and this fix restores the intended functionality. This ensures users can fully trace components within the traceability report.
Original PR description
commit d7f81c25555c800bf296da2507d010257292aa55 It was removed in order to limit the breadcrump size. However it was a stupid solution and it's better to let the feature rather than limiting the breadcrump size.
This update simplifies invoice processing by automatically enabling self-billing functionality within the core Odoo account module. Previously, this required a separate module. Additionally, the xRechung integration has been removed, ensuring invoices are only sent to government entities as intended.
Original PR description
Everybody is now able to receive self billing invoices even without the additional module. So the service should be added to the base module. Also remove xRechung because users are not supposed to receive it, only government. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where certain valid Non-Resident (NRI) GSTINs were not recognized during the partner auto-complete process. The fix updates the validation logic to accommodate newer GSTIN formats, ensuring accurate identification of NRI tax IDs. This improves the usability of the company creation feature for users with NRI tax registrations.
Original PR description
Currently, certain `valid GSTINs` for Non-Resident taxpayers are not recognized by the partner `autocomplete` feature. **Steps to reproduce:** - Install the `l10n_in` and `partner_autocomplete`…
Currently, certain `valid GSTINs` for Non-Resident taxpayers are not recognized by the partner `autocomplete` feature. **Steps to reproduce:** - Install the `l10n_in` and `partner_autocomplete` modules. - Navigate to Settings > Users & Companies > Companies. - Click `New` and set `Tax ID` to `9922JPN29001OSU`. - Wait for 5–10 seconds. **Observation:** The partner autocomplete does not trigger, although it is valid and verifiable on the official GST portal: https://services.gst.gov.in/services/searchtp **Root Cause:** The issue was already fixed in core validation by PR [1], but the GSTIN validation logic used in partner autocomplete was not updated. At [2], the GSTIN validation regex for NRI taxpayers only supports formats ending with `NRX` (X = any alphanumeric character). However, certain valid GSTINs follow a revised structure and therefore are not matched by the existing regex. **Fix**: This commit ensures that valid NRI GSTIN formats are accepted during validation by applying a fix similar to [1] to the partner autocomplete GSTIN validation at [2]. Related IAP PR: https://github.com/odoo/iap-apps/pull/1491 [1]: https://github.com/odoo/odoo/pull/251760 [2]: https://github.com/odoo/odoo/blob/3016c08a7aa8701ec9b0092b5aafc282b16dd9f3/addons/partner_autocomplete/static/src/js/partner_autocomplete_core.js#L36-L52 Forward-Port-Of: odoo/odoo#253799
This update corrects a bug that caused incorrect hour calculations in the Gantt view for flexible work schedules. The issue stemmed from timezone discrepancies between employee calendars and the system, leading to inflated hour displays. The fix ensures accurate hour calculations regardless of timezone differences.
Original PR description
Description: ------------------ When viewing attendance in Gantt view with flexible working schedules, expected hours displayed incorrectly when device, company, and employee calendar timezones differ (e.g., 1 day shows 16h instead of 8h). Root cause: ------------------ Two related timezone handling issues: 1. Gantt passes UTC boundaries that span multiple calendar days when converted to calendar timezone 2. Resource calendar creates flexible intervals using wrong timezone (employee timezone instead of calendar timezone) Solution: -------------- - hr_attendance_gantt: Normalize date boundaries to full calendar days in calendar timezone before passing to interval calculation - resource: Force flexible hours block to consistently use calendar timezone for date extraction and interval creation opw-5241330
This update fixes an issue where attendance hours were incorrectly calculated when employees and companies had different time zones. The change ensures accurate hour calculations for flexible work schedules by consistently using the company calendar timezone. This improves the reliability of attendance tracking.
Original PR description
Description: ------------------ When viewing attendance in Gantt view with flexible working schedules, expected hours displayed incorrectly when device, company, and employee calendar timezones…
Description: ------------------ When viewing attendance in Gantt view with flexible working schedules, expected hours displayed incorrectly when device, company, and employee calendar timezones differ (e.g., 1 day shows 16h instead of 8h). Root cause: ------------------ Two related timezone handling issues: 1. Gantt passes UTC boundaries that span multiple calendar days when converted to calendar timezone 2. Resource calendar creates flexible intervals using wrong timezone (employee timezone instead of calendar timezone) Test update: ------------------- Updated test_no_carried_over_leaves_for_flexible_resource to reflect correct flexible calendar behavior. For flexible calendars, the duration between dates counts inclusive calendar days. Changed the calculation from `days * 24 / hours_per_day` to `(end_date - start_date).days + 1` to properly account for inclusive date counting (e.g., Dec 30 to Dec 31 includes both days = 2 days). Solution: -------------- - hr_attendance_gantt: Normalize date boundaries to full calendar days in calendar timezone before passing to interval calculation - resource: Force flexible hours block to consistently use calendar timezone for date extraction and interval creation opw-5241330
This update resolves a problem where invoices with specific fixed tax configurations (related to 'vidange/consigne') were failing Peppol validation checks. The change adjusts how fixed taxes are handled during invoice generation to ensure compliance with Peppol standards for VAT breakdowns. This prevents errors when returning these types of invoices.
Original PR description
**PROBLEM** Here is the client use case: The client uses fixed tax to do 'vidange/consignage'. When selling a product with a 'consigne/vidange', they add a fixed tax which amount correspond to the…
**PROBLEM** Here is the client use case: The client uses fixed tax to do 'vidange/consignage'. When selling a product with a 'consigne/vidange', they add a fixed tax which amount correspond to the 'consigne/vidange'. When returning the 'consigne', you would create an invoice line, with a product with a price of 0, negative quantity,a 0% tax and the fixed tax for the 'consigne'. When an invoice contains such lines, it fails peppol validations. **STEP TO REPRODUCE** 1. Create a fixed tax used for 'vidange/consigne'. 2. Create an invoice, with a line with unit price of 0, negative quantity, a 0% tax and the fixed tax for the 'consigne'. 3. Send the invoice using peppol, use a validator to validate the xml and notice you get the following errors: [BR-E-01] [BR-E-08]. **CAUSE** Fixed tax (like the one used for vidange) are aggregated in new invoice lines by the function `_ubl_turn_emptying_taxes_as_new_base_lines()`. Let say we have the following invoice: line 1: qty=2, unit_price=3, taxes: 21% & vidange(fixed tax of 1). line 2: qty=-1, unit_price=0, taxes: 0% & vidange. After calling `_ubl_turn_emptying_taxes_as_new_base_lines()`, we got: line 1: qty=2, unit_price=3, taxes: 21%. line 2: qty=-1, unit_price=0, taxes: 0%. line 3: qty=1, unit_price=1(amount of the fixed tax), taxes:None. When generating the VAT breakdown, we have 2 line will end up being tax exempted (line 2 and 3). Because the `tax_exemption_reason` differs, they will not be merged in the same entry in the breakdown, which break the constraint of peppol saying we can only have one VAT breakdown with code 'Exempt from tax'. Line 2 reason comes from: https://github.com/odoo-dev/odoo/blob/de22093ee225df499b2de80e1f07dd281ac686bc/addons/account_edi_ubl_cii/models/account_edi_common.py#L271-L274 opw-5912986
This update corrects a bug that resulted in incorrect decimal values being generated in intrastat XML reports for French companies. The issue stemmed from how the system processed invoice data, specifically when handling weights with decimal amounts. This fix ensures accurate intrastat reporting, improving data reliability for tax compliance.
Original PR description
Steps to reproduce: - Select a French company and activate intrastat - Create an invoice with a 100% discount to a european partner and provide intrastat values such as intrastat code, product commodity code, ... and most importantly a weight with a decimal amount. - Create at least one other invoice to a european partner that has a date earlier than the first one (but on the same month) - Go to intrastat report and export the XML (DEBWEB2) and select EMEBI and then Departures. -> Issue: The line that got processed after the one with a 0 value is not properly post-process regarding the integer conversion because we used to iterate on a list that was modified at the same time. opw-5973832
This update fixes an issue where invoices with exchange differences and write-off accounts were incorrectly fully reconciled when the invoice remained open for partial payment. The change ensures that the system accurately reflects the partial payment and exchange difference, preventing incorrect accounting entries. This improves the reliability of foreign currency transactions.
Original PR description
Currently, if a user selects an exchange difference account as a write-off but then decides to keep the invoice open, the system still fully reconciles the invoice. Steps to reproduce: - Create an…
Currently, if a user selects an exchange difference account as a write-off but then decides to keep the invoice open, the system still fully reconciles the invoice. Steps to reproduce: - Create an invoice in foreign currency - Click 'Register Payment' - Select company currency - Change the amount to a lower one - Select 'Mark as fully paid' - Add the exchange difference loss/gain account as write off account - Select 'Keep open' - Click 'Create payment' Issue: Even though the user selected the option to create a partial payment and keep the invoice open, it is totally reconciled with a difference booked in the selected exchange account. Analysis: This occurs because the use of the exchange account as write off account trigger a specific flow used in localization where a writeoff is not allowed. Once the payment registration process is ongoing, the system does not check that user kept the same choice on how to handle the payment difference. opw-5468052 Forward-Port-Of: odoo/odoo#251965