Daily updates from Odoo
Navigate
Branch
Tuesday, December 23, 2025
186 changes
31 changes
Enhancements to existing features
This update enhances the way live chat is displayed on the website. The change updates a test to reflect the new live chat name format, improving the user experience and ensuring consistent branding. This is a minor improvement to the Enterprise website.
Original PR description
The community counterpart improves the live chat display name. This commit adapts a test relying on the old name format. task-5408945 community: https://github.com/odoo/odoo/pull/240913
This update clarifies the order list by removing the "to invoice" status badge when an invoice hasn't been created. This prevents users from incorrectly assuming an invoice is required, streamlining the order process and reducing potential confusion. It's a small improvement focused on user experience.
Original PR description
In this commit: - Hide the invoice status badge when the status is "to invoice" in order list. - Prevent confusion by ensuring users don’t assume an invoice needs to be generated. Task-5347495 Forward-Port-Of: odoo/odoo#236882
This update enhances the self-ordering system by displaying the table number directly within the generated QR codes. This makes it much easier for staff to quickly identify which order belongs to which table, improving order accuracy and efficiency.
Original PR description
Before this commit: ====================== It was difficult to identify which table a QR code belonged to when viewing the generated QR code PDFs. After this commit: ====================== The table number is now displayed between the Odoo logo in each table’s QR code, making it easier to recognize and differentiate table QR codes. Task-5217734 Forward-Port-Of: odoo/odoo#233935
Resolved issues and error corrections
This update fixes a security vulnerability where Portal and Internal users could create private knowledge articles even without the necessary permissions. The change restricts article creation to users with 'create' access, improves the user interface by hiding creation buttons for unauthorized users, and adds new tests to ensure proper access control.
Original PR description
How to Reproduce : 1. Remove 'Create' access on the 'Knowledge Article' model for Portal and Internal users. 2. Now log in as a Portal. 3. Try to create a new private article. 4. Log in as an…
How to Reproduce : 1. Remove 'Create' access on the 'Knowledge Article' model for Portal and Internal users. 2. Now log in as a Portal. 3. Try to create a new private article. 4. Log in as an Internal user. 5. Try to create a new private article. Both Internal and Portal users can still create private articles even after 'Create access' is removed. Article creation logic in `knowledge.article` was bypassing the usual access rights because of `sudo` (mainly to add the creator as a member, since creation rights on the member model are not granted). This allowed users to create private articles even without create access. This commit introduces: 1. Model-level access check in `create`. Sudo the creation of articles only when the user has create rights. 2. UI imp to hide the '+' button in the sidebar and the `New` button in the topbar when the user doesn't have create access. 3. New test cases to verify that model-level access rights are respected when creating an article. task-4916280 Forward-Port-Of: odoo/enterprise#102299 Forward-Port-Of: odoo/enterprise#93034
This update fixes a calculation error where refunded Point of Sale orders incorrectly displayed a margin percentage greater than 100%. The change ensures that the margin is accurately calculated, regardless of whether an order is a standard sale or a refund. This ensures accurate financial reporting for refunded transactions.
Original PR description
**Step to reproduce:** - configure pos for global discount from settings - start pos - select product A and add a discount line (product A must have a cost price) - confirm it. - refund the same…
**Step to reproduce:** - configure pos for global discount from settings - start pos - select product A and add a discount line (product A must have a cost price) - confirm it. - refund the same order. - go to backend and open refunded order from `orders` menu **Observation:** - the margin percentage is > 100 **Cause:** - After https://github.com/odoo/odoo/commit/9538698f13d5763b49b00f4c06a1a2afc0d6b39e it has been decided to keep order sign regardless if it is refund or normal order **Fix:** - Adapt `_compute_margin` to include signs based on order is refund or not **Before** <img width="1151" height="228" alt="image" src="https://github.com/user-attachments/assets/2a1760ad-7ad8-4b64-9d22-cf7cff98c90d" /> <img width="1144" height="198" alt="image" src="https://github.com/user-attachments/assets/8d2d4aff-1293-4906-b79b-518ca22317db" /> After <img width="1144" height="253" alt="image" src="https://github.com/user-attachments/assets/ec1d4add-d93b-4490-86ad-f5f5d24de9c2" /> <img width="1170" height="244" alt="image" src="https://github.com/user-attachments/assets/c3ce5b6e-a572-4f85-9bf2-f651574ce124" /> opw-5362912 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238093
This update adjusts how live chat names are displayed to better reflect the context of the conversation. Specifically, internal users now see visitor names, ensuring clarity and a more relevant experience. This change improves the usability of the live chat feature for internal teams.
Original PR description
Live chat display name changes according to who sees the chat: - For visitor, it's the names of the agents. - For agents, it's the names of the visitors. - For everyone else, it's all the member names. However, when an internal user sees the live chat, the agent name doesn't matter. Only the visitor is relevant. This commit changes the way display name is computed to display the agent names to visitors and the visitor names otherwise. task-5408945 enterprise: https://github.com/odoo/enterprise/pull/102681
This update fixes an issue where batch picking lines were incorrectly linked to the wrong picking, leading to inaccurate inventory counts. The fix ensures that each batch transfer is associated with its intended picking, resolving delivery discrepancies and improving order fulfillment accuracy. This impacts users relying on batch transfer functionality.
Original PR description
**Steps to reproduce:** - enable "packages" and "batch transfers" settings - open wharehouse management/operation type - select internal transfer - check "automatic batch" and group by "contact" -…
**Steps to reproduce:** - enable "packages" and "batch transfers" settings - open wharehouse management/operation type - select internal transfer - check "automatic batch" and group by "contact" - create two storable product with an on hand quantity of 10 - create a an internal transfer for the first product for a qty of 10 - mark it as to do - do the same for the second product and make sure that it's the same contact - open barcode and select batches - select the last batch created - scan WH-STOCK - enter and confirm a quantity of 4 for each line - click on put in pack (at this step we can already see that the two new lines created are associated wit the second picking, even though it should be one line per picking) - click on the +6 on each line and click on put in pack - validate **Current behavior:** - a back order has been created for the first picking - the first internal transfer has only delivered 4 units of the first product - the second internal transfer has delivered 10 of the second product and 5 of the first product **Expected behavior:** both pickings should have delivered 10 of their product **Cause of the issue:** The lines created when clicking on "put in pack" for the first time are both associated with the second picking because the line split: https://github.com/odoo/enterprise/blob/898e3e47cfe3b86230da2b146960983d7ad144d0/stock_barcode/static/src/models/barcode_picking_model.js#L514 and the picking_id of the new line is set to the values provided by the `_getNewLineDefaultValues` as the picking_id of the last selected `line`: https://github.com/odoo/enterprise/blob/24b4e49dbe16cb8bd40170abfc089dd64c3f34dd/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L280-L281 rather than from the values of the initial line it is split from. opw-4952964 Forward-Port-Of: odoo/enterprise#102575 Forward-Port-Of: odoo/enterprise#91378
A technical issue preventing users from accessing the Invoicing/Accounting notebook for certain contacts has been resolved. This fix ensures that all required properties are defined for the component, preventing a validation error and allowing the feature to function correctly. This improves the user experience for managing bank accounts within the Accounting module.
Original PR description
Steps to reproduce: - Install the Accounting and Contacts modules - Open a contact that has a value in the Bank Accounts field (e.g., Deco Addict) - Click on the Invoicing / Accounting notebook - A traceback occurs Reason: In this commit https://github.com/odoo/odoo/commit/58e9fbf651473dc39214d7faabdfb06606ce92d0, A new tooltip prop was added but it was not included in the props definition here: https://github.com/odoo/odoo/blob/saas-19.1/addons/account/static/src/components/many2many_tags_banks/many2many_tags_banks.js#L14 Since the `FieldMany2ManyTagsBanks` component calls `super.getTagProps(record)`, all expected props must be defined. The missing tooltip prop causes the validation error and results in the traceback. Fix: Added a tooltip to the static props list of the component. With this change, the issue is resolved. task-5438012
This update resolves an error that occurred when sending invoices with Turkish recipient banks via email. The fix ensures the system correctly identifies the bank's country information, preventing a 'KeyError' and allowing invoices to be successfully generated and sent. This ensures proper compliance for Turkish businesses using the Odoo system.
Original PR description
For the `Türkiye` localization, sending an invoice by email with a recipient bank causes an error. Steps to reproduce: 1) Install `accountant` and `l10n_tr_nilvera_einvoice` modules with demo data.…
For the `Türkiye` localization, sending an invoice by email with a recipient bank causes an error. Steps to reproduce: 1) Install `accountant` and `l10n_tr_nilvera_einvoice` modules with demo data. 2) Switch to TR Company. 3) Create a customer with country set to `Türkiye`. 4) Open the TR company contact and on the Accounting page edit an existing bank account, add a new bank (e.g., 'Test-Bank'), and set `Send Money` to `Trusted`. 5) Create an invoice for the customer, confirm it, and send it by email. ref video: https://drive.google.com/file/d/1OoUzJ-Dr2uuy4yk9P-CKUS0L6OSgeyJ3/view?usp=sharing Error: KeyError: 'country_id' Root Cause: When sending the invoice, the system generates the invoice XML. In the method `_get_address_node` (see [1]), there is a special case to determine the correct country for `res.bank`. However, when `vals['partner']` is a `res.bank` record, no `model` is provided in `vals`, so it defaults to `res.partner`. The code then attempts to access `partner['country_id']`, which does not exist on `res.bank`, raising the error. FIX: Ensure the `model` is set to `res.bank` when `vals['partner']` is a `res.bank` record, ensuring the correct country value is used. [1]- https://github.com/odoo/odoo/blob/0190bb7faca1dd5ce38dfdacbb8fa446f06d59a3/addons/l10n_tr_nilvera_einvoice/models/account_edi_xml_ubl_tr.py#L165-L181 opw-5103598 Forward-Port-Of: odoo/odoo#240715 Forward-Port-Of: odoo/odoo#239218
This update fixes an issue where attempting to refund orders that included archived products would cause a blank page and error. The fix ensures that the system correctly identifies and processes product information, allowing refunds to function properly even after a product has been archived. This improves the reliability of the point-of-sale system.
Original PR description
Step to reproduce: - start pos and finalize a order with product A - go backend - Archive product A - start the pos again - try to refund the order Observation: - Blank page with traceback in console…
Step to reproduce: - start pos and finalize a order with product A - go backend - Archive product A - start the pos again - try to refund the order Observation: - Blank page with traceback in console ``` Caused by: TypeError: Cannot read properties of undefined (reading 'filter') at __exports.getOrderChanges at Proxy.getOrderChanges ``` Cause: - until now `product.template` model is looked for filter after a reload https://github.com/odoo/odoo/blob/1b2500422209ed5feb6d49716f94d58c931bf541/addons/point_of_sale/static/src/app/models/data_service_options.js#L91-L93 https://github.com/odoo/odoo/blob/1b2500422209ed5feb6d49716f94d58c931bf541/addons/point_of_sale/static/src/app/services/data_service.js#L290-L295 and not `product.product`, this makes `product_id` available but `product_tmpl_id` undefined, causing inconsistency Fix: - we add `product.product` in `cleanupModels` for data to in sync with backend opw-5237961 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240424 Forward-Port-Of: odoo/odoo#238514
This update resolves a visual issue where the Sales 3 menu on the website would overflow when certain items were added. The fix prevents the parent menu element from overflowing, ensuring the menu displays correctly and consistently. This improves the user experience for customers navigating the website.
Original PR description
Scenario: - edit the website navbar and set template "Sales - 3" (penultimate) - edit menu to add several menu items that will be larger than possible Result: the menu overflows Cause: a parent element of the menu doesn't overflow, so when computing autoHideMenu where we compute what overflow the list of menu, nothing overflows it since the overflow already happened in the limitless parent element. Fix: using CSS to prevent the parent from overflowing. opw-5178552 __pr note:__ this is happening in 17.0 but I'm targeting 18.0 since the ticket is in 18.0 and code is the same in 18.0 up to master. Forward-Port-Of: odoo/odoo#240433
This update allows businesses with operations in Mexico to customize the sequence used for generating GI CFDI invoices within their branch offices. Previously, the system always prioritized the root company's sequence, which could cause delays. Now, branches can define their own sequence prefix, streamlining invoice processing and improving efficiency for Mexican operations.
Original PR description
Add a way to set a custom prefix for GI sequences on the settings for MX. Get this sequence first on the branch before looking to the one on root company. opw-5096687 Forward-Port-Of: odoo/enterprise#100017
This update resolves an issue where users could encounter an error while viewing details of paid orders within the Point of Sale (PoS) frontend. The fix simply disables a feature that was causing the error, ensuring a smoother user experience. Employee details are intended to be managed from the backend.
Original PR description
Steps to reproduce ------------------ 1. Enable "Log in with Employees" 2. Login with any employee and make an order 3. Switch to the admin, "Mitchell Admin" usually 4. Go to the paid orders (we are still in PoS UI not in the backend), and select the order paid in step 2. 5. Click on "Details", the order form will appear, click on the "Cashier" name A traceback will appear, saying 'Cannot find key "hr_employee_form" in the "views" registry'. The fix ------- We simply disable the employee_id field; it will not try to open the employee form anymore. That is much simpler than adding all the required hr assets to the PoS frontend. Employee details are meant to be seen and navigated from the backend. opw-5252486 Forward-Port-Of: odoo/odoo#240802 Forward-Port-Of: odoo/odoo#240012
This update fixes a bug where product attributes weren't displayed on order lines. The change ensures that all product attribute details are now correctly shown, providing a more complete view of orders for users. This was caused by a change in how attribute data was constructed within the system.
Original PR description
Before this commit: --- - When an order was placed with product attributes, the attribute details were not shown on the order line. After this commit: --- - The product attribute names are now correctly displayed on the order line. Cause: --- - Until saas-18.2, the attribute string was built using the product’s display name and `attribute_line_ids`, which only included never type PTAV entries. - Starting from saas-18.2, the attribute string is constructed solely from `attribute_line_ids`, which now includes all PTAVs. task-5244869 Forward-Port-Of: odoo/enterprise#99007
This update resolves an issue where the automatic link between purchase orders and repair orders was disrupted after a purchase order was confirmed. This prevented seamless integration between the two processes, causing delays in order fulfillment. The fix ensures the smart link remains active, streamlining the workflow and improving efficiency.
Original PR description
The link between purchase order and a repair order break at when the PO is confirmed. ### Steps to reproduce: * Install the Repair and Purchase modules * Activate multi-steps routes * Unarchive the…
The link between purchase order and a repair order break at when the PO is confirmed. ### Steps to reproduce: * Install the Repair and Purchase modules * Activate multi-steps routes * Unarchive the MTO route * Create a product with the MTO route enabled * Create a Repair * On the Repair Order, in part add: - type : ADD - product : mto product * Save the RO * Go to Purchase Order * Confirm the PO -> Issue Smart link between PO and RO broken. ### Observation: The smart link is defined on: RO -> PO: https://github.com/odoo/odoo/blob/a2be8182010613c6f92f59e686a2fbf066cc6b68/addons/purchase_repair/models/repair_order.py#L15-L17 PO -> RO: https://github.com/odoo/odoo/blob/a2be8182010613c6f92f59e686a2fbf066cc6b68/addons/purchase_repair/models/purchase_order.py#L15-L17 When we confirm the PO, from the picking information it will create new moves: https://github.com/odoo/odoo/blob/2c87f3b2b397f268f0e50cb73cd81de992ddd42e/addons/purchase_stock/models/purchase_order.py#L293-L298 To create those stock moves, we go into_create_stock_moves where, for each POL, we will generate their values and erase the smart link: https://github.com/odoo/odoo/blob/a2be8182010613c6f92f59e686a2fbf066cc6b68/addons/purchase_stock/models/purchase_order_line.py#L362-L365 ### Origin: In this commit https://github.com/odoo/odoo/commit/9d98c43581e2579f43b35541b43264866dede5a5: "`created_purchase_line_id` is cleared after confirming the RFQ. This allows to merge more in `_merge_moves`." This breaks the link between PO <-> RO to maybe merge the move in the future. This issue is not present in 19.0 since it was solve in this commit : https://github.com/odoo/odoo/commit/2713876dbc70d3984e584a9037a2206dcda4e84a ### About the fix: The root cause of this issue remains ambiguous despite the analysis. Therefore, in the interest of stability and caution, we opted to implement the fix in a safer location. opw-5121816 Forward-Port-Of: odoo/odoo#237996 Forward-Port-Of: odoo/odoo#232999
This update fixes an issue where invoice due dates were incorrectly calculated when users were in UTC timezones. The change removes a timezone conversion step, ensuring due dates are accurately displayed based on the user's local time. This prevents discrepancies and ensures invoices are presented correctly to customers.
Original PR description
This commit fixes the incorrect due date calculation of invoices. If user timezone is set to any UTC-* timezone, then the due date is calculated as the previous day to the actual due date. This is because the function `deserializeDateTime` was used, which considers the input date as UTC timezone and converts it to system timezone. For example, if the due date is "2025-11-20 00:00:00" and the system timezone is UTC-3, then the calculated due date is "2025-11-19 21:00:00". So when getting the difference from today's date (assuming today is "2025-11-20"), the difference is 1 day (which is not the expected value). This commit replaces the call of `deserializeDateTime` with `deserializeDate`, which removes the system timezone conversion. opw-5160764 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240785 Forward-Port-Of: odoo/odoo#236769
This update corrects an issue where the 'Edit Payment' button was incorrectly visible in certain Odoo localization modules (specifically `l10n_fr_pos_cert` and `l10n_at_pos`). This change ensures compliance with fiscal regulations in these countries, restricting editing order details at the payment stage. Visibility is now controlled based on user roles and company authentication status.
Original PR description
Before this commit: =================== - On the Payment Screen, the `Edit Payment` button was visible in the `l10n_fr_pos_cert` and `l10n_at_pos` localizations. - This was incorrect because fiscal compliance in these countries does not allow altering order details at this stage. - The visibility logic for this button was unintentionally modified in `pos_hr`. After this commit: ================== The visibility of the `Edit Payment` button is now correctly enforced: - `point_of_sale`: visible only until the receipt is printed. - `pos_hr`: visible only when the logged-in user is an admin (except in AT and FR localization). - `l10n_fr_pos_cert`: never visible. - `l10n_at_pos`: visible only when the company is `not FON Authenticated`. Task: 5384822 Related Enterprise PR: https://github.com/odoo/enterprise/pull/101460 Forward-Port-Of: odoo/odoo#238839
This update corrects a previous issue where the 'Edit Payment' button was incorrectly visible in the AT and FR localization versions of Odoo. This change ensures compliance with local fiscal regulations by restricting editing access to payments, only allowing it when the company is not using FON Authentication. This improves data integrity and reduces potential compliance risks.
Original PR description
Before this commit: =================== - On the Payment Screen, the `Edit Payment` button was visible in the `l10n_fr_pos_cert` and `l10n_at_pos` localizations. - This was incorrect because fiscal compliance in these countries does not allow altering order details at this stage. - The visibility logic for this button was unintentionally modified in `pos_hr`. After this commit: ================== The visibility of the `Edit Payment` button is now correctly enforced: - `point_of_sale`: visible only until the receipt is printed. - `pos_hr`: visible only when the logged-in user is an admin (except in AT and FR localization). - `l10n_fr_pos_cert`: never visible. - `l10n_at_pos`: visible only when the company is `not FON Authenticated`. Task: 5384822 Related Community PR: https://github.com/odoo/odoo/pull/238839 Forward-Port-Of: odoo/enterprise#101460
This update resolves an issue where user activity wasn't accurately tracked, causing the system to incorrectly display users as 'away'. By enabling event capturing, the system now reliably detects user clicks and updates their presence status in real-time. This ensures accurate user activity monitoring.
Original PR description
Before this PR, Elements that stopped event propagation (e.g., using event.stopPropagation()) prevented the global click listener from firing. As a result, user activity wasn't detected, and the presence status stayed "away" instead of switching back to "online". This PR fixes the issue by enabling event capturing on the global click listener (useCapture: true). With capture mode, the listener receives the event during the capture phase before any element can stop propagation. Bug:  task-[4892229](https://www.odoo.com/odoo/project/1519/tasks/4892229) Forward-Port-Of: odoo/odoo#238650
This update resolves a test failure that occurred during the build process. The issue stemmed from an incorrect count of analytic lines created for employees, triggered by a specific setup process. This fix ensures accurate accounting calculations for employee work orders.
Original PR description
fixing runbot error https://runbot.odoo.com/odoo/runbot.build.error/234639 on test test_mrp_analytic_account_employee_from_widget introduced by this PR https://github.com/odoo/enterprise/pull/85517
**cause of the error:**
Because there is a resource.calendar.leave without calendar_id,
without resource_id and at a date after today :
during the setupclass, when the employee is created,
_create_future_public_holidays_timesheets() creates an account.analytic.line.
So at the end of the test ,
self.env["account.analytic.line"].search([('employee_id', '=', self.employee1.id)])
returns 2 records instead of 1.
runbot-234639
Forward-Port-Of: odoo/enterprise#102338
Forward-Port-Of: odoo/enterprise#102282This update fixes a misleading error message displayed when deleting sale orders with linked appointments. Previously, users received an incorrect instruction to reduce quantities. Now, the system correctly informs users they must cancel the order before deletion, aligning with expected behavior and improving the user experience.
Original PR description
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed.…
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed. Solution: The order lines should not be manually unlinked from the sale order. It should be the bookings linked to the order lines that should be unlinked before the sale order deletion. Expected Behavior: When deleting a sale order whose lines have bookings, the following error message shoud be displayed: "You can not delete a sent quotation or a confirmed sales order. You must first cancel it." Current Behavior: When deleting a sale order whose lines have bookings, the following error message is displayed: "Once a sales order is confirmed, you can't remove one of its lines (we need to track if something gets invoiced or delivered). Set the quantity to 0 instead." Steps to reproduce on Runbot: 1. Install Appointments and ecommerce 2. For the dental care appointment, edit and enable "Up-front payment" 3. On the website, book an appointment for dental care and proceed to payment 4. Delete the sale order with the booking 5. Observe the incorrect error message being displayed opw-5092349 Forward-Port-Of: odoo/enterprise#100371
This update corrects a minor visual issue with the 'Add to Favorites' thread action in the Odoo interface. The action was incorrectly grouped with settings actions, preventing proper separation. This change ensures the action appears in the correct location for a better user experience.
Original PR description
This was placed with the settings action when this is not a "settings" action. While the overall position is ok for this action, this shouldn't be in the same group as "settings" because this is not a "settings" action. By being in the wrong group, the separator doesn't group the settings actions together as it should. This commit fixes the issue by moving this action to the previous group as the last item, so that this before the separator. Task-5429921 <img width="181" height="281" alt="Screenshot 2025-12-18 at 20 25 38" src="https://github.com/user-attachments/assets/c994a7ec-7902-489f-8e34-5b5aea66738f" /> <img width="185" height="282" alt="Screenshot 2025-12-18 at 20 25 15" src="https://github.com/user-attachments/assets/2b19309c-6cb9-4736-860c-a52401708f3f" />
This update prevents the Clickbot from incorrectly redirecting users to the Discuss app's settings menu. This change improves user experience by ensuring users are directed to the intended application and avoids potential disruptions.
Original PR description
This commit adds the Discuss app's settings menu to the Clickbot's blacklist because it redirects to another application.
This update resolves a technical issue that prevented the PoS system from closing correctly when an order line had a 100% discount. The fix ensures the system handles this scenario without errors, improving stability and reliability for users applying German tax regulations. This change impacts the l10n_de_pos_cert module.
Original PR description
Before this commit, when an order line had a 100% discount, a division by zero error occurred when closing the PoS session. opw-5240429 Forward-Port-Of: odoo/enterprise#98869
This update fixes an issue where limited product loading in Point of Sale (POS) could prevent products from draft orders from being loaded correctly. This ensures that all products, including those in draft orders, are now properly loaded during POS operations, improving the user experience and preventing lost sales. The change was made as part of a standard bug fix process.
Original PR description
Before this commit, when loading products, if limited product loading was enabled, it was possible that products present in draft POS orders were not loaded, leading to issues. opw-5386056 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238656
This update ensures that changes made to Product Designs within the shop editing interface are now consistently saved. Previously, edits weren't saved if the related component was temporarily removed. This fix improves the reliability of product design management, preventing lost changes and ensuring a smoother user experience.
Original PR description
Steps to reproduce: ======= 1. Go to /shop in edit mode. 2. Change the Product Design. 3. Switch to the "Blocks" tab (so the "Style" tab is not visible). 4. Click on "Save". Before this commit:…
Steps to reproduce: ======= 1. Go to /shop in edit mode. 2. Change the Product Design. 3. Switch to the "Blocks" tab (so the "Style" tab is not visible). 4. Click on "Save". Before this commit: ====== The selected Product Design was not saved. After this commit: ====== The Product Design is now always saved correctly, even if the `ProductsDesignPanel` component has been unmounted. Technical reason: ======= The save behavior depended on whether the `ProductsDesignPanel` component was still mounted at the moment of saving. If it was not alive, changes were lost. Solution: ===== We no longer depend on the component being alive. When the Product Design or the Gap is modified, we mark the product list with the `o_dirty_product_design_list` class. On save, we look for elements with this class, retrieve their modified data, and apply the changes. 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#238851
This update resolves an issue where subfolders within the Documents section were not appearing in the search panel when accessed from other applications. Previously, users would see the full folder structure, but the search functionality wouldn't reflect it. This change ensures a consistent and accurate search experience for all document types.
Original PR description
...when coming from another app. Reproduce: 1. Go to a fleet vehicle record and open its 'Documents' stat button. 2. You end up in the Fleet folder, where you see subfolders as kanban cards, but they are not in the search panel. Task-5272030 Forward-Port-Of: odoo/enterprise#99688
This update fixes an issue where downpayment lines in the My E-commerce localization module weren't correctly assigned a standard classification code. Now, all downpayment lines will consistently use code '022', ensuring accurate reporting and compliance. This change improves the reliability of financial data related to downpayments.
Original PR description
Ensure downpayment lines are assigned a fixed classification code ("022"), while other lines retain their product-based classification.
Task-5356913
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#240906
Forward-Port-Of: odoo/odoo#239831This update corrects errors in the l10n_ke_edi_oscu module related to credit note processing for Kenya. Specifically, it now prevents credit notes with mismatched customer PINs and ensures credit notes are not dated before the original invoice, aligning with KRA (Kenya Revenue Authority) regulations.
Original PR description
* Prevent credit note with customer PIN different than the submitted invoice. * Prevent credit note to be dated before the original invoice date. task-5160113 Forward-Port-Of: odoo/enterprise#102475 Forward-Port-Of: odoo/enterprise#100480
This update fixes an issue where employee and manager feedback was reset to default templates when an appraisal was reopened. The fix ensures that previously entered feedback remains intact, streamlining the appraisal process and preventing data loss. The change was triggered by a bug in how the system handled appraisal state transitions.
Original PR description
Steps to reproduce: 1- Create new appraisal 2- Confirm appraisal 3- Edit employee and manager feedbacks 4- Set the final rating for the appraisal 5- Mark appraisal as done 6- Reopen appraisal Issue:…
Steps to reproduce: 1- Create new appraisal 2- Confirm appraisal 3- Edit employee and manager feedbacks 4- Set the final rating for the appraisal 5- Mark appraisal as done 6- Reopen appraisal Issue: The feedbacks of both the employee and manager are reset to the default template. They should be unchanged. Cause: Both the reopen and reset buttons used to call the the same action "action_back" which would set the state of the appraisal to "1_new", there is a compute that is triggered by the change in state which updates the appraisal's department_id which in turn triggers two other computes for the employee and manager feedbacks, those computes have a condition that if the state of the appraisal is '1_new', then the feedbacks should be reset to the templates. Fix: Make each button call its own action and make the reopen action set the state to '2_pending' instead of '1_new'. Furthermore make the reset action also reset the final rating for the appraisal. Task-5411661 Forward-Port-Of: odoo/enterprise#102021
This update resolves an issue where the link popover was incorrectly repositioned within the editor, primarily when creating links. The fix improves the accuracy of the popover's placement by addressing how the editor handles text selections and range calculations. This ensures a smoother and more reliable user experience when creating and editing links.
Original PR description
Two related overlay reposition issues are solved separately out of iframe and in the iframe. **Commit 1:** [FIX] html_editor: avoid wrong range after insert and popover reposition Before this commit:…
Two related overlay reposition issues are solved separately out of iframe and in the iframe. **Commit 1:** [FIX] html_editor: avoid wrong range after insert and popover reposition Before this commit: The link popover is repositioned at the beginning of the text when editing url. When insert, we first delete the non-collapsed selection, then we split the text node by splitTextNode at the collapsed selection. However, splitTextNode resets the text node's value by its substring, which breaks the range of the collapsed selection. This range is stored and used to reposition the overlay when the selection is not in the editable. Reproduction: 1. selection some text, create a link 2. go the the url field and type something 3. the popover is replaced to the beginning of the text. After this commit: we use dom function splitText to split the text only when we need to, e.g. when the currently selection's offset isn't at the beginning or the end of the text node. The dom function keeps the range properly maintained after splitting. However, there is a limitation case from how we create the link on selection, how the browser manages the selection's range and how the overlay reacts to it. The limitation case is when the selection is inside one text node and selecting the whole text node of the range's startContainer (which is the same with endContainer). When the link is created, we do extractContent on the selection's range, put it in the link and insert the link at the collapsed selection. During this process, the browser loses the range's start/end container which leads to invalid start/end container. For this range isn't valid case, it triggers the overlay plugin's special handler which inserts one shadow caret (which is after the inserted link) and uses it to calculate the position. Because the shadow caret is inserted by the cloned collapsed range, we can't really have enough context from the range (about where to re-place the caret) to manipulate the position. **Commit2:** [FIX] html_editor: pass selection data to overlay to avoid reposition in iframe Before this commit: the overlay plugin uses the editable's document's selection to check if the current selection is in the editable. It works when there's no iframe, as the overlays are part of the document. However in an iframe's editable zone, e.g. the website editing zone, the overlays are not under the iframe document but under the outer window's document. When checking iframe document's selection, it cannot detect the selection in the overlay, which gives a wrong "inEditable" value. After this commit: we pass the getSelectionData to the overlay so it can use the existing currentSelectionIsInEditable task-5184799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240796 Forward-Port-Of: odoo/odoo#237759
12 changes
Enhancements to existing features
This update enhances the self-ordering system by displaying the table number directly within the generated QR codes. This makes it easier for staff to quickly identify which order corresponds to which table, improving order accuracy and efficiency.
Original PR description
Before this commit: ====================== It was difficult to identify which table a QR code belonged to when viewing the generated QR code PDFs. After this commit: ====================== The table number is now displayed between the Odoo logo in each table’s QR code, making it easier to recognize and differentiate table QR codes. Task-5217734 Forward-Port-Of: odoo/odoo#233935
Resolved issues and error corrections
This update resolves an error that occurred when users attempted to send customer statements. The fix ensures the system correctly handles scenarios where a custom email template isn't used, defaulting to the current user's email address to prevent a technical error.
Original PR description
Currently, an error occurs when a user sends a customer statement. **Steps to Reproduce ([Video](https://drive.google.com/file/d/1soOylzCVnNCNsWUBizeBQ9vfFlI5pzSP/view)):** - Install the…
Currently, an error occurs when a user sends a customer statement. **Steps to Reproduce ([Video](https://drive.google.com/file/d/1soOylzCVnNCNsWUBizeBQ9vfFlI5pzSP/view)):** - Install the `account_reports` module. - Go to `Invoicing` > `Customers` > `Customers`. - Switch to `List view`, select `a customer`, then click on `Actions` > `Open Customer Statements`. - Click `Send`, remove the `Email Template`, add a `subject`, and then click `Print & Send`. **Error:** `ValueError: Expected singleton: mail.template()` After [this commit], which checks whether the template has an email_from, when a user sends the customer statement and removes the email template, it still tries to access the template to fetch email_from for a particular customer [1]. If no email template is used, this results in an error [2] when going to extract the email_from. This commit ensures that email_from is taken from the email template if one is used; otherwise, it uses the current user's email address [3], which matches the default behavior. [this commit]: https://github.com/odoo/enterprise/commit/22c46e4f63e7b2dc0eee16fc807656cd4de21fb7 [1]- https://github.com/odoo/enterprise/blob/dc4d5633407ccc728d30de5ce2072a80c16b2766/account_reports/wizard/account_report_send.py#L246 [2]: https://github.com/odoo/odoo/blob/0dabb221225fba96c0e55779afadd9f12b369777/addons/mail/models/mail_render_mixin.py#L691-L693 [3]: https://github.com/odoo/odoo/blob/0dabb221225fba96c0e55779afadd9f12b369777/addons/mail/models/mail_thread.py#L2891-L2892 sentry-7106576491 Forward-Port-Of: odoo/enterprise#102532 Forward-Port-Of: odoo/enterprise#102219
This update resolves a visual issue where the Sales 3 menu on the website would overflow when certain items were added. The fix prevents the parent element from overflowing, ensuring the menu displays correctly and consistently. This improves the user experience for customers navigating the website.
Original PR description
Scenario: - edit the website navbar and set template "Sales - 3" (penultimate) - edit menu to add several menu items that will be larger than possible Result: the menu overflows Cause: a parent element of the menu doesn't overflow, so when computing autoHideMenu where we compute what overflow the list of menu, nothing overflows it since the overflow already happened in the limitless parent element. Fix: using CSS to prevent the parent from overflowing. opw-5178552 __pr note:__ this is happening in 17.0 but I'm targeting 18.0 since the ticket is in 18.0 and code is the same in 18.0 up to master. Forward-Port-Of: odoo/odoo#240433
This update allows businesses using the Mexican tax reporting (MX) module to define a custom sequence prefix for GI CFDI invoices issued from branch offices. Previously, the system always used the root company's sequence, which is now configurable to ensure correct invoice numbering and compliance with Mexican tax regulations. This change improves accuracy and simplifies reporting for businesses operating with multiple branches.
Original PR description
Add a way to set a custom prefix for GI sequences on the settings for MX. Get this sequence first on the branch before looking to the one on root company. opw-5096687 Forward-Port-Of: odoo/enterprise#100017
This update resolves an issue where archived subtasks remained visible in the Kanban view, even with the 'Show Sub-Tasks' option disabled. The fix removes a previous setting that forced subtasks to be visible after archiving, aligning the system with the current 'Show/Hide Subtasks' toggle functionality. This ensures a cleaner and more intuitive user experience.
Original PR description
Steps to reproduce: - Install the Project app. - Create a task and a subtask under it. - Archive the subtask, then unarchive it. - Untoggle the Show Sub-Tasks Issue: Subtask remains visible in Kanban even when Show Sub-Tasks is untoggled. Cause: When a subtask is archived, the PR https://github.com/odoo/odoo/pull/148342 forces `display_in_project' to True Fix: Remove the logic that sets display_in_project to True on archived subtasks, since their visibility is now managed by the Show/Hide Subtasks toggle. task-5075134
This update fixes an issue where product attributes weren't displayed on order lines. The change ensures that all product attribute names are now correctly shown, providing a clearer view of order details for users. This improvement was made by updating how attribute information is constructed.
Original PR description
Before this commit: --- - When an order was placed with product attributes, the attribute details were not shown on the order line. After this commit: --- - The product attribute names are now correctly displayed on the order line. Cause: --- - Until saas-18.2, the attribute string was built using the product’s display name and `attribute_line_ids`, which only included never type PTAV entries. - Starting from saas-18.2, the attribute string is constructed solely from `attribute_line_ids`, which now includes all PTAVs. task-5244869 Forward-Port-Of: odoo/enterprise#99007
This update resolves a bug where the cursor jumps to the end of the input after using the backspace button on the VoIP softphone's keypad on mobile devices. The issue stemmed from an interaction between the keypad's input handling and a zoom prevention feature. The fix ensures the cursor updates correctly after backspace actions, improving the user experience.
Original PR description
Steps to reproduce: - Open the VoIP softphone on a mobile device - Enter a number - Place the cursor in the middle of the number - Tap on the *odoo* backspace button => The character before the…
Steps to reproduce:
- Open the VoIP softphone on a mobile device
- Enter a number
- Place the cursor in the middle of the number
- Tap on the *odoo* backspace button
=> The character before the cursor is removed but then the cursor jumps
to the end of the input.
Note: this also happens when trying to add a number in the middle of
the typed number, using the softphone buttons, but this message focuses
the explanation on the backspace button.
Commit [1] introduced the bug while revamping VoIP and its keypad.
Before that commit, there was a simple `t-on-click` defined on that
backspace button. After the update, that `t-on-click` is still there but
alongside a weird `t-on-touchend.prevent="(ev) => ev.target.click()"`,
which is actually there to prevent zoom-in behavior on double-tap,
although, retesting it does not seem necessary (at least on Android).
In any case, this is the original cause of the bug.
Since [2], the keypad input is using the mail's `useSelection` hook,
which, among other things, manages what happens on click outside of the
input. Before [1], this happened when clicking on the backspace button:
1. The click is handled during its *capture* phase by the `useSelection`
hook. It checks if clicked location should be considered, the answer
is yes.
2. The next part of the handler is done in the next microtask (as the
check is done asynchronously (?? that looks like a bad idea, but
that's another issue)).
3. That "in the next microtask" part occurs before the event starts
bubbling: the capture handler saves the cursor position as being at
the end of the input (?? not sure why, but that's another issue).
4. The click is handled during its *bubbling* phase by the backspace
button's `t-on-click`, which removes the character before the cursor,
and sets the cursor position accordingly for the `useSelection` hook.
The actual cursor position is untouched since [3] on mobile "because
otherwise it would open the mobile keyboard", but there are other
ways that would have prevented that I think... to confirm later for
master via task-5366961 (this actually causes issues in HOOT tests
but that's another issue).
5. The dialer/numpad component handles the input's focus/cursor. For
that, it forces a focus and ask the `useSelection` hook to "restore
the selection", which "restores" it to what step (4) asked.
After [1], this changed to:
1'. Same as step (1)
2'. Same as step (2)
3'. As the click was simulated instead of being the "natural" one
triggered by the browser touchend handling, the `t-on-click` handler
is called now, before the "in the next microtask" part of the
capture handler is done. That means what step (4) did happens now.
4'. Now what step (3) did happens now.
5'. Same as step (5)... but since step (3) and (4) were basically
swapped, the cursor is now restored as the way it was last saved:
at the end of the input (again don't know why step the
`useSelection` hook would want to save it like that though).
There are multiple solutions to fix this:
A. Remove the `t-on-touchend` handler, letting the browser do what it
naturally does. Although, it might be needed to prevent the mentioned
zoom behaviors on some phones?
B. Review why the `useSelection` hook wants to save the cursor at the
end of the input on external click, the point is valid but I am not
sure that should be this hook's job to enforce it.
C. Review why the `useSelection` hook wants to check if the click has to
be considered asynchronously, there should be a better way.
D. Configure the `useSelection` hook to consider a click on the
backspace button as to be ignored, as handled manually by its own
handlers anyway.
Option (A) should probably be done, by confirming zoom behaviors can be
prevented another way, but it cannot be done in stable anyway. The (B)
and (C) options should be investigated but would also not be stable to
change; also that would modify an exposed hook's behavior so more risky.
Option (D) can probably be done either way and is targeted on fixing the
bug described only, so this is the solution this commit went for.
In master, option (A) will be investigated in the forward-ported version
of this fix.
However... the bug was actually solved 3 months after [1], at [4] thanks
to secret option (E): not removing the `t-on-touchend` but changing it
entirely to call the same handler as the `t-on-click` one. A bit more
stable than option (A) but still not stable.
However... that solution (E) was broken 1 month later, again, by commit
[5] which destroyed step (5) while fixing an unrelated bug. Without that
step, the input cursor is not repositioned after OWL changes the value,
and by default OWL places it back at the end.
The solution is to restore step (5): the problem was that we were
checking if the user was not typing in another input before re-focusing
the keypad input... but the code considered the keypad input itself as
"another input". This commit still adds solution (D) on top of fixing
that, for good measures.
Note that in 19.0+, there is at least another cursor-related bugs,
related to commit [6]. It will be fixed in the forward-port of this one
as they need each other's fix to both work. Really there should be
better ways to handle that cursor position in OWL... might be done in a
future refactoring.
This commit adds a test to hopefully keep the bug fixed, as inspired by
commit [7].
[1]: https://github.com/odoo/enterprise/commit/52b3065993c41c6b7c65dda586a66fdd865b3afd
[2]: https://github.com/odoo/enterprise/commit/2e8f18801156a8069e26fb3d61d4f8d84893e891
[3]: https://github.com/odoo/odoo/commit/adc5448adf863b99b9b2be29985e560f5c12dbd4
[4]: https://github.com/odoo/enterprise/commit/668467678312632b5b9ecf234280690151bf3078
[5]: https://github.com/odoo/enterprise/commit/db82135fd73d5077fc26be7206105192a845c2bc
[6]: https://github.com/odoo/enterprise/commit/a06c02e8e163ed052c1c4d25a56bea9b6409abde
[7]: https://github.com/odoo/enterprise/commit/613ef7332b0d21e947871e9d33b68d069f1412c2
Related to task-5366961
Forward-Port-Of: odoo/enterprise#101856This update corrects a bug where invoice due dates were incorrectly calculated when users had their timezones set to UTC. The change removes a timezone conversion step, ensuring due dates are calculated accurately based on the user's local time. This prevents invoices from appearing due prematurely or incorrectly.
Original PR description
This commit fixes the incorrect due date calculation of invoices. If user timezone is set to any UTC-* timezone, then the due date is calculated as the previous day to the actual due date. This is because the function `deserializeDateTime` was used, which considers the input date as UTC timezone and converts it to system timezone. For example, if the due date is "2025-11-20 00:00:00" and the system timezone is UTC-3, then the calculated due date is "2025-11-19 21:00:00". So when getting the difference from today's date (assuming today is "2025-11-20"), the difference is 1 day (which is not the expected value). This commit replaces the call of `deserializeDateTime` with `deserializeDate`, which removes the system timezone conversion. opw-5160764 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240785 Forward-Port-Of: odoo/odoo#236769
A recent test failure in the MRP work order module has been resolved. The issue stemmed from a miscount of analytic lines created during employee setup, triggered by a calendar entry with incorrect date settings. This fix ensures accurate accounting calculations for work orders.
Original PR description
fixing runbot error https://runbot.odoo.com/odoo/runbot.build.error/234639 on test test_mrp_analytic_account_employee_from_widget introduced by this PR https://github.com/odoo/enterprise/pull/85517
**cause of the error:**
Because there is a resource.calendar.leave without calendar_id,
without resource_id and at a date after today :
during the setupclass, when the employee is created,
_create_future_public_holidays_timesheets() creates an account.analytic.line.
So at the end of the test ,
self.env["account.analytic.line"].search([('employee_id', '=', self.employee1.id)])
returns 2 records instead of 1.
runbot-234639
Forward-Port-Of: odoo/enterprise#102338
Forward-Port-Of: odoo/enterprise#102282This update fixes a misleading error message displayed when deleting sale orders with associated appointments. Previously, users received an incorrect instruction to reduce order quantities. Now, the system correctly informs users that they must cancel the order before deletion, aligning with expected behavior and improving the user experience.
Original PR description
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed.…
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed. Solution: The order lines should not be manually unlinked from the sale order. It should be the bookings linked to the order lines that should be unlinked before the sale order deletion. Expected Behavior: When deleting a sale order whose lines have bookings, the following error message shoud be displayed: "You can not delete a sent quotation or a confirmed sales order. You must first cancel it." Current Behavior: When deleting a sale order whose lines have bookings, the following error message is displayed: "Once a sales order is confirmed, you can't remove one of its lines (we need to track if something gets invoiced or delivered). Set the quantity to 0 instead." Steps to reproduce on Runbot: 1. Install Appointments and ecommerce 2. For the dental care appointment, edit and enable "Up-front payment" 3. On the website, book an appointment for dental care and proceed to payment 4. Delete the sale order with the booking 5. Observe the incorrect error message being displayed opw-5092349 Forward-Port-Of: odoo/enterprise#100371
This update prevents guest users from seeing the unpin button in the message panel, resolving a confusing user experience. Previously, guests could interact with a button that didn't work, leading to frustration. Now, the UI accurately reflects guest user permissions, ensuring a smoother and more intuitive experience.
Original PR description
**Description of the issue/feature this PR addresses:** ---------------------------------------------- Currently, guest users in PinnedMessagesPanel can see the unpin button on pinned messages, but…
**Description of the issue/feature this PR addresses:** ---------------------------------------------- Currently, guest users in PinnedMessagesPanel can see the unpin button on pinned messages, but the server correctly rejects their unpin requests. This creates confusion and a poor user experience where external users see functionality that doesn't work for them. **Current behavior before PR:** ---------------------------------------------- - Guest users see the unpin button on pinned messages - Clicking the unpin button results in server rejection - UI shows functionality that guest users cannot actually use **Desired behavior after PR is merged:** ---------------------------------------------- - Guest users cannot see the unpin button on pinned messages - Internal users continue to have full pin/unpin functionality - UI accurately reflects user permissions and capabilities - Better user experience with appropriate access control Task-5033295 ---------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at https://www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240763 Forward-Port-Of: odoo/odoo#229211
This update resolves issues preventing incorrect credit notes from being processed for Kenyan tax purposes. Specifically, the system now validates that credit notes match the original invoice's customer PIN and that the credit note date is not before the invoice date, ensuring compliance with KRA regulations. This improves the accuracy and reliability of credit note processing.
Original PR description
* Prevent credit note with customer PIN different than the submitted invoice. * Prevent credit note to be dated before the original invoice date. task-5160113 Forward-Port-Of: odoo/enterprise#102475 Forward-Port-Of: odoo/enterprise#100480
13 changes
Resolved issues and error corrections
This update fixes an issue where manually adjusted prices on customer invoices were being reset when the invoice's fiscal position was changed. The fix ensures that prices remain as the user intended, mirroring the behavior of Sale Orders. This improves accuracy and reduces manual intervention for users.
Original PR description
**Steps to reproduce:** * Install the **Accounting** module. * Create a customer invoice with at least one product line. * Manually adjust the **price_unit** on the invoice line. * Change the fiscal position on the invoice. * Click the **Update Taxes and Accounts** button. **Observed behavior:** * The manually adjusted price is reset to the product’s default sales price (e.g., 1000). * This occurs even though neither the product nor the UoM changed. * In contrast, **Sale Orders correctly preserve** manually edited prices in the same situation. **Cause:** * `action_update_fpos_values` method call the recomputation of unit price each time when we click update taxes and accounts button on invoice. **Fix:** * Add a condition to **skip price recomputation** when fiscal position changes. * This preserves manual prices when only the fiscal position changes. opw-5252832 Forward-Port-Of: odoo/odoo#240813 Forward-Port-Of: odoo/odoo#237914
This update resolves a visual issue where the Sales 3 menu on the website would overflow when certain menu items were added. The fix prevents the parent element from overflowing, ensuring the menu displays correctly regardless of the number of items. This improves the user experience for customers navigating the website.
Original PR description
Scenario: - edit the website navbar and set template "Sales - 3" (penultimate) - edit menu to add several menu items that will be larger than possible Result: the menu overflows Cause: a parent element of the menu doesn't overflow, so when computing autoHideMenu where we compute what overflow the list of menu, nothing overflows it since the overflow already happened in the limitless parent element. Fix: using CSS to prevent the parent from overflowing. opw-5178552 __pr note:__ this is happening in 17.0 but I'm targeting 18.0 since the ticket is in 18.0 and code is the same in 18.0 up to master. Forward-Port-Of: odoo/odoo#240433
This update allows businesses using the Mexican tax reporting (MX) module to define a custom sequence prefix for GI CFDI invoices issued on branch offices. Previously, the system always used the root company's sequence, which is now configurable to ensure accurate tax reporting for branch operations. This change improves compliance and reduces potential errors related to invoice numbering.
Original PR description
Add a way to set a custom prefix for GI sequences on the settings for MX. Get this sequence first on the branch before looking to the one on root company. opw-5096687 Forward-Port-Of: odoo/enterprise#100017
This update fixes an issue where product attributes weren't displayed on order lines. The change ensures that all product attribute names are now correctly shown, providing a more complete view of the order for users. This improvement was made by updating how product attribute strings are constructed.
Original PR description
Before this commit: --- - When an order was placed with product attributes, the attribute details were not shown on the order line. After this commit: --- - The product attribute names are now correctly displayed on the order line. Cause: --- - Until saas-18.2, the attribute string was built using the product’s display name and `attribute_line_ids`, which only included never type PTAV entries. - Starting from saas-18.2, the attribute string is constructed solely from `attribute_line_ids`, which now includes all PTAVs. task-5244869 Forward-Port-Of: odoo/enterprise#99007
This update fixes an issue where invoice due dates were incorrectly calculated when users had their timezones set to UTC. The change removes a timezone conversion step, ensuring due dates are accurately displayed based on the user's local time. This prevents discrepancies and ensures invoices are presented with the correct payment deadlines.
Original PR description
This commit fixes the incorrect due date calculation of invoices. If user timezone is set to any UTC-* timezone, then the due date is calculated as the previous day to the actual due date. This is because the function `deserializeDateTime` was used, which considers the input date as UTC timezone and converts it to system timezone. For example, if the due date is "2025-11-20 00:00:00" and the system timezone is UTC-3, then the calculated due date is "2025-11-19 21:00:00". So when getting the difference from today's date (assuming today is "2025-11-20"), the difference is 1 day (which is not the expected value). This commit replaces the call of `deserializeDateTime` with `deserializeDate`, which removes the system timezone conversion. opw-5160764 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240785 Forward-Port-Of: odoo/odoo#236769
This update fixes an issue where mobile users were seeing both purchase and sales tax options when creating invoices. The fix copies the tax domain settings from the desktop version, ensuring mobile users see the appropriate tax types based on the invoice type. This improves the user experience and accuracy of invoice creation on mobile devices.
Original PR description
Steps to reproduce ================== - Use a mobile viewport - Create an new invoice - Add an invoice line - Click on the Taxes field => Both purchase and sales taxes are available Solution ======== Copy the domain from the desktop list view https://github.com/odoo/odoo/blob/fcc677e900c2fccb9fa0bd88ef01c559cadfa08a/addons/account/views/account_move_views.xml#L1051-L1055 We also add the corresponding context and options opw-5124536 Forward-Port-Of: odoo/odoo#239505 Forward-Port-Of: odoo/odoo#237724
This update resolves a test failure within the Odoo Enterprise system. The issue stemmed from an incorrect count of employee analytic accounts during a test run, caused by a scheduling error. This fix ensures accurate account creation and prevents future test failures.
Original PR description
fixing runbot error https://runbot.odoo.com/odoo/runbot.build.error/234639 on test test_mrp_analytic_account_employee_from_widget introduced by this PR https://github.com/odoo/enterprise/pull/85517
**cause of the error:**
Because there is a resource.calendar.leave without calendar_id,
without resource_id and at a date after today :
during the setupclass, when the employee is created,
_create_future_public_holidays_timesheets() creates an account.analytic.line.
So at the end of the test ,
self.env["account.analytic.line"].search([('employee_id', '=', self.employee1.id)])
returns 2 records instead of 1.
runbot-234639
Forward-Port-Of: odoo/enterprise#102338
Forward-Port-Of: odoo/enterprise#102282This update resolves a bug where the 'convert to task' option repeatedly appeared for converted Todo items. The fix hides this option when a project is assigned, streamlining the task conversion process and preventing user confusion. This improves the overall user experience and efficiency.
Original PR description
Steps to reproduce: - Create a Todo and convert into task using cog Menu option. - Todo is converted to task and is displayed. - Through breadcrumb go back to Todo - Try to convert it again Issue: - The converted todo is again converted (change of project etc) Fix: - Hiding the convert cog menu when a project is set. task-5075327 Forward-Port-Of: odoo/odoo#240750 Forward-Port-Of: odoo/odoo#230031
This update fixes a misleading error message displayed when deleting sale orders with associated appointments. Previously, users received an incorrect instruction to reduce order quantities. Now, the system correctly informs users they must cancel the order before deletion, aligning with expected behavior and improving the user experience.
Original PR description
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed.…
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed. Solution: The order lines should not be manually unlinked from the sale order. It should be the bookings linked to the order lines that should be unlinked before the sale order deletion. Expected Behavior: When deleting a sale order whose lines have bookings, the following error message shoud be displayed: "You can not delete a sent quotation or a confirmed sales order. You must first cancel it." Current Behavior: When deleting a sale order whose lines have bookings, the following error message is displayed: "Once a sales order is confirmed, you can't remove one of its lines (we need to track if something gets invoiced or delivered). Set the quantity to 0 instead." Steps to reproduce on Runbot: 1. Install Appointments and ecommerce 2. For the dental care appointment, edit and enable "Up-front payment" 3. On the website, book an appointment for dental care and proceed to payment 4. Delete the sale order with the booking 5. Observe the incorrect error message being displayed opw-5092349 Forward-Port-Of: odoo/enterprise#100371
This update fixes a minor inconvenience for users. Previously, clicking 'Jump to Present' would cause the composer to lose focus, requiring manual adjustment. Now, the composer automatically regains focus on desktop after this action, improving the user experience.
Original PR description
**Current behavior before PR:** clicking "Jump to Present" caused the composer to lose focus, forcing users to manually focus the input before typing. **Desired behavior after PR is merged:** The composer automatically regains focus on desktop after clicking "Jump to Present". task-[5035977](https://www.odoo.com/odoo/project/1519/tasks/5035977) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240743 Forward-Port-Of: odoo/odoo#227781
This update fixes a visual inconsistency in the Point of Sale (POS) interface. Previously, product images were always displayed in combo product configurations, regardless of the overall image visibility setting. Now, combo products correctly respect the configured image settings, ensuring a consistent and professional user experience.
Original PR description
Before this commit: ==================== In POS, when product images were configured to be hidden, the setting was correctly applied to normal products. However, in the combo product configurator, product images were still displayed, causing inconsistency with the configured behavior. After this commit: ====================== The combo product configurator now respects the product image visibility configuration, ensuring consistent behavior across all product types in the POS interface. Task-5163955 Forward-Port-Of: odoo/odoo#231366
This update resolves critical issues preventing incorrect credit note submissions to the Kenya Revenue Authority (KRA). Specifically, the system now validates that credit notes match the original invoice's customer PIN and that the credit note date is not before the invoice date, ensuring accurate tax reporting.
Original PR description
* Prevent credit note with customer PIN different than the submitted invoice. * Prevent credit note to be dated before the original invoice date. task-5160113 Forward-Port-Of: odoo/enterprise#102475 Forward-Port-Of: odoo/enterprise#100480
This update resolves a validation error that occurred when starting work orders with flexible resources, particularly when the time was set to a late part of the day. The fix ensures that attendance intervals are correctly aligned, preventing the 'start date' from being after the 'end date' and improving the accuracy of time tracking for flexible workers.
Original PR description
**Steps to reproduce** On a local DB, with demo data: - Change your machine's time to a late part of the day (e.g. 6pm) - Install `mrp_workorder` - Set the "Standard 40 hours/week" (used by a…
**Steps to reproduce** On a local DB, with demo data: - Change your machine's time to a late part of the day (e.g. 6pm) - Install `mrp_workorder` - Set the "Standard 40 hours/week" (used by a workcenter) as flexible. - From the Shop Floor, start the "WH/MO/00003 - Manual Assembly" workorder. "Validation Error: The start date of the time off must be earlier than the end date." **Cause** `_calculate_date_finished` in mrp is calling `plan_hours` and under certain conditions with a flexible resource, it is possible for `plan_hours` to return a datetime before the `day_dt` parameter. This happens because for flexible resources, `_attendance_intervals_batch` can return attendance intervals with start or end datetimes outside of the start_dt -> end_dt window. For example, a flexible calendar with 8h/day will return the 8:00->16:00 interval, even if start_dt is later than 8:00. **Change** Don't return attendance intervals outside of the [start_dt, end_dt] interval by shifting them if necessary. opw-5123230 Forward-Port-Of: odoo/odoo#233169
2 changes
Resolved issues and error corrections
This update allows businesses using the Mexican tax (CFDI) module to define a unique sequence prefix for their branch invoices. Previously, the system relied on a standard sequence, which is now configurable, ensuring accurate tax reporting and compliance for branch operations in Mexico. This change addresses a specific requirement for branch-level reporting.
Original PR description
Add a way to set a custom prefix for GI sequences on the settings for MX. Get this sequence first on the branch before looking to the one on root company. opw-5096687 Forward-Port-Of: odoo/enterprise#100017
This update fixes a misleading error message displayed when deleting sale orders with associated bookings. Previously, users received an incorrect instruction to reduce order quantities. Now, the system correctly informs users that they must cancel the order before deletion, aligning with expected business processes. This ensures a smoother user experience and prevents confusion.
Original PR description
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed.…
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed. Solution: The order lines should not be manually unlinked from the sale order. It should be the bookings linked to the order lines that should be unlinked before the sale order deletion. Expected Behavior: When deleting a sale order whose lines have bookings, the following error message shoud be displayed: "You can not delete a sent quotation or a confirmed sales order. You must first cancel it." Current Behavior: When deleting a sale order whose lines have bookings, the following error message is displayed: "Once a sales order is confirmed, you can't remove one of its lines (we need to track if something gets invoiced or delivered). Set the quantity to 0 instead." Steps to reproduce on Runbot: 1. Install Appointments and ecommerce 2. For the dental care appointment, edit and enable "Up-front payment" 3. On the website, book an appointment for dental care and proceed to payment 4. Delete the sale order with the booking 5. Observe the incorrect error message being displayed opw-5092349 Forward-Port-Of: odoo/enterprise#100371
18 changes
Enhancements to existing features
This update significantly speeds up the generation of account reports by optimizing data processing and reducing unnecessary calculations. The changes improve performance, particularly when handling large datasets, leading to quicker report generation times. This enhancement impacts the efficiency of key financial reporting features.
Original PR description
Following https://github.com/odoo/enterprise/pull/96974, we are doing the filtering of rows much later which shows a lot more areas to improve. First 2 optimizations can be done for *every* report:…
Following https://github.com/odoo/enterprise/pull/96974, we are doing the filtering of rows much later which shows a lot more areas to improve. First 2 optimizations can be done for *every* report: <img width="1920" height="296" alt="image" src="https://github.com/user-attachments/assets/6d7e57ce-8b57-4f1c-9ab7-6212495993d3" /> The (1) optimization is to remove the second safe_eval I forgot to remove before :sweat: The (2) optimization consist to hash less keys as well as to not iterate over all the lines in _build_lines_columns Another 2 smaller optimizations are possible on the general ledger: <img width="1919" height="362" alt="image" src="https://github.com/user-attachments/assets/61d012ee-1014-4d95-82f7-22b0d9c06500" /> <img width="1919" height="426" alt="image" src="https://github.com/user-attachments/assets/eb7e756c-6d3e-4d6b-a445-e0a28aca553c" /> The (3) is outdated The (4) is `self.env.company.currency_id.id` being accessed <img width="1919" height="384" alt="image" src="https://github.com/user-attachments/assets/7b945f64-88ac-4ca5-8552-50bdfe17e849" /> (1) is down from 55.42s to 489ms (2) is down from ~26s to ~0.55s (4) is down from ~4.14s to ~1.9s *Tests were done on a demo db populated on models res.partner,account.move with a factor of 20000 and opening the Tax Received line of the general ledger which contained about 150,000 lines and a limit_to_load at the default 80* Forward-Port-Of: odoo/enterprise#102519
This update allows chart titles to automatically update based on data from other cells within the spreadsheet. Previously, chart titles were static. Now, they will reflect the most current values, improving reporting accuracy and providing more real-time insights.
Original PR description
This commit enables the use of cell references and formulas for chart titles, allowing titles to dynamically update based on cell values. Task: 3693157
This update simplifies the VoIP error experience by redesigning the error screen to align with Odoo's standard style and separating user-friendly messages from technical details. The new system allows for more targeted error communication and avoids confusing users with complex technical information, improving overall usability.
Original PR description
The VoIP app contains a lot of technical terms and concepts that we should avoid showing to the user. This PR (among other things) redesigns the error screen to better match the style of other Odoo error messages and tries to review and divide all error messages to separate user-friendly messages from technical ones. With that in mind, triggering an error now comes with 3 optional values: - `message`: for the user friendly message (if empty, it defaults to "Please ask your administrator.", and you still get the "oops something went wrong" part). - `technical` + `technicalExtra`: for the technical part of the message, shown in a "technical section". `technical` being shown on its own line in bold, followed by `technicalExtra`, on its own line. task-5117561
This update enhances the user experience when viewing Odoo reports by allowing formulas to break across multiple lines. Previously, long formulas made reports difficult to read. This change improves clarity and usability for report viewers.
Original PR description
Formula of reports could be so long thus the user experience when reading it could be unpleasent. This change allows the formulas on the views to appear on multi-line. task: 5208320
This update enhances the way live chat is displayed on the website. The community team adjusted the live chat name format to improve clarity and consistency. This change ensures a better user experience for customers engaging with live support.
Original PR description
The community counterpart improves the live chat display name. This commit adapts a test relying on the old name format. task-5408945 community: https://github.com/odoo/odoo/pull/240913 Forward-Port-Of: odoo/enterprise#102681
Resolved issues and error corrections
This update resolves a bug that caused PoS sessions to fail when an order line had a 100% discount. The fix prevents a division-by-zero error, ensuring smooth order processing and avoiding potential disruptions for users applying discounts.
Original PR description
Before this commit, when an order line had a 100% discount, a division by zero error occurred when closing the PoS session. opw-5240429 Forward-Port-Of: odoo/enterprise#98869
This update significantly speeds up spreadsheet loading times by optimizing how the system determines the latest version. Previously, the system relied on a slow snapshot process, but now it efficiently checks all revisions, reducing server load and improving user experience. This change impacts the performance of our spreadsheet functionality.
Original PR description
Commit 8f3e242e197b2f26982749 added an Etag to reduce the load on the network when loading a spreadsheet. Now, this commit ensures the Etag is computed as fast as possible to also reduce the load on…
Commit 8f3e242e197b2f26982749 added an Etag to reduce the load on the network when loading a spreadsheet. Now, this commit ensures the Etag is computed as fast as possible to also reduce the load on the server. The Etag is based on the latest revision (field `current_revision_uuid`). When computing `current_revision_uuid`, we look at the lastest revisions. However, the current code only look at *active* revisions, and fallback on the snapshot. The snapshot is a json file (potentially large) that needs be parsed. This is not fast. To make it worse: spreadsheets are snapshotted as often as it can be, which means we almost always fall in the slow path when computing the Etag. With this commit, we consider all revisions (active or not). We also load in memory only the latest instead of fetching multiple revisions for each spreadsheet (the work is done by postgres through `_read_group`) On a spreadsheet with a snapshot of 9.8MB, server time `"GET /spreadsheet/data/documents.document/17 HTTP/1.1" 304` before: ~310ms after: ~5ms Task-5431940 Forward-Port-Of: odoo/enterprise#102556
This update fixes an issue where sharing archived spreadsheets caused errors. It now correctly identifies and hides the 'Share' button and related options when a spreadsheet is in the Trash, ensuring a smoother user experience. This prevents confusion and improves data management.
Original PR description
## Description This PR fixes a traceback when sharing a spreadsheet that is in Trash. It exposes `is_archived` in the spreadsheet metadata and adds an `env.isArchived()` getter on the environment. It hides the topbar "Share" button and the "Share"/"Freeze and share" menu entries when the document is in Trash. Task: [5166945](https://www.odoo.com/odoo/project/2328/tasks/5166945) Forward-Port-Of: odoo/enterprise#102687 Forward-Port-Of: odoo/enterprise#98984
This update resolves a technical error that was appearing when users dismissed or opened timesheets, causing a traceback. The issue stemmed from outdated component settings. The fix removes unnecessary configurations and corrects the component's settings for smoother operation.
Original PR description
Steps to reproduce: - Open Timesheets - Open Timesheets assistant menu - Click on any record Issue: - Traceback appears on opening in debug mode, traceback appears on clicking dismiss of timesheet. Reason: - Unused props to component and wrong props in component. Solution: - Remove `canbeDismissed ` as it was earlier and was removed in futher editions (check push history for the feature pr). - Rename onDismissed to onDiscard as it seems changed. task-5434806 Forward-Port-Of: odoo/enterprise#102680
This update streamlines the process of adding goals to employee appraisals. Previously, the system would repeatedly ask users to select the employee, even though the employee was already identified. Now, goals are automatically created for the correct employee, improving efficiency and reducing user friction.
Original PR description
When adding goals from an employee appraisal, Appraisal of an employee > Goals > Open Library > Select Goals > Continue On the next screen, you need to select the employee, but you come from an employee appraisal! The employee was already known but the flow still asked to re-select an employee again. This improvement passes the correct employee context so goals are directly created for the current employee. task-[5420664](https://www.odoo.com/odoo/project/1251/tasks/5420664)
This update allows businesses operating in Mexico (MX) to customize the sequence used for generating GI CFDI invoices for their branch offices. Previously, the system always used a standard sequence, but now branch offices can define a unique prefix, ensuring invoices are correctly identified and processed. This resolves an issue where branch-specific GI CFDI sequences weren't being properly utilized.
Original PR description
Add a way to set a custom prefix for GI sequences on the settings for MX. Get this sequence first on the branch before looking to the one on root company. opw-5096687 Forward-Port-Of: odoo/enterprise#100017
This update fixes an issue where batch picking lines were incorrectly linked to the wrong internal transfer, leading to inaccurate inventory counts. The fix ensures that each picking receives the correct quantity of products, resolving a discrepancy in delivered stock. This improves the reliability of batch transfer operations.
Original PR description
**Steps to reproduce:** - enable "packages" and "batch transfers" settings - open wharehouse management/operation type - select internal transfer - check "automatic batch" and group by "contact" -…
**Steps to reproduce:** - enable "packages" and "batch transfers" settings - open wharehouse management/operation type - select internal transfer - check "automatic batch" and group by "contact" - create two storable product with an on hand quantity of 10 - create a an internal transfer for the first product for a qty of 10 - mark it as to do - do the same for the second product and make sure that it's the same contact - open barcode and select batches - select the last batch created - scan WH-STOCK - enter and confirm a quantity of 4 for each line - click on put in pack (at this step we can already see that the two new lines created are associated wit the second picking, even though it should be one line per picking) - click on the +6 on each line and click on put in pack - validate **Current behavior:** - a back order has been created for the first picking - the first internal transfer has only delivered 4 units of the first product - the second internal transfer has delivered 10 of the second product and 5 of the first product **Expected behavior:** both pickings should have delivered 10 of their product **Cause of the issue:** The lines created when clicking on "put in pack" for the first time are both associated with the second picking because the line split: https://github.com/odoo/enterprise/blob/898e3e47cfe3b86230da2b146960983d7ad144d0/stock_barcode/static/src/models/barcode_picking_model.js#L514 and the picking_id of the new line is set to the values provided by the `_getNewLineDefaultValues` as the picking_id of the last selected `line`: https://github.com/odoo/enterprise/blob/24b4e49dbe16cb8bd40170abfc089dd64c3f34dd/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L280-L281 rather than from the values of the initial line it is split from. opw-4952964 Forward-Port-Of: odoo/enterprise#102575 Forward-Port-Of: odoo/enterprise#91378
A recent test failure in the MRP work order module has been resolved. The issue stemmed from an incorrect count of analytic accounts during test setup, triggered by a specific employee calendar configuration. This fix ensures the test now passes and maintains the stability of the MRP work order functionality.
Original PR description
fixing runbot error https://runbot.odoo.com/odoo/runbot.build.error/234639 on test test_mrp_analytic_account_employee_from_widget introduced by this PR https://github.com/odoo/enterprise/pull/85517
**cause of the error:**
Because there is a resource.calendar.leave without calendar_id,
without resource_id and at a date after today :
during the setupclass, when the employee is created,
_create_future_public_holidays_timesheets() creates an account.analytic.line.
So at the end of the test ,
self.env["account.analytic.line"].search([('employee_id', '=', self.employee1.id)])
returns 2 records instead of 1.
runbot-234639
Forward-Port-Of: odoo/enterprise#102338
Forward-Port-Of: odoo/enterprise#102282This update fixes a misleading error message displayed when deleting sale orders linked to appointments. Previously, users received an incorrect instruction to reduce order quantities. Now, the system correctly informs users they must cancel the order before deletion, ensuring a smoother and more accurate user experience. This prevents confusion and potential data issues.
Original PR description
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed.…
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed. Solution: The order lines should not be manually unlinked from the sale order. It should be the bookings linked to the order lines that should be unlinked before the sale order deletion. Expected Behavior: When deleting a sale order whose lines have bookings, the following error message shoud be displayed: "You can not delete a sent quotation or a confirmed sales order. You must first cancel it." Current Behavior: When deleting a sale order whose lines have bookings, the following error message is displayed: "Once a sales order is confirmed, you can't remove one of its lines (we need to track if something gets invoiced or delivered). Set the quantity to 0 instead." Steps to reproduce on Runbot: 1. Install Appointments and ecommerce 2. For the dental care appointment, edit and enable "Up-front payment" 3. On the website, book an appointment for dental care and proceed to payment 4. Delete the sale order with the booking 5. Observe the incorrect error message being displayed opw-5092349 Forward-Port-Of: odoo/enterprise#100371
This update fixes an issue with how the AI agent processes dates, ensuring more accurate and reliable scheduling and task assignment. The changes improve the overall performance and consistency of the AI agent's date calculations, leading to better automation and scheduling capabilities. This primarily impacts the AI module.
A bug was preventing users from completing sign requests after a user account was deleted. This fix handles the scenario where a deleted user's information is still referenced, preventing an error when attempting to validate and send the completed document. This ensures a smoother experience for users managing sign requests.
Original PR description
Currently an error occurs when a user tries to click `Valid & Send Compeleted Document` as follows below: - Install the `sign` module with demo data - Log in as the `demo` user and send 2 sign requests to the `admin` user - Now log in as the `admin` user and delete the `demo`user - Go to the sing and open sign request that was sent by the `demo` user - Complete the sign and click on `Valid & Send Compeleted Document` This issue occurred while retrieving the suggested sign request items. The code was accessing the `create_uid` of those items, but because the user had been deleted, `create_uid` was set to False instead of containing a valid user ID and user name. This commit fixes the above issue by handling cases where `item['create_uid']` is False. When `item['create_uid']` is False, the code now safely returns `False` instead of attempting to access its index. sentry-7116433081 Forward-Port-Of: odoo/enterprise#102438
This update resolves an issue where subfolders within the Documents section were not appearing in the search panel when accessed from other applications. Previously, users would see the full folder structure, but the search functionality wouldn't reflect it. This change ensures a consistent and complete view of documents for all users.
Original PR description
...when coming from another app. Reproduce: 1. Go to a fleet vehicle record and open its 'Documents' stat button. 2. You end up in the Fleet folder, where you see subfolders as kanban cards, but they are not in the search panel. Task-5272030 Forward-Port-Of: odoo/enterprise#99688
Features or functions removed from Odoo
This pull request removes redundant code related to `@api.model` decorators within the VoIP module. This cleanup improves the codebase's efficiency and maintainability, addressing a minor technical issue. The change does not impact any user-facing features or functionality.
Original PR description
Task-5391222
12 changes
Resolved issues and error corrections
This update resolves a problem with the Chile invoice PDF report, where text was incorrectly formatted and overflowing. The fix ensures the invoice layout is correct, preventing vertical text and page overflows, resulting in a professional and readable invoice for Chilean customers.
Original PR description
Steps to reproduce: 1. Install l10n_cl_edi. 2. Create an invoice with a customer having a Chile address. 3. Print "Invoice PDF copy (Chile)". Issue: The PDF layout is broken: some text is rendered vertically and the content overflows across multiple pages. Cause: The footer right column row did not have an explicit width, causing wkhtmltopdf to shrink the container and wrap text letter by letter. Fix: Set w-100 on the inner row to stabilize the layout and prevent vertical text rendering. Before Fix : <img width="408" height="313" alt="image" src="https://github.com/user-attachments/assets/1d61412d-cfd3-48df-a4d4-eabd10df4865" /> After Fix: <img width="409" height="320" alt="image" src="https://github.com/user-attachments/assets/3a098227-7e43-44f0-9266-b4b0023f382c" /> opw-5348151 Forward-Port-Of: odoo/enterprise#102111
This update fixes an issue where employee and manager feedback was reset to default templates when an appraisal was reopened. The fix ensures that previously entered feedback is preserved, streamlining the appraisal process and improving user experience. The change was triggered by a bug in how the system handled appraisal state transitions.
Original PR description
Steps to reproduce: 1- Create new appraisal 2- Confirm appraisal 3- Edit employee and manager feedbacks 4- Set the final rating for the appraisal 5- Mark appraisal as done 6- Reopen appraisal Issue: The feedbacks of both the employee and manager are reset to the default template. They should be unchanged. Cause: Both the reopen and reset buttons used to call the the same action "action_back" which would set the state of the appraisal to "1_new", there is a compute that is triggered by the change in state which updates the appraisal's department_id which in turn triggers two other computes for the employee and manager feedbacks, those computes have a condition that if the state of the appraisal is '1_new', then the feedbacks should be reset to the templates. Fix: Make each button call its own action and make the reopen action set the state to '2_pending' instead of '1_new'. Furthermore make the reset action also reset the final rating for the appraisal. Task-5411661
This update allows businesses using the Mexican tax reporting (GI CFDI) functionality in Odoo to customize the sequence used for generating GI invoices within branch offices. Previously, the system always prioritized the root company's sequence, which is now configurable, ensuring invoices are correctly generated and submitted for branches. This change enhances compliance and accuracy for Mexican businesses.
Original PR description
Add a way to set a custom prefix for GI sequences on the settings for MX. Get this sequence first on the branch before looking to the one on root company. opw-5096687 Forward-Port-Of: odoo/enterprise#100017
This update resolves an issue where multiple lines were being incorrectly associated with the wrong picking during the 'put in pack' process for batch transfers. This resulted in inaccurate inventory counts and incorrect delivery tracking. The fix ensures each batch transfer operation creates a single, accurate line within the picking.
Original PR description
**Steps to reproduce:** - enable "packages" and "batch transfers" settings - open wharehouse management/operation type - select internal transfer - check "automatic batch" and group by "contact" -…
**Steps to reproduce:** - enable "packages" and "batch transfers" settings - open wharehouse management/operation type - select internal transfer - check "automatic batch" and group by "contact" - create two storable product with an on hand quantity of 10 - create a an internal transfer for the first product for a qty of 10 - mark it as to do - do the same for the second product and make sure that it's the same contact - open barcode and select batches - select the last batch created - scan WH-STOCK - enter and confirm a quantity of 4 for each line - click on put in pack (at this step we can already see that the two new lines created are associated wit the second picking, even though it should be one line per picking) - click on the +6 on each line and click on put in pack - validate **Current behavior:** - a back order has been created for the first picking - the first internal transfer has only delivered 4 units of the first product - the second internal transfer has delivered 10 of the second product and 5 of the first product **Expected behavior:** both pickings should have delivered 10 of their product **Cause of the issue:** The lines created when clicking on "put in pack" for the first time are both associated with the second picking because the line split: https://github.com/odoo/enterprise/blob/898e3e47cfe3b86230da2b146960983d7ad144d0/stock_barcode/static/src/models/barcode_picking_model.js#L514 and the picking_id of the new line is set to the values provided by the `_getNewLineDefaultValues` as the picking_id of the last selected `line`: https://github.com/odoo/enterprise/blob/24b4e49dbe16cb8bd40170abfc089dd64c3f34dd/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L280-L281 rather than from the values of the initial line it is split from. opw-4952964 Forward-Port-Of: odoo/enterprise#102575 Forward-Port-Of: odoo/enterprise#91378
This update fixes a usability issue where the barcode display for manufacturing orders was difficult to read in dark mode due to poor color contrast. The changes adjust text and background colors to ensure clear visibility, improving the user experience when working in dark mode.
Original PR description
*: stock_barcode Before this commit: ======================= When accessing a manufacturing order via Barcode in `dark mode`, the producing bar of the finished product is difficult to read due to…
*: stock_barcode Before this commit: ======================= When accessing a manufacturing order via Barcode in `dark mode`, the producing bar of the finished product is difficult to read due to poor colour contrast. Steps to reproduce: ======================= 1. Install the `mrp` module. 2. Switch to dark mode. 3. Open any manufacturing order using Barcode. 4. Observe the producing bar for the finished product. - The text on the producing bar is hard to read because the colour of text does not provide sufficient contrast. - Additionally, for products tracked by `lot or serial number`, when the same product is added multiple times, the barcode view groups these entries into a single grouped line, causing the same visibility issue in both MO and normal `picking/transfer` operations. Cause of the Issue: ======================= In dark mode, both the text and background colour of the producing bar are light, resulting in low colour contrast and making the text difficult to read. Additionally, the `text-muted` class applied to the `units of measure (UoM)` further reduces readability. After this commit: ======================= Updated the text colour of producing bar and background colour of grouped lines to use a darker shade for better visibility in dark mode. Also, removed the `text-muted` class used on `UOM` to improve redability. TaskID-5117608
This update fixes an issue where product attributes weren't shown on order lines. The change ensures that all product attribute names are now correctly displayed, improving order clarity and accuracy for users. This was caused by a change in how attribute data was constructed within the system.
Original PR description
Before this commit: --- - When an order was placed with product attributes, the attribute details were not shown on the order line. After this commit: --- - The product attribute names are now correctly displayed on the order line. Cause: --- - Until saas-18.2, the attribute string was built using the product’s display name and `attribute_line_ids`, which only included never type PTAV entries. - Starting from saas-18.2, the attribute string is constructed solely from `attribute_line_ids`, which now includes all PTAVs. task-5244869 Forward-Port-Of: odoo/enterprise#99007
This update resolves an error that prevented users from successfully sending customer statements. The fix ensures the system correctly handles scenarios where a custom email template isn't used, defaulting to the current user's email address to avoid a technical error.
Original PR description
Currently, an error occurs when a user sends a customer statement. **Steps to Reproduce ([Video](https://drive.google.com/file/d/1soOylzCVnNCNsWUBizeBQ9vfFlI5pzSP/view)):** - Install the…
Currently, an error occurs when a user sends a customer statement. **Steps to Reproduce ([Video](https://drive.google.com/file/d/1soOylzCVnNCNsWUBizeBQ9vfFlI5pzSP/view)):** - Install the `account_reports` module. - Go to `Invoicing` > `Customers` > `Customers`. - Switch to `List view`, select `a customer`, then click on `Actions` > `Open Customer Statements`. - Click `Send`, remove the `Email Template`, add a `subject`, and then click `Print & Send`. **Error:** `ValueError: Expected singleton: mail.template()` After [this commit], which checks whether the template has an email_from, when a user sends the customer statement and removes the email template, it still tries to access the template to fetch email_from for a particular customer [1]. If no email template is used, this results in an error [2] when going to extract the email_from. This commit ensures that email_from is taken from the email template if one is used; otherwise, it uses the current user's email address [3], which matches the default behavior. [this commit]: https://github.com/odoo/enterprise/commit/22c46e4f63e7b2dc0eee16fc807656cd4de21fb7 [1]- https://github.com/odoo/enterprise/blob/dc4d5633407ccc728d30de5ce2072a80c16b2766/account_reports/wizard/account_report_send.py#L246 [2]: https://github.com/odoo/odoo/blob/0dabb221225fba96c0e55779afadd9f12b369777/addons/mail/models/mail_render_mixin.py#L691-L693 [3]: https://github.com/odoo/odoo/blob/0dabb221225fba96c0e55779afadd9f12b369777/addons/mail/models/mail_thread.py#L2891-L2892 sentry-7106576491 Forward-Port-Of: odoo/enterprise#102532 Forward-Port-Of: odoo/enterprise#102219
This update resolves a failing test within the MRP work order module, identified by a Runbot error. The issue stemmed from an incorrect count of analytic lines created during a setup process, specifically related to employee time tracking. This fix ensures the test now passes and maintains the stability of the MRP work order functionality.
Original PR description
fixing runbot error https://runbot.odoo.com/odoo/runbot.build.error/234639 on test test_mrp_analytic_account_employee_from_widget introduced by this PR https://github.com/odoo/enterprise/pull/85517
**cause of the error:**
Because there is a resource.calendar.leave without calendar_id,
without resource_id and at a date after today :
during the setupclass, when the employee is created,
_create_future_public_holidays_timesheets() creates an account.analytic.line.
So at the end of the test ,
self.env["account.analytic.line"].search([('employee_id', '=', self.employee1.id)])
returns 2 records instead of 1.
runbot-234639
Forward-Port-Of: odoo/enterprise#102338
Forward-Port-Of: odoo/enterprise#102282This update resolves an issue where starting a new timer within a different company would cause an access error. The fix ensures the previous timer is properly stopped before initiating a new one, even when the industry_fsm module is installed, preventing errors and maintaining correct timer management across different company contexts.
Original PR description
Before this commit, when the user starts another timer from another company, the existing timer should be stopped before starting a new one. However, if industry_fsm module is installed and the…
Before this commit, when the user starts another timer from another company, the existing timer should be stopped before starting a new one. However, if industry_fsm module is installed and the previous timer is running from another company, the user could have an Access Error because he cannot read the task/ticket linked to the timesheet with the timer to stop. This commit makes sure the timer is correctly stopped without any issue even if the record linked is inside another company. Steps to reproduce the issue: ============================ 1. Install industry_fsm module 2. Create a task from a timesheetable project and start a timer from that new task. 3. Create a new company and go inside that company 4. Create a new timesheetable project and a new task inside it 5. Start a new timer from that new task. Expected Behavior: ----------------- The timer form the first task created should be stopped and a timer for the newest task should be running. Actual Behavior: --------------- An access error is raised because the user cannot access to the task linked to the timer to stop. task-5076633
This update aligns the positions of the 'view-contact' and 'livechat-info' buttons within the WhatsApp channel interface. Previously, they were in opposite locations, which was causing confusion for agents. This change ensures a more intuitive and consistent experience for live chat and WhatsApp support agents.
Original PR description
The thread action 'view-contact' is somewhat like 'livechat-info', in that this action redirects to relevant info to the whatsapp user and livechat-info is a panel with all info on the visitor and…
The thread action 'view-contact' is somewhat like 'livechat-info', in that this action redirects to relevant info to the whatsapp user and livechat-info is a panel with all info on the visitor and more. The position of both buttons were the total opposite in discuss app: - 'livechat-info' was put as the 1st panel one before panels - 'view-contact' was dead last. There are differences, with 'livechat-info' being a panel and 'view-contact' a redirect button. However, each are important buttons for the type of conversation that justify them being in their own group right now. Since the buttons are mutually exclusive by the channel type, there's reason to have them share the same position. This commit moves the position of 'view-contact' in discuss header thread actions to be the same as 'livechat-info', that is as the 1st action in the list. This makes its position consistent with livechat info, thus agents of live chat and whatsapp would appreciate the 2 button placement being consistent. Task-5431313 <img width="1760" height="231" alt="Screenshot 2025-12-18 at 21 02 24" src="https://github.com/user-attachments/assets/ee2baf91-0d9a-49ca-91ac-a7781b33e57b" />
This update addresses critical issues preventing incorrect credit notes from being processed by the KRA (Kenya Revenue Authority). Specifically, the system now ensures credit notes match the original invoice's customer PIN and cannot be dated before the invoice date, ensuring compliance and accurate reporting.
Original PR description
* Prevent credit note with customer PIN different than the submitted invoice. * Prevent credit note to be dated before the original invoice date. task-5160113 Forward-Port-Of: odoo/enterprise#102475 Forward-Port-Of: odoo/enterprise#100480
This update fixes a misleading error message displayed when deleting sale orders with associated appointments. Previously, users received an incorrect instruction to reduce order quantities. Now, the system correctly informs users that they must cancel the order before deletion, aligning with expected business processes and improving user experience.
Original PR description
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed.…
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed. Solution: The order lines should not be manually unlinked from the sale order. It should be the bookings linked to the order lines that should be unlinked before the sale order deletion. Expected Behavior: When deleting a sale order whose lines have bookings, the following error message shoud be displayed: "You can not delete a sent quotation or a confirmed sales order. You must first cancel it." Current Behavior: When deleting a sale order whose lines have bookings, the following error message is displayed: "Once a sales order is confirmed, you can't remove one of its lines (we need to track if something gets invoiced or delivered). Set the quantity to 0 instead." Steps to reproduce on Runbot: 1. Install Appointments and ecommerce 2. For the dental care appointment, edit and enable "Up-front payment" 3. On the website, book an appointment for dental care and proceed to payment 4. Delete the sale order with the booking 5. Observe the incorrect error message being displayed opw-5092349 Forward-Port-Of: odoo/enterprise#100371
7 changes
Resolved issues and error corrections
This update resolves a random error in how Odoo validates accounting formulas. Previously, the validation process could incorrectly flag correct formulas as invalid due to an issue with how tokens were processed. Sorting the tokens by length ensures formulas are consistently and accurately evaluated, preventing this unexpected behavior.
Original PR description
…me tokens greedily Fixes issue #241004 Description of the issue/feature this PR addresses: This is a hard to reproduce bug becase it depends in what order the set is iterated. Since the set is an…
…me tokens greedily Fixes issue #241004 Description of the issue/feature this PR addresses: This is a hard to reproduce bug becase it depends in what order the set is iterated. Since the set is an unordered structure, this bug will happen just sometimes. The issue is this: The _check_formula in this module iterates over tokens to check if the formula only includes allowed tokens or numbers. This check passes when the set is iterated in a way that the token '>=' appears before the '>' token. But if it is the other way around, the check fails. This is because the way the tokens are consumed in the for; if the '>' is before the '>=', the '>' token will be consumed, the position will be advance one position forward and the next character found will be just the '=' character. This is not an allowed token and the check fails. The way to solve this is to sort the set by length of the token, from longest to shortest. This assures a greedy consumption of token, which is what is needed to avoid this bug. Current behavior before PR: The _check_formula randomly marks a correct formula as malformed Desired behavior after PR is merged: Using >= or <= should never cause a formula to be marked as malformed --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a technical error that prevented studio exports from completing successfully. The issue stemmed from accessing single values across multiple partner records, leading to a system error. The fix ensures data is processed correctly during export operations.
Original PR description
An error occurs when the system tries to access single values `(of available_peppol_eas)` from multiple records at [1] during a studio export. Link [1]: https://github.com/odoo/odoo/blob/1ff538bfefb9b5342335b37e5de163d97f270258/addons/account_peppol/models/res_partner.py#L64 `ValueError: Expected singleton: res.partner(15, 27, 34, 28, 10, 36, 19)` To resolve this issue, use an iteration(for loop) to iterate records one by one. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update allows businesses operating in Mexico to customize the sequence used for generating GI CFDI invoices within their branch offices. Previously, the system always prioritized the root company's sequence, which is now configurable, ensuring accurate invoice numbering and compliance with Mexican tax regulations. This change streamlines invoice processing for Mexican businesses.
Original PR description
Add a way to set a custom prefix for GI sequences on the settings for MX. Get this sequence first on the branch before looking to the one on root company. opw-5096687 Forward-Port-Of: odoo/enterprise#100017
This update fixes a bug that caused Odoo to crash when sending invoices via Peppol with invoice lines lacking a product name. Now, the system validates the product name and displays a clear error message to the user, ensuring invoices can be sent successfully. This improves the reliability of the Peppol invoice process.
Original PR description
Before this commit: When sending an invoice via Peppol with an invoice line that has no product name, the system crashes with a TypeError instead of showing a error message. Steps to reproduce: 1. Go to Accounting 2. Navigate to Customers > Invoices 3. Create a new invoice 4. Add an invoice line without entering a product name 5. Click 'Send' 6. Select 'by Peppol (Demo)' 7. Click 'Send' -> TypeError: 'NoneType' object is not subscriptable After this commit: System validates that the product name exists before accessing its text content. Users see a clear, error message: `Each invoice line should have a product or a label.` task-5432061 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update significantly speeds up the generation of budget reports by optimizing how filters are applied. Previously, a slow process involved building a large table and filtering it afterward. Now, the filtering is done directly within the underlying queries, dramatically reducing processing time and improving report loading speed.
Original PR description
Previously, generating the budget.report table was necessary to trigger _compute_all for budget.line fields. This table was built using three separate queries with a UNION operator. Because of the…
Previously, generating the budget.report table was necessary to trigger _compute_all for budget.line fields. This table was built using three separate queries with a UNION operator. Because of the UNION, any filtering (like on specific budget_line_ids) happened after the full, unfiltered table was generated. This post-filtering caused slowness, especially in nested loop joins with large tables like account.analytic.line. This commit optimizes performance by pushing the filter condition (using specific budget_line_ids) directly down into the three underlying queries. This reduces the number of budget.line records processed, speeding up joins and overall computation. The benchmark below is done on a database that has **66396** `budget.line` records and **928567** `account.analytic.line` records. Opening a budget report for a specific year, only applied the filter with **40** `budget.line` records. | Scenario | Execution Time | | :--- | :--- | | **Before this Commit** | **60.00 seconds** | **After this Commit** | **1.84 seconds** opw-5150569
This update fixes a misleading error message displayed when deleting sale orders with associated appointments. Previously, users received an incorrect instruction to reduce order quantities. Now, the system correctly informs users they must cancel the order before deletion, aligning with expected business processes. This ensures a smoother user experience and prevents confusion.
Original PR description
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed.…
Problem: When the module is installed and there are bookings with answers linked to sale orders, the order lines are deleted before the order, causing the wrong error message to be displayed. Solution: The order lines should not be manually unlinked from the sale order. It should be the bookings linked to the order lines that should be unlinked before the sale order deletion. Expected Behavior: When deleting a sale order whose lines have bookings, the following error message shoud be displayed: "You can not delete a sent quotation or a confirmed sales order. You must first cancel it." Current Behavior: When deleting a sale order whose lines have bookings, the following error message is displayed: "Once a sales order is confirmed, you can't remove one of its lines (we need to track if something gets invoiced or delivered). Set the quantity to 0 instead." Steps to reproduce on Runbot: 1. Install Appointments and ecommerce 2. For the dental care appointment, edit and enable "Up-front payment" 3. On the website, book an appointment for dental care and proceed to payment 4. Delete the sale order with the booking 5. Observe the incorrect error message being displayed opw-5092349 Forward-Port-Of: odoo/enterprise#100371
This update fixes an issue where the TPAR report incorrectly calculated gross paid amounts for certain vendors, leading to export failures. The change ensures all payment lines, including those in asset_cash accounts, are included in the report's calculations, resulting in accurate GST reporting.
Original PR description
Behavior before: Exporting the TPAR report could fail with an error indicating that the GST amount exceeded the gross paid for certain vendors. Some payment lines were excluded from the SQL query,…
Behavior before: Exporting the TPAR report could fail with an error indicating that the GST amount exceeded the gross paid for certain vendors. Some payment lines were excluded from the SQL query, leading to discrepancies in the report. Behavior after: The SQL query has been updated to include all relevant payment lines, including those in asset_cash accounts. This ensures that the gross paid is calculated correctly, allowing the TPAR report to be exported without errors. Root Cause: The previous query only considered asset_current and liability_current accounts, ignoring asset_cash accounts. This omission caused the gross paid amount to be understated relative to the total GST paid. Steps to Reproduce: 1. Create a vendor bill. 2. Navigate to the Bank Reconciliation page (Accounting → Dashboard → Bank Journal). 3. Create a bank statement line for the bill amount. 4. Validate the statement line with the corresponding invoice line. 5. Generate the TPAR report — the payment amount should now be correctly included. OPW: 5148697 Forward-Port-Of: odoo/enterprise#99874
5 changes
Enhancements to existing features
This update adjusts payroll rule parameters to reflect changes in US payroll regulations for the 2026 tax year. Ensuring these parameters are current is crucial for accurate salary calculations and maintaining compliance with US tax laws. This update directly impacts payroll processing.
Original PR description
Purpose: Certain US Payroll values changes yearly. The payroll rule parameters must be updated for accurate salary calculation for 2026 for compliance. task-5409739
Resolved issues and error corrections
This update resolves an issue where the Amazon connector wasn't correctly recognizing key delivery modules for major shipping carriers like UPS, FedEx, USPS, and DHL. By mapping these modules, the connector now functions properly with these carriers, ensuring accurate sales order data and shipping integrations.
Original PR description
Amazon connector did not recognize the _rest delivery modules (ups_rest, fedex_rest, usps_rest, dhl_rest). This maps them to the correct carrier names, consistent with existing mappings.
This update corrects a technical issue within the account_edi_ubl_cii module by removing an outdated database call. Specifically, a function using the @api.model annotation was incorrectly attempting to create a new record. This change improves efficiency and stability.
Original PR description
[FIX] account_edi_ubl_cii: remove ensure_one call in api.model This is incorrect to call self.ensure_one() in a function with the @api.model annotation. introduced by 574a67c73633 no-task
This update expands the supported countries for the 'itsme' authentication process within Odoo Enterprise. The change aligns Odoo's functionality with the official itsme coverage list, ensuring compliance and a better user experience for customers in more regions. This improves the reliability and usability of the sign-up process.
Original PR description
Extend itsme availability beyond BE and NL to match the official itsme coverage: https://www.itsme-id.com/en-BE/business/coverage task-5424818
This update prevents unnecessary email reminders from being sent related to timesheet approvals. The system now only sends reminders when there are actual timesheets needing review, or when an employee lacks a manager or approver. This reduces email clutter and improves efficiency.
Original PR description
prevent cron from sending approver reminder if no timesheet assigned to approver Send the reminder email if: - there are timesheets to validate - AND if the user is set as either the manager or timesheet approver of an employee with timesheets left to be validated - OR if the said employee has no manager or timesheet approver set Task-3624610