Friday, September 12, 2025
24 changes · 19.0
Resolved issues and error corrections
This fix lets users with invoicing permissions update Argentine partner perception and withholding details on customer or vendor records. It helps billing staff prepare invoices correctly without needing full accounting administrator access.
Original PR description
Description of the issue/feature this PR addresses: This pull request adds `l10n_ar.partner.tax_billing` on the `l10n_ar_partner_tax` model, granting read, write, and create permissions (but not…
Description of the issue/feature this PR addresses: This pull request adds `l10n_ar.partner.tax_billing` on the `l10n_ar_partner_tax` model, granting read, write, and create permissions (but not unlink) to users in the `account.group_account_invoice` group. Current behavior before PR: Only users with administrator access rights on the Accounting module could modify the "Perceptions / Withholdings" Section on the "Accounting" tab of the partners. <img width="1236" height="673" alt="image" src="https://github.com/user-attachments/assets/92b42973-2b01-4019-8e23-5e3cbf5111a4" /> Desired behavior after PR is merged: Users with invoicing rights can modify the Accounting module could modify the "Perceptions / Withholdings" Section on the "Accounting" tab of the partners. This is needed to properly create the invoices with the perceptions / withholding that apply, for example in cases where by default all partners are set with perceptions, but some depending on their activity are not taxed. In that case, the user that created the partner needs to be able to modify the field by putting a 0% aliquot or deleting the perception line on the contact. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225180
This fixes a crash that could happen when two employees had time off on the same dates but their time off types handled public holidays differently. Updating a public holiday during those overlapping absences now works reliably, helping HR teams manage calendars without interruptions.
Original PR description
When two timeoff (one with Ignore Public Holidays and the other without) have the same dates, if you modify a public holidays that happend during that time, it will trigger a traceback. Steps to…
When two timeoff (one with Ignore Public Holidays and the other without) have the same dates, if you modify a public holidays that happend during that time, it will trigger a traceback. Steps to reproduce: ------------------- * Marc demo and Abigail Peterson using the same calendar * Create a "Paid time off" leave for marc demo: June 19 - June 20 * Create a "Extra time off" for abigail: same date * Update Time off type "Extra Time Off" to "Ignore Public Holidays" * Approve both leave request previously created * Create public holidays on June 19 --> traceback Observation: When both time off have the same dates it will overide the value in the dictonary https://github.com/odoo/odoo/commit/0d846ecd1ec7ff5149d580d3494b1a4bab1e68d2#diff-38469def2f870bb866f971f57797dd7c21b6a95d52a8eae72f832f0eea2434f9R464 and when it will try to call the employe_id it will trigger the traceback https://github.com/odoo/odoo/commit/f72ac3a14d76d4fb53ec3a092d08afafe4c35888#diff-38469def2f870bb866f971f57797dd7c21b6a95d52a8eae72f832f0eea2434f9R561 Why the fix: ------------ Added a new key on work_days_data to avoid the collision of two similar timeoffs. opw-4933820 Forward-Port-Of: odoo/odoo#225884 Forward-Port-Of: odoo/odoo#221942
This update corrects several issues affecting helpdesk ticket assignment, accounting report exports, payroll calculations, and electronic invoicing checks. It also refreshes translations and hides an outdated Sign setting, improving reliability and reducing user confusion across multiple business workflows.
This fixes an issue where shop floor quality checks could crash or remain stuck in the wrong result after a worker reverted and repeated a check. Manufacturing operators can now retry quality checks and see the correct highlighted status, reducing blockers during production.
Original PR description
To reproduce: - Create a BoM for a product with an operation and a quality point for this operation - Create and confirm a MO for this BoM - Process it in Shop Floor, pass or fail the QC, revert it then pass/fail it again Current behaviour: traceback Expected behaviour: mark the quality check with primary highlight Introduced in: https://github.com/odoo/enterprise/pull/91986
This fix prevents Chilean electronic factoring document sending from crashing when the tax authority returns unexpected or invalid responses. It also refreshes invalid access tokens and adds test coverage, improving reliability when external tax services have intermittent issues.
Original PR description
There were some typos in this method. We add test coverage and we reset the token in situations where we receive invalid responses. It's apparently common for the SII to have some random errors that could result in invalid tokens being generated. Based on the work in https://github.com/odoo/enterprise/pull/92035. Forward-Port-Of: odoo/enterprise#94342 Forward-Port-Of: odoo/enterprise#94134
Batch payments now ignore payment term lines that have already been reconciled. This prevents errors when vendors are paid in multiple installments, allowing each installment to be matched to its bank statement normally.
Original PR description
**Steps to reproduce:** - Install accountant - Go to "Accounting / Configuration / Invoicing / Payment Terms" - Create a payment term having at least 2 installments (e.g. 20%-80%) - Create a bill: *…
**Steps to reproduce:** - Install accountant - Go to "Accounting / Configuration / Invoicing / Payment Terms" - Create a payment term having at least 2 installments (e.g. 20%-80%) - Create a bill: * Vendor: [any] * Payment terms: [the created payment term] * Amount: 1000 - Confirm the bill - Pay the first installment from the bill (i.e. 200) - Go to "Accounting / Vendors / Payments" - Select the payment and create a batch - Validate the batch payment - From Accounting dashboard, go to Bank journal - Create a statement: * Partner: [None] * Amount: -200 - Reconcile the statement with the batch payment - From the bill, pay the second installment (i.e. 800) - Go to "Accounting / Vendors / Payments" - Select the payment and create a batch - Validate the batch payment - From Accounting dashboard, go to Bank journal - Create a statement: * Partner: [None] * Amount: -800 - Reconcile the statement with the batch payment **Issue:** The following UserError is raised: "You are trying to reconcile some entries that are already reconciled." **Cause:** When reconciling a batch payment, all the payment term lines from the invoices/bills linked to the payment are used. However, in this case, when the first batch payment has been reconciled, the first payment term line of the bill (linked to the first installment) has been reconciled. It should not be reused when reconciling the second batch payment. **Solution:** Exclude reconciled payment term lines when reconciling a batch payment. opw-4830185 Forward-Port-Of: odoo/enterprise#92524 Forward-Port-Of: odoo/enterprise#91367
This update corrects several inventory replenishment planning issues so users see clearer warnings, graph labels, and ordering frequency information. It also improves deadline calculations across companies and locations, helping purchasing and stock teams get more accurate replenishment recommendations.
Original PR description
- make the invisible condition on the warning icon lighter to process - ensure the labels are shown on the Y axis of the graph no matter the value - show "Ordering Frequency: On demand" if the min and max qties are the same - compute the deadline_date one company at a time in case of different horizon_days - add a groupby location in _compute_deadline_date - do not add horizon_days to total_delay since it's not a lead time per se - removing a forgotten `visibility_days` task 5072870 & 19.0 inventory testing pad --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website builder now avoids unnecessary background work when opening the theme settings tab. This reduces the waiting time for users customizing website themes, with an estimated performance improvement of about 20%.
Original PR description
The purpose of this commit is to reduce the rendering time of the theme tab. Currently, when we have a BuilderRow that contains a collapse slot, we always render it in order to know whether it contains content or not, so that we can display the collapse arrow. The collapse feature is widely used in the theme tab. This results in a lot of unnecessary calculations, because the only case that requires dynamic calculation of the collapse arrow is the BuilderOption for visibility. So we will therefore add the “observeCollapseContent” props to enable or disable the rendering of the slot in order to dynamically display the collapse arrow. This change saves approximately 20% of time. 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#223929
Repair orders that require quality checks can now be created and saved without an error. The fix ensures lot and serial number information is handled correctly, reducing interruptions for repair and quality teams.
Original PR description
Issue: ---------------------------------------- When creating a repair order that has a quality point (defined for all products or for a specific product), or when trying to create a new lot/serial…
Issue: ---------------------------------------- When creating a repair order that has a quality point (defined for all products or for a specific product), or when trying to create a new lot/serial number from the repair order, a traceback is triggered: `ValueError: Invalid field 'lot_id' in 'quality.check'` Steps to reproduce: ---------------------------------------- - Install the `quality_repair` module. - Create a Quality Point for Operation: Repair Orders and set Control per Product/Operation. - Create a Repair Order and add a product to repair. - Save the Repair Order. - Traceback is triggered. Cause: ---------------------------------------- In PR https://github.com/odoo/enterprise/pull/90930, the `lot_id` field was replaced by a many2many field `lot_ids`. Repair orders were still trying to assign `lot_id`, causing the error. Solution: ---------------------------------------- In this commit, we ensure that `lot_ids` is set properly, allowing repair orders with quality checks to work smoothly and enabling users to assign lots/serial numbers without triggering errors. Task ID:- 5067457
Users can now save the document sorting wizard for finance folders even when pinned multi-actions include accounting record creation. The update prevents unsuitable AI actions from being selected automatically, while still allowing users to choose them manually when needed.
Original PR description
Bug === When trying to save the sort wizard for a folder having a pinned multi action, with a `documents_account_record_create` child action, then the constraint `_check_use_in_ai` was triggered, and it shouldn't. The reason is the way recursive compute work, we can not set `False` as the default, because it will allow the parent to be computed with that. Task-5077569
This fixes an error that occurred when users allocated a manufacturing order to a sales order or outgoing delivery. Users can now assign quantities in the manufacturing allocation report without being blocked by a crash.
Original PR description
Issue: ---------------------------------------- When creating a manufacturing order and trying to allocate it to the desired sale order or outgoing picking, a traceback is triggered: `AttributeError:…
Issue: ---------------------------------------- When creating a manufacturing order and trying to allocate it to the desired sale order or outgoing picking, a traceback is triggered: `AttributeError: 'stock.move' object has no attribute 'group_id'. Did you mean: 'grouped'?` Steps to Reproduce: ---------------------------------------- - Install the `mrp` module and enable `Allocation Report for Manufacturing Orders`. - Create a product with a BoM. - Create a Sale Order or outgoing picking for the product. - Create a Manufacturing Order and go to the allocation report. - Try to assign it to the picking. - Traceback is triggered. Cause: ---------------------------------------- In PR odoo#212679, the `group_id` field was replaced by a many2many field `reference_ids`. However, the `_action_assign` method still tried to set the value of `group_id` instead of `reference_ids`, causing the error. After this Commit: ---------------------------------------- In this commit, we ensure that `reference_ids` is used and set properly instead of `group_id`, allowing users to assign quantities to the desired picking smoothly without errors. Task ID: 5076863
Preparation tickets in Point of Sale now include customer notes added to individual order lines. This helps kitchen or preparation staff see special instructions at the right moment, reducing missed requests and order mistakes.
Original PR description
In this commit: ----------- Orderline-level customer notes are now printed on preparation tickets. Task-4879140 Related: https://github.com/odoo/enterprise/pull/90229 Forward-Port-Of: odoo/odoo#226382 Forward-Port-Of: odoo/odoo#215761
Printing an invoice now uses the same custom PDF report selection as sending an invoice. This ensures customers receive documents with the correct partner or journal-specific template, improving consistency and reducing manual workarounds.
Original PR description
Before: Clicking 'Print' on an invoice did not respect the custom PDF report template set on the partner profile or journal. The selection was only applied in the 'Send' flow, while 'Print' always fell back to the generic invoice report. After: 'Print' now uses `_get_default_pdf_report_id()` to determine the correct PDF report. This ensures the same priority order is applied as in 'Send'. Explanation: The method `_get_default_pdf_report_id()` encapsulates the logic for choosing the report template (user → invoice default in 18.0, extended with journal in later versions). By reusing this method, we avoid duplicating logic and ensure consistency between 'Send' and 'Print'. task-5072522 Forward-Port-Of: odoo/odoo#226082
New users can now connect Mercado Pago accounts using the existing access token setup while OAuth is not yet available. Odoo also sends the account country to Mercado Pago so the correct account is retrieved during onboarding.
Original PR description
Enable old account configuration for new users. Country code is passed to Mercado Pago proxy so correct account can be retrieved. OAuth was not configured yet on Odoo side, which means that new users couldn't connect their account. Access token is now visible and editable for all users.
Fixed an issue where adding a service line after a sales order was confirmed showed a zero cost instead of the product’s configured cost. This keeps margin information accurate for sales teams and financial reporting.
Original PR description
…O confirmation **Problem:** When a service is added on a SO after the confirmation the cost column (purchase_price) is 0 **Steps to reproduce:** - make sure that sale_timesheet_margin is installed - create a service with a positive cost - create a SO for 1 unit of this service - confirm - add a new line on the SO for the same service **Current behavior:** the cost is 0 **Expected behavior:** the cost should be the cost you set on the product form **Cause of the issue:** since this PR https://github.com/odoo/odoo/pull/207228 services that are "ordered_prepaid" on confirmed sale order are filtered out the purchase price computation https://github.com/odoo/odoo/blob/5f6d2afa8c09fe72c01d056ebef01214567a4a99/addons/sale_timesheet_margin/models/sale_order_line.py#L9-L15 opw-5016622 Forward-Port-Of: odoo/odoo#225704 Forward-Port-Of: odoo/odoo#225027
This fixes cases where protected links in the HTML editor, such as important website builder links, could be accidentally removed when deleting images, editing locked content, or removing multiple links at once. The toolbar now better reflects when a link cannot be removed, helping prevent broken page layouts after saving.
Original PR description
### [FIX] html_editor: prevent removal of unremovable links with images The override that remove a link on `deleteImage` command did not check if the link was unremovable before removing it. ###…
### [FIX] html_editor: prevent removal of unremovable links with images The override that remove a link on `deleteImage` command did not check if the link was unremovable before removing it. ### [FIX] html_editor: prevent removal of links in contenteditable=false If a link was `contenteditable=true`, but inside a `contenteditable=false`, it could be removed ### [FIX] html_editor: prevent removal of unremovable links in batch removal If the selection covers several links, the "unlink" of the toolbar removes all the links selected. This included the links which were supposed to be unremovable. The procedure for removing the links is changed to avoid removing the unremovable nodes. The availability of the tool in the toolbar is also changed to better reflect whether there is links to remove. In case of unremovable links, the tool is shown as disabled Steps to reproduce: - Open website builder - In the toolbar, insert links just before and after the "Contact Us" - Select from the link inserted before, to the one after - In the toolbar, click "Remove Link" - Bug: the link on "Contact Us" is gone, but it was "unremovable" (Saving after these steps currently breaks the toolbar's rendering) Forward-Port-Of: odoo/odoo#223237
This fix prevents carousel slides from changing when translators use arrow keys while editing text in the website builder. It avoids a crash and makes translating carousel content behave as expected, so users can move the text cursor safely.
Original PR description
Since the initial [website builder refactor], when in translate mode in website builder, pressing an arrow key when the cursor is inside the text of a carousel moved to the next slide once, pressing…
Since the initial [website builder refactor], when in translate mode in website builder, pressing an arrow key when the cursor is inside the text of a carousel moved to the next slide once, pressing again caused a crash. Before the refactor, there was also the slide behavior but not the crash. The arrows triggers the slide because the contenteditable is inside the slide in translate mode. It does not trigger it in normal edit mode because the contenteditable is on an ancestor. This commit fixes it by changing the config pass to the bootstrap carousel in edit mode, so that the carousel does not slide on keyboard. Changing this config makes the event handlers to stop the keydown event on the other parts of the carousel redundant, so they are removed Steps to reproduce: - Open website bulider - Drop the snippet "Quotes Minimal" - Add a second language to the website - Edit the translation for the second language - Click on the text in the quote in the carousel - Press a left or right arrow key - Bug: the slide changed (instead of moving the cursor in side the text) - Click on the text of the slide that is now shown - Press again the arrow key - Bug: Crash [website builder refactor]: https://github.com/odoo-dev/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641 Forward-Port-Of: odoo/odoo#226273
This fix lets employee users complete screens that include selecting multiple employees, even when they do not have direct access to employee records. It prevents access errors in HR, time off, and point of sale workflows, making everyday employee actions smoother.
Original PR description
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
This update prevents access errors for non-administrator users when employee-linked records are shown in appraisals, planning, manufacturing work orders, and the shop floor. It ensures regular authorized users can continue their daily HR and manufacturing workflows without needing administrator rights.
The Import Template button is restored for accounting moves and timesheets after it disappeared due to missing context information. This helps users access the correct import templates and reduces friction when bringing data into Odoo.
Original PR description
The context was removed in a previous change (#222793), which caused the "Import Template" button to disappear in `account.move` and `hr.timesheet`. These models rely on context keys in `get_import_template` to display the correct label and link. This commit adds the `context` back and tests for both models.
Customers could be incorrectly blocked from paying for an appointment when a resource allowed more than one capacity but capacity management was disabled. The fix ensures paid appointment bookings reserve only one booking slot in this setup, so valid bookings can proceed to payment as expected.
Original PR description
ISSUE ===== Introduced in odoo/enterprise@bce7e94650c337a9046958a7689c81db5b2a4c73 , we now allow configuring a number of max simulatenous appointments per resource / user per slot, when…
ISSUE ===== Introduced in odoo/enterprise@bce7e94650c337a9046958a7689c81db5b2a4c73 , we now allow configuring a number of max simulatenous appointments per resource / user per slot, when manage_capacity is False. However, this broke the booking flow when enabling a payment on the appointment type as well, for resources with capacity > 1. More specifically, as soon as the remaining capacity is lower than the resource's own capacity. STEPS TO REPRODUCE ================== 0. Install payment_demo, in order to be able to test the payment issue. Install website_appointment_sale to ease the testing too. 1. Create an appointment type for 'Resources', enable 'Up-front payment'. 2. Set a new resource with capacity = 2 on the appointment type. 3. Make sure manage_capacity is False, and number of simultaneous appointments (max_bookings) is set to 1. 4. Go to the front end and pick any slot. 5. Fill the form and 'proceed to payment' 6. Try to 'pay now' 7. You get a validation error message telling you that the slot is not available anymore. But it is not the case since it is a new type and new resource. FIX === For resources, created booking lines were setting capacity_used to the resource's capacity, unless shared. (meaning: the resource is completely used, even if the reserved quantity is smaller). It made sense before but not for this new feature. It should only use 1 capacity, as we count the number of different simulatenous appointments, and it is unrelated to the resource's own capacity. When creating the meeting at the end of the regular flow, the computed field on capacity_used on appointment.booking.line will set it to 1 when manage_capacity is False. Hence, no issue will happen there in practice as the meeting is always created in that case and capacity_used updated. However, when enabling a payment, we create a calendar.booking instead, with calendar.booking.lines. And based on those, we evaluate availability when checking the cart before going to payment. Those are simply created from values in the controller, and the model is much simpler. Therefore, we fix the issue by manually setting the capacity_used to 1 when creating the booking lines in the front-end booking flow, in the case of an appointment without capacity management. Task-4963012 Forward-Port-Of: odoo/enterprise#91700
Corrects rounding used for Mexican electronic payment documents when invoices and payments use different currencies. This prevents valid payments from being rejected by the tax authority due to tiny exchange-rate precision differences.
Original PR description
Steps to reproduce: - With an MX Company setup - Set USD rate to: - 0.049216958195 for day 1 - 0.053418803419 for day 2 - Create an invoice in USD as follows: - line 1: price_unit 91, quantity 64,…
Steps to reproduce:
- With an MX Company setup
- Set USD rate to:
- 0.049216958195 for day 1
- 0.053418803419 for day 2
- Create an invoice in USD as follows:
- line 1: price_unit 91, quantity 64, tax 16%
- Confirm and send CFDI
- Register full payment in MXN
- Send Payment CFDI
Issue: Payment validation will fail with error
Code : CRP20268
Message : El campo BaseP que corresponde a Traslado, no es igual a la suma de
los importes de las bases registrados en los documentos relacionados donde el
impuesto del documento relacionado sea igual al campo ImpuestoP de este elemento
y la TasaOCuotaDR del documento relacionado sea igual al campo TasaOCuotaP de
este elemento.
Message : Valor esperado: 109025.275956 valor reportado: 109025.275862
This occurs because the precision set in https://github.com/odoo/enterprise/commit/e642e4d6d35c79d02c799d12451f3e2d92ab96e9 is high and can lead to failed
verification due to rounding on our side, because we compute BaseP using
the full digits of EquivalenciaDR, but, according to the specs, we
send it rounded to 10 digits.
opw-4750981
Forward-Port-Of: odoo/enterprise#94465
Forward-Port-Of: odoo/enterprise#92768Invoices no longer overwrite a manually entered currency exchange rate when no invoice date has been set. This prevents Odoo from recalculating invoice lines unexpectedly and helps users keep the values they just entered.
Original PR description
in case the user would enter manually a different rate than the default one, but does not fill the invoice date; odoo was setting today as the invoice date, which was changing the rate and recomputing all the lines... Effectively losing everything the user just encoded. So now, we only recompute the rate and the lines if the user didn't change it. The title of the refresh_invoice_currency_rate button has also been improved to be more explicit on what it does. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed an issue in Point of Sale restaurant orders where combo items could lose their connection to the main combo product after an order was synchronized. This helps staff see and manage combo meals correctly when returning to a table after customer or order updates.
Original PR description
When one of the combo line is marked as "Dirty", it would be synched but it would remove it's link to the combo parent. Steps to reproduce: ------------------- * Create a combo product * Open a PoS restaurant * Open a table, and add the combo product * Leave the table to synchronize the order with the backend * Go back on the table and select a partner * This will mark the combo line as "dirty" * Leave the table again to synchronize the order with the backend * Go back on the table > Observation: The combo now appears as a normal product, not linked to the combo parent. Why the fix: ------------ When marking a line as "dirty", we now make sure to also mark it's combo parent as "dirty" so that it will be synchronized correctly. And keep the link to the combo parent. opw-4950262 Forward-Port-Of: odoo/odoo#225573 Forward-Port-Of: odoo/odoo#220099