Daily updates from Odoo
Monday, January 19, 2026
14 changes · saas-18.2
Resolved issues and error corrections
This update fixes a bug where inviter notifications were sent to portal users when they connected for the first time. Now, inviters only receive notifications for internal users, reducing unnecessary alerts and improving the user experience. The notification message has also been updated for clarity.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ When a user was invited to Odoo, the inviter received a first-connection notification when the invited…
**Description of the issue this PR addresses:** ------------------------------------------------ When a user was invited to Odoo, the inviter received a first-connection notification when the invited user connected for the first time. This notification was triggered for **all user types**, including portal users. For portal users, this resulted in unnecessary toast notifications and chat window pop-ups. **Current behavior before PR:** --------------------------------- - The inviter is notified when any invited user connects for the first time. - This includes portal users. - Unnecessary notifications and chat pop-ups are shown for portal user connections. **Desired behavior after PR is merged:** ----------------------------------------- - The inviter is notified **only when an internal user** connects for the first time. - Portal users no longer trigger first-connection notifications. - The notification message is updated to: “[Username] just connected for the first time. Wish them luck!” **Task:** [4105780](https://www.odoo.com/odoo/project/1519/tasks/4105780) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242235
This update increases the width of the barcode printed on customer receipts. Previously, the barcode was too narrow, causing scanning difficulties. This change ensures receipts can be easily and reliably scanned, improving the customer experience and order processing efficiency.
Original PR description
Step to reproduce; - install pos_loyalty - create a loyalty program of type "next order coupon" with minimum spend of 1$. - open pos and settle a order, see receipt. Issue: - currently bar-code is too narrow, making it difficult for to be scanned Fix: - increase the width of barcode, so it can be easily scanned. <table> <tr> <td> <b>Before</b> </td> <td> <b>After</b> </td> </tr> <tr> <td> <img width="451" height="508" alt="image" src="https://github.com/user-attachments/assets/a0d1e95e-0a9d-4552-977a-0ad9686867b8" /> </td> <td> <img width="456" height="517" alt="image" src="https://github.com/user-attachments/assets/40d04ac4-9ffc-4f81-a063-31b3ea26b4e1" /> </td> </tr> </table> opw-5363916 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242469
This update resolves an error that occurred when users removed the start date of a leave request and then assigned a resource. The fix ensures the system correctly calculates the calendar ID for leave records, regardless of whether a contract start/end date is defined, improving the reliability of leave scheduling.
Original PR description
Currently, an error occurs when user sets the resource on a resource leave. **Steps to Reproduce:** - Install `hr_contract` with demo data. - Go to `Resource Time Off`. - Create a new record and…
Currently, an error occurs when user sets the resource on a resource leave. **Steps to Reproduce:** - Install `hr_contract` with demo data. - Go to `Resource Time Off`. - Create a new record and remove the `start date` value. - Select the `Anita Oliver` resource `(employee record with running contract)`. **Error:** `TypeError: '<=' not supported between instances of 'datetime.datetime' and 'bool'` **Cause:** This error occurs when the user removes the start date and sets a resource that is linked to an employee with a contract. In this case, the system groups leave records based on the contract [1], and while computing calendar_id for the leave, it filters records by checking whether the leave start date falls between the contract start and end dates [2]. Since the leave start date is False, the comparison raises the error. Another issue is that when the user changes the start date, the calendar_id should be updated based on the employee’s current contract. **Fix:** This commit ensures that when setting or changing the resource_id, for contracts with and without a start date, the calendar_id is computed correctly. [1]: https://github.com/odoo/odoo/blob/5f8336c7d8ab891103a3035a9ebb5242cfa46ce6/addons/hr_contract/models/resource_calendar_leaves.py#L17 [2]- https://github.com/odoo/odoo/blob/5f8336c7d8ab891103a3035a9ebb5242cfa46ce6/addons/hr_contract/models/resource_calendar_leaves.py#L29 **No Task ID** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241638
This update resolves an issue where tables inserted into the To-Do editor appeared after the existing text instead of before it. The fix streamlined the table insertion process, moving the logic to a more robust system that correctly handles cursor positioning and DOM updates. This ensures tables are consistently placed where users expect.
Original PR description
### Steps to Reproduce : - Open To-Do and type some text. - Place the cursor at the start of the block. - Insert a table. (e.g.: /table) - The table appears after the text instead of before it. ### Purpose of this PR: - Table insertion logic was previously duplicated inside TablePlugin, where it tried to manually split text and inline nodes before inserting the table. However, this responsibility is now correctly handled by `DomPlugin.insert()`, which already: - deletes the current selection if needed. - splits text and inline nodes safely. - handles block boundaries and unsplittable elements. - normalizes the DOM after insertion. - places the cursor at a valid position. task-5480759 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243242
This update resolves an issue where the SAFT export process would fail for Austrian companies without defined contacts. The fix eliminates a redundant check, ensuring the system correctly validates the presence of at least one contact before generating the SAFT file. This prevents errors and ensures accurate SAFT reporting.
Original PR description
[FIX] l10n_at_saft: saft export traceback When no contacts is defined on the company and the user tries to download the SAFT to XML, a traceback is shown Steps to reproduce the traceback: - Install l10n_at_saft module and create an Austrian company with no contacts - Create a few invoices for this company - Open the General Ledger report and export SAFT to XML, the traceback should appear no-task Forward-Port-Of: odoo/enterprise#104483 Forward-Port-Of: odoo/enterprise#104144
This update fixes an issue where LATAM invoices with numeric sequence prefixes would incorrectly restart the invoice sequence, leading to duplicate document numbers. The change adjusts how invoice sequences are generated to properly handle the specific formatting requirements of LATAM legal invoicing, ensuring unique invoice numbers.
Original PR description
**Issue:** When invoices in a journal enabled to "Use Documents" for LATAM legal invoicing have a sequence prefix with numbers, the next invoice will restart the sequence and try to use already-used…
**Issue:** When invoices in a journal enabled to "Use Documents" for LATAM legal invoicing have a sequence prefix with numbers, the next invoice will restart the sequence and try to use already-used sequences. **Steps to Reproduce:** - Install l10n_pe_edi - Change to PE Company - Duplicate the Customer Invoice journal, give it shortcode "01A" - Create an invoice in dupe journal, set customer to "Comercial Constructora los Patitos S.A.", set product and tax, Document Type = (01) Factura - Confirm the invoice, it will have name "F F01-00000001" - Duplicate the invoice -> The new invoice has the same sequence number, and the document number is visible Expected: Invoice is called "Draft" (/), document number is not visible, and upon confirming the invoice, it will have the name "F F01-00000002" **Cause:** - LATAM invoices do not follow the standard formats in sequence_mixin.py, so _deduce_sequence_number_reset will always return "never" - However, the result of this method is used in _get_last_sequence_domain, and assumes that the sequence follows the corresponding format to "never" (_sequence_fixed_regex) - This isn't the case if the prefix has numbers, it will be captured in the _sequence_yearly_regex - anti-regex is used to filter sequences that aren't _sequence_fixed_regex, but this causes prefixes with numbers to never be found, and always restart the sequence **Solution:** - Add context value "no_anti_regex" to skip sequence exclusion - If the invoice is LATAM, call _get_last_sequence_domain with context "no_anti_regex" = True so no sequences are excluded. - Because LATAM invoices are always in a fixed format, we don't need to filter out sequences in other formats opw-5111844 Forward-Port-Of: odoo/odoo#235000
This update fixes an issue where LATAM invoices with numeric sequence prefixes were incorrectly restarting their invoice sequences. The change bypasses a filtering rule that was preventing the correct sequence generation, ensuring invoices are assigned unique, sequential numbers as required by LATAM regulations. This prevents duplicate invoice numbers and potential accounting errors.
Original PR description
**Issue:** When invoices in a journal enabled to "Use Documents" for LATAM legal invoicing have a sequence prefix with numbers, the next invoice will restart the sequence and try to use already-used…
**Issue:** When invoices in a journal enabled to "Use Documents" for LATAM legal invoicing have a sequence prefix with numbers, the next invoice will restart the sequence and try to use already-used sequences. **Steps to Reproduce:** - Install l10n_pe_edi - Change to PE Company - Duplicate the Customer Invoice journal, give it shortcode "01A" - Create an invoice in dupe journal, set customer to "Comercial Constructora los Patitos S.A.", set product and tax, Document Type = (01) Factura - Confirm the invoice, it will have name "F F01-00000001" - Duplicate the invoice -> The new invoice has the same sequence number, and the document number is visible Expected: Invoice is called "Draft" (/), document number is not visible, and upon confirming the invoice, it will have the name "F F01-00000002" **Cause:** - LATAM invoices do not follow the standard formats in sequence_mixin.py, so _deduce_sequence_number_reset will always return "never" - However, the result of this method is used in _get_last_sequence_domain, and assumes that the sequence follows the corresponding format to "never" (_sequence_fixed_regex) - This isn't the case if the prefix has numbers, it will be captured in the _sequence_yearly_regex - anti-regex is used to filter sequences that aren't _sequence_fixed_regex, but this causes prefixes with numbers to never be found, and always restart the sequence **Solution:** - Add context value "no_anti_regex" to skip sequence exclusion - If the invoice is LATAM, call _get_last_sequence_domain with context "no_anti_regex" = True so no sequences are excluded. - Because LATAM invoices are always in a fixed format, we don't need to filter out sequences in other formats opw-5111844 Forward-Port-Of: odoo/enterprise#101620
This update corrects a data omission in the Odoo Enterprise system related to Chilean SII (Service de Impuestos Internos) reporting. Specifically, the Regional Office for the Alto Hospicio area in Taracapá has been added, ensuring accurate tax reporting for businesses operating in that region. This ensures compliance with Chilean tax regulations.
Original PR description
Oficina Regional Alto Hospicio Comuna Alto Hospicio Región Taracapá Forward-Port-Of: odoo/enterprise#102712
This update fixes an issue where the company's overtime tolerance wasn't being calculated correctly when an employee had multiple attendance entries for the same day. Previously, even short overtime periods were incorrectly flagged as exceeding the tolerance. This change ensures that overtime is only calculated when it genuinely exceeds the defined company tolerance time, improving accuracy in time tracking.
Original PR description
_ ## Short functional explanation of the error When an employee enters multiple attendances for a single day, the company tolerance time isn't computed correctly. ## Reproduction Steps 1. Go to…
_ ## Short functional explanation of the error When an employee enters multiple attendances for a single day, the company tolerance time isn't computed correctly. ## Reproduction Steps 1. Go to attendances. 2. Click on configuration and scroll down to the Extra Hours section. Set a Tolerance Time in Favor of Company of 15 minutes. 3. Create 2 attendances for the same employee: one attendance from 8 to 15 for example, and a second one from 16 to 18:12. ### Expected behavior As the overtime entered is 12 minutes, which is inferior to the company tolerance time of 15 minutes, no extra time should be computed. ### Unexpected behavior 12 minutes of overtime are computed. ## Origin of the issue Let's say we enter 2 different shifts for the same day. Our work day should be 8 hours, and the sum of both shifts reaches 8 hours or more. We shouldn't have any overtime. However, in the code, the overtime is negative. This is compensated by, in our case, the post-work time: in our case, our overtime duration will be equal to -1, but our post-work time will be equal to 1.2. Both cancel each other, and in the end we obtain 0.2 of overtime, which corresponds to our 10 minutes overtime. However, in this code: https://github.com/odoo/odoo/blob/afcbd98594c9f7007f03a343ea40ea122b955459/addons/hr_attendance/models/hr_attendance.py#L374-L380 it isn't computed that way: because post-work time is 1.2, which is above our company tolerance time of 15 minutes (0.25 in the code), we will always be in the case where we exceed the tolerance time. Hence, we have to "flatten" the overtime duration and the post-work time before reaching that piece of code. note: the same bug exists for the employee tolerance time, which is corrected in this commit. __ opw-5136861 --- Forward-Port-Of: odoo/odoo#244186 Forward-Port-Of: odoo/odoo#242517
This update resolves a bug in the Romanian Sales & Fiscal (SAFT) reporting module that was causing errors when processing different unit of measure categories. The fix ensures reports generate accurately by correctly handling data processing, minimizing potential disruptions to reporting functionality.
Original PR description
`saft_template` in `l10n_ro_saft` adds a table that loops over the different Unit of Measures (`uoms`) available. The issue is that if the `uoms` are part of different categories (ie: Length and Weight) we get a singleton error as we're trying to access a non-relational field of a recordset with multiple records. The commit fixes the error by using the already defined variable `uom` OPW-5499918 Forward-Port-Of: odoo/enterprise#104478
This update fixes a layout issue with image galleries containing many images, preventing indicator crowding. It also addresses a laggy visual experience in Firefox caused by lazy loading, now preloading images for smoother transitions. This improves the overall user experience and visual appeal of image galleries.
Original PR description
## [FIX] website: add versioning for GallerySlider interaction The GallerySlider interaction (and its edit mode counterpart) is not up to date: the logic is still written for old snippets (before…
## [FIX] website: add versioning for GallerySlider interaction
The GallerySlider interaction (and its edit mode counterpart) is not up
to date: the logic is still written for old snippets (before [9042b1c],
so before 18.0).
In the meantime, the pagination for the indicators was lost, meaning
that if you add too many images, the indicators will have less and less
space.
Steps to reproduce:
- Drop an Image Gallery snippet
- Set the indicators to squared or rounded miniatures
- Add 15 or more images
=> All the indicators are crammed into the same line.
With this commit, we deprecate the old `GallerySlider` interaction and
create a `GallerySlider001` for the snippets dropped since 18.0.
For the indicators, instead of a pagination, we now use a horizontal
scrolling container which centers on the active indicator.
[9042b1c]: https://github.com/odoo/odoo/commit/9042b1c
## [FIX] website: preload available carousel images
As images are lazy loaded, it means that in the context of a carousel or
an image gallery, they only start loading once the user clicks either on
its indicator or on the previous / next button (or after completing an
auto-slide). While Chrome seems to optimize that to make it seemless, on
Firefox this causes the carousel slide to appear blank for a moment
before the image suddenly pops up, as the sliding animation arrives to
its end.
In effect, this causes a flicker and a feeling that the carousels, and
especially the gallery, is extremely laggy.
To mitigate that while trying to keep the advantages of image lazy
loading, this commit partially backports [08d837e], which loads the
images of the next and the previous carousel items.
Additionally, we prefetch the target images on pointerdown / keydown on
an indicator. That may seem like too small of a difference to be
interesting, but it actually gives a little bit of time between the
pointerdown and pointerup (which triggers the slide event) to start
loading the images, which with a correct connexion already goes a long
way towards mitigating the laggy feeling.
[08d837e]: https://github.com/odoo/odoo/commit/08d837e70f28a84a9bd97974f5d15d387a42b7c0
task-5245513This update fixes an issue where invoices could be incorrectly linked to DIAN documents due to a previous fix that didn't account for legitimate DIAN error messages. Now, the system verifies key invoice details (customer, date, time) before linking a DIAN identifier, ensuring accurate document association and preventing data discrepancies.
Original PR description
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian…
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian localization with valid DIAN credentials - Create an invoice for a Colombian customer - Confirm the invoice - Send the invoice to DIAN - Cancel and delete the invoice - Create another invoice for another Colombian customer with the same name (sequence) than the previously deleted invoice - Confirm the invoice - Send the invoice to DIAN **Issue:** A previous fix (https://github.com/odoo/enterprise/commit/4d782030631350cfaa8f2993e68f33c9f66929e4) had been made to sync together a DIAN document from Odoo and DIAN when the following error was returned by DIAN: "Regla: 90, Rechazo: Documento procesado anteriormente." It can happen when an invoice is sent to DIAN but due to a connection issue, the DIAN response is not received and the invoice is flagged as rejected. In that case, the "Regla: 90" error is returned by DIAN when trying to send the invoice again and the fix is linking the identifier returned by the DIAN error with the invoice to prevent this issue. However, the fix wasn't taking into account the case in which the error returned by DIAN is legit and the identifier is linked to another document. It results of having an invoice that is linked to an incorrect document in DIAN. The customer, date and other info, completely different. **Solution:** When "Regla: 90" error is returned by DIAN, a check is performed to make sure that the customer, the issue date and time on the document in Odoo and on the XML from DIAN are the same before assigning the identifier from DIAN to the document in Odoo. opw-5095212 Forward-Port-Of: odoo/enterprise#99936
This update ensures Argentinian users can correctly issue credit notes by adding document type 110 - CREDIT NOTE TICKET, as required by AFIP regulations. Previously, this option was missing, preventing proper credit note creation. This change improves compliance and functionality for Odoo users in Argentina.
Original PR description
**Description of the issue/feature this PR addresses:** This PR adds the AFIP document type 110 - CREDIT NOTE TICKET, which is required for the Argentinian localization **Current behavior before…
**Description of the issue/feature this PR addresses:** This PR adds the AFIP document type 110 - CREDIT NOTE TICKET, which is required for the Argentinian localization **Current behavior before PR:** When users in Argentina tried to create a credit note for a ticket, the corresponding document type was not available as an option. **Desired behavior after PR is merged:** After this change, users can now select "110 - CREDIT NOTE TICKET" to issue the document correctly. [HERE](https://app.screencastify.com/watch/fVBWwSD6DAcodKO57qUZ) is a video replicating the issue 1) In localization Argentina, check document types and see that 110 CREDIT NOTE TICKET exists 2) Create a new journal as shown in the video 3) Create an invoice selecting that journal, and (83) TICKET as Document Type 4) Confirm the invoice and try to create a credit note. See that (110) CREDIT NOTE TICKET does not appear as an option --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228256
This update corrects a bug that prevented users from importing XML invoices through the accounting module when the CustomizationID tag was missing. The CustomizationID tag is a required element in UBL files, and this fix ensures that invoices with this tag are now correctly processed.
Original PR description
[FIX] account_edi_ubl_cii: xml import error customization id This error happens when the user tries to import an xml invoice in accounting > customer > invoice and the CustomizationID tag is empty. The cause of this is the CustomizationID tag that exists in the file, but it's empty. This tag is mandatory in a ubl file, so we cannot process the file if it's empty. opw-5238398 Forward-Port-Of: odoo/odoo#236668