Daily updates from Odoo
Friday, December 12, 2025
32 changes · saas-18.3
Enhancements to existing features
This update enhances the Point of Sale system by automatically saving log messages to the user's browser. Clients can now easily download these logs and share them with our support team for faster troubleshooting. This provides valuable data for diagnosing and resolving POS issues.
Original PR description
Enterprise PR: https://github.com/odoo/enterprise/pull/100183 This commit extends the `logPosMessage` function in the POS to also save each log message to a `Logger` instance (which persists the logs for 24 hours in the browser storage). A download button is added to download these logs, which the client could then send on to the support team. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adds logging to communication with the blackbox, a tool used to troubleshoot issues for our POS clients. Combined with a related change to save and download these logs, this will significantly simplify debugging and reduce downtime for clients experiencing problems. It's a proactive step to improve client support.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/236927 This commit adds several log messages for the communication with the blackbox. In combination with the associated Community PR to save and download these logs, this should enable easier debugging when clients experience problems.
This update enhances the formatting of tax amounts for the Co-dian localization module within Odoo Enterprise. It standardizes the float format used in account edi XML files, ensuring accurate tax calculations and reporting for Co-dian businesses. This change improves the reliability of financial data related to this specific localization.
Original PR description
Forward-Port-Of: odoo/enterprise#101886 Forward-Port-Of: odoo/enterprise#101288
Resolved issues and error corrections
This update fixes an issue where POS invoices were incorrectly defaulting to the customer's first delivery address instead of the address selected during order creation. The change ensures that invoices generated from POS orders accurately reflect the customer's chosen delivery address, aligning with the standard 'sale' module behavior. This improves order accuracy and customer satisfaction.
Original PR description
Currently, an incorrect shipping address is assigned to invoices generated from POS orders when the customer has multiple delivery addresses. **Steps to reproduce:** - Install the `point_of_sale` and…
Currently, an incorrect shipping address is assigned to invoices generated from POS orders when the customer has multiple delivery addresses. **Steps to reproduce:** - Install the `point_of_sale` and `contacts` modules. - Enable `Customer Addresses` from the settings. - Create a contact with `two` delivery addresses. - Open POS and create an order using the `second delivery address` as the customer. - Confirm the order with the `invoice`. - Observe the `shipping address` on the invoice. **Observation:** The invoice incorrectly shows the first delivery address instead of the second delivery address. **Cause:** At invoice creation in POS, only `partner_id` is set and `partner_shipping_id` is missing at [1]. As a result, the invoice defaults to the customer's first delivery address instead of the delivery address selected in POS. **Fix:** This commit adds `partner_shipping_id` to the invoice values to ensure the POS invoice uses the exact delivery address selected during order creation. same as the `sale` module behaviour. [1]: https://github.com/odoo/odoo/blob/1d1cd8648ed1c3f13febbde8d48e28928e18583f/addons/point_of_sale/models/pos_order.py#L667-L684 opw-5350137 Forward-Port-Of: odoo/odoo#239663 Forward-Port-Of: odoo/odoo#238055
This update fixes an issue where the EDI status for Brazilian e-invoices didn't accurately reflect cancellation requests. The change ensures the status is correctly set to 'Cancelled' after a cancellation is processed, improving the accuracy of EDI tracking and compliance with Brazilian regulations. The fix was implemented by moving the status update to the cancellation process itself.
Original PR description
**Steps to reproduce:** * Install the **Accounting** and **l10n_br_edi** modules. * Create and post a Brazilian customer invoice using an **Avatax fiscal position** * [Guide to setup EDI for…
**Steps to reproduce:** * Install the **Accounting** and **l10n_br_edi** modules. * Create and post a Brazilian customer invoice using an **Avatax fiscal position** * [Guide to setup EDI for l10n_br](https://docs.google.com/document/d/1CSUKpnyhty5WBqUDBE-7dGvu0qxaC5vQ0loz0fYNg04/edit?tab=t.0) * Confirm the invoice and **send it to e-invoice (Brazil)**. * Confirm the **Brazil E-Invoice Status** shows **'Accepted'**. * Click **Request Cancellation**, enter a cancellation reason, and submit the request. **Observed behavior:** * The invoice moves to **Cancelled** state. * The cancellation XML is generated and attached in the chatter. * SEFAZ returns a successful cancellation response. * However, the **BR EDI Status** becomes **empty**, instead of reflecting **'Cancelled'**. **Cause:** * In the wizard `l10n_br_edi.invoice.update`, both `_finalize_update()` and `_submit_services()` assign `l10n_br_last_edi_status = 'cancelled'` **before** calling `button_cancel()`. * `button_cancel()` internally triggers `button_draft()` for posted invoices. * The Brazil EDI override of `button_draft()` resets `l10n_br_last_edi_status = False`. * This clears the status that was just set, leaving the field blank. **Fix:** * move `l10n_br_last_edi_status = "cancelled"` to `button_cancel()` method. opw-5378542 Forward-Port-Of: odoo/enterprise#101438
This update resolves an issue where users were encountering errors when adding an XML encoding declaration in the Odoo Studio XML editor. The fix ensures that the system gracefully handles this invalid input by displaying a clear error message, preventing the application from crashing. This improves the user experience and stability of the Studio environment.
Original PR description
Currently, an error occurs when a user includes an XML encoding declaration in the studio XML editor. **Steps to produce:** - Install the `web_studio` module and enable `developer mode` - Open `Apps`…
Currently, an error occurs when a user includes an XML encoding declaration in the studio XML editor. **Steps to produce:** - Install the `web_studio` module and enable `developer mode` - Open `Apps` > `studio` > `view` > `</> xml` - Declare encoding as: `<?xml version='1.0' encoding='utf-8'?>` and click `save` **Error:** `ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.` **Root cause:** At [1], an error is raised when the XML declaration contains an `encoding` attribute, as encoding declarations are invalid in Unicode strings. **Fix:** This commit ensures that a `UserError` is raised, improving the error message clarity. A similar fix was applied in https://github.com/odoo/odoo/pull/205324. [1]: https://github.com/odoo/odoo/blob/8a22b6ca09e1da3ccba3540bc4851a5174e035cc/odoo/tools/translate.py#L316 sentry-6981234548 Forward-Port-Of: odoo/odoo#239630 Forward-Port-Of: odoo/odoo#233571
This update resolves an issue where users encountered an error when removing a combo name and then attempting to edit its configuration. The fix ensures that the 'Edit Configuration' option is only displayed when a product template is associated with the combo, improving usability and preventing unexpected errors.
Original PR description
Currently, when a user adds a combo to an order line, and remove the name of combo and click on Edit Configuration (pencil icon) error is encountered. Steps to replicate: - Install `sale_management`…
Currently, when a user adds a combo to an order line, and remove the name of combo and click on Edit Configuration (pencil icon) error is encountered. Steps to replicate: - Install `sale_management` with demo and create a new SO. - Add a combo product and remove the combo name and click Edit Configuration (pencil icon). Error: `TypeError: SaleProductConfiguratorController.sale_combo_configurator_get_data() missing 1 required positional argument: 'product_template_id'` Cause: - When a user clicks on Edit configuration, the client-side JavaScript makes an RPC call to the server, targeting the `sale_combo_configurator_get_data()` which expects `product_template_id` at [1] and since it is removed from order line the error is encountered. Solution: - Changed the content of method `isCombo()` to use the product_template_id to make sure the Edit Configuration is only visible when product template is present. Similar PR for reference: https://github.com/odoo/odoo/pull/217464 [1]: https://github.com/odoo/odoo/blob/fa4307b9758800f26c9ee87cf3698fd60bfd1ab5/addons/sale/controllers/combo_configurator.py#L12-L14 No ID --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238536
This update resolves an issue where Odoo's logging system incorrectly handled log records with complex data (like mappings). The fix moves the message formatting process to a more reliable location, ensuring consistent and accurate logging output. This improves overall system stability and reduces potential errors.
Original PR description
When `lower_logging` encounters a `LogRecord.args: Mapping`, it fucks up and strips out all the values keeping only the mapping keys (as a tuple), which then breaks when trying to format it in `LogRecord.msg`. Fix the issue by moving the entire message munging into, appropriately, the formatter: `getMessage` will do the `str.__mod__` call at which point we don't need to deal with the args at all, then `formatMessage` generates the full message line (not including the stack traces from `exc_info` and `stack_info`, those are added in the second half of `Formatter.format`). https://runbot.odoo.com/odoo/error/234669 Forward-Port-Of: odoo/odoo#239560 Forward-Port-Of: odoo/odoo#239410
This update corrects a calculation error related to Italian VAT withholding taxes (RA Agenti). Specifically, it now accurately applies a 23% rate on 20% of the base amount, as required by Italian regulations. The change ensures correct export of VAT data for Italian businesses.
Original PR description
This commit adds a new RA Agenti withholding tax for the case where 23% is applied on 20% of the base (effective –4.6%) and ensure it is exported using the 23% rate. Key changes: - Added new tax: –4.6% (23% su 20% RA Agenti) - Updated name and invoice label of the existing –11.5% tax - Updated EDI export logic to map –11.5% → 23% and –4.6% → 23% task-5258180 Forward-Port-Of: odoo/odoo#239206 Forward-Port-Of: odoo/odoo#236195
This update corrects a printing issue where customer addresses were duplicated on DIN 5008 Sale Order reports. The fix ensures addresses are only displayed once, specifically when the 'Customer Addresses' setting is disabled, streamlining report output and improving data clarity.
Original PR description
## Issue: When DIN5008 is selected as the document layout, printing a Sale Order may show the customer address twice ## Cause: The address is first added by `external_layout_din5008`, then again by `report_saleorder_document` This duplication only makes sense when the partner address differs from the invoice or delivery address If the Customer Addresses setting is disabled, displaying it multiple times is unnecessary ## Steps to reproduce: - Install a company using DIN 5008 (e.g., l10n_de) - Select the DE company and go to Settings - Disable `Customer addresses` and ensure the document layout is set to DIN 5008 - Create a Quotation with any customer and product - Print the PDF → the address appears twice before the fix opw-5176593 Forward-Port-Of: odoo/odoo#235441
This update resolves an issue where users couldn't proceed to the payment page if the event's 'Name' question was removed. The fix ensures that the system handles missing names gracefully by treating them as empty strings, preventing an error and allowing registration to complete.
Original PR description
When registering to an event, customers are asked questions before reaching the payment page. By default, a *Name* question is included, but it can be removed by the organizer of the event. If the…
When registering to an event, customers are asked questions before reaching the payment page. By default, a *Name* question is included, but it can be removed by the organizer of the event. If the *Name* question is removed, but a name is asked in the delivery form, Odoo will try to compare the (missing) name from the event's questions with the (required) name from the delivery form.
https://github.com/odoo/odoo/blob/828a9504c7d43aa35ed91141268d04e0a55782c3/addons/portal/controllers/portal.py#L551
The issue is that if there's no *Name* question among the event's questions, a `res.partner` with its `name` field set to `False` is created. When attempting to call `.strip()` on its name, an `AttributeError` is raised (*'bool' object has no attribut 'strip'*).
This fix prevents the error by considering the name field as an empty string in case no name is provided.
### Steps to reproduce:
1. Install *Online Event Ticketing* (`website_event_sale`)
2. In Settings > Website, set *Sign in/up at checkout* to *Disabled (buy as guest)*
3. In Events, create a new Event
- Give it any name
- Add a product line for the Event Registration with a price greater than 0
- In the *Questions* tab, remove the *Name* question
- Click the *Go to website* smart button and publish the event
4. On the website, in incognito mode:
- Click *Events*
- Click the new event we created in Step 3
- Click *Register*, (set the quantity to one ticket,) click *register*
- Answer the questions (there should **not** be a *Name* question) and click *Confirm Registration*
- Fill out the required fields of the delivery form (there **should** be a *Name* field)
- Open the console, then click *Confirm* in the delivery form: An error appears, and the Payment page does not appear
opw-5259781
Forward-Port-Of: odoo/odoo#237154This update resolves an issue where the applicant's email address was incorrectly duplicated in recruitment communications. The fix ensures that the latest email address associated with an applicant is used, preventing confusion and improving the accuracy of email notifications. This enhances the overall applicant experience.
Original PR description
Steps to reproduce: 1- Create a job position and then create an applicant for the position with an email address. 2- Change email from the applicant form. 3- Use the chatter to send an email. 4- As seen, both old email and new email address are used as recipient addresses which shouldn't be the case. The cause was that it failed to save the new email on the partner_id associated to the hr_applicant. This was fixed by modifying the inverse function to allow the values to be modified even if already existant. task-5269650 Forward-Port-Of: odoo/odoo#236208
This update ensures payments processed with SEPA have a required 'partner ID' set. Previously, missing this ID caused errors during batch payment creation, potentially disrupting financial transactions. This change improves the stability and reliability of our payment processing system.
Original PR description
When doing a payment with SEPA as the payment method, and then create a batch payment out of it. It could happen that the partner_id of the payment was not set. That would cause a traceback because in the _get_CdtTrfTxInf we do a browse on the partner to use it later on. But since the partner is False, we have an empty record set. task-5213880 Forward-Port-Of: odoo/enterprise#98249
This update fixes an issue where the Partena export file incorrectly included the company code of the active company when generating exports for inactive companies. The change ensures the correct Partena code is used by referencing the specific company record instead of the active company, improving data accuracy for payroll reporting.
Original PR description
### Issue: In multicompany, when we generate the Partena export file of the 'not active' company, the partena code of the active company is inputted in the file. ### Steps to reproduce: - Install…
### Issue: In multicompany, when we generate the Partena export file of the 'not active' company, the partena code of the active company is inputted in the file. ### Steps to reproduce: - Install 'l10n_be_hr_payroll_partena' and switch to a Belgian company - Make sure the company has a "Partena Affiliation Number" - Create an employee for this company, with a "Partena code" - Create a contract for this employee, set it a running - Create a new Belgian company with a different "Partena Affiliation Number" - Activate both Belgian companies, but set the second one as active - Payroll > Reporting > Export work entries to Partena - Create a new one, populate it with the employee just created - Click "Generate Export File" ### Cause: When getting the data for the CSV file, we use `self.env.company` which is the active company. So when this company is not the one of the export record, we input the wrong code values. ### Solution: Use `self.company_id` instead of `self.env.company_id`. Also adds the test class with basic tests. opw-5345786 Forward-Port-Of: odoo/enterprise#101110
This update corrects a bug where review messages were incorrectly displayed for administrators. The fix ensures that administrators always edit their own review messages when using the 'Edit Review' button. This improves the user experience for administrators managing reviews.
Original PR description
How to reproduce: - Log as Mitchell Admin - Edit Marc Demo review using the contextual edit button - Click on save to update the review - Click on the button "Edit Review" on the top The review modals opens with the message of Marc Demo instead of the message of Mitchell Admin. The fix ensures you always edit your review message when clicking on "Edit review" button. Note: this is only possible with admin user as other users cannot edit messages of other users. So unfortunately, we had to create a new tours as we can't add steps to test_course_reviews_elearning_officer (not running as admin). An alternative would have been to extend test_fullscreen_slide_text_highlights and rename it. Task-5170310 Forward-Port-Of: odoo/odoo#238944 Forward-Port-Of: odoo/odoo#232696
This update corrects a bug that prevented multiple gift cards from being correctly generated when selling multiple gift cards in a single POS order. Previously, only one gift card with the total amount was created. This fix ensures accurate reporting of gift card sales, improving data integrity and customer satisfaction.
Original PR description
This fix addresses an issue where selling multiple gift cards in a single POS order results in only one gift card being created with the total amount, instead of multiple gift cards with the correct…
This fix addresses an issue where selling multiple gift cards in a single POS order results in only one gift card being created with the total amount, instead of multiple gift cards with the correct individual amounts. Step to reproduce: - Create a new gift card and enable the option to sell this card in the POS - Open the POS and try to sell multiple gift cards in the same order - Validate the order - Check the generated gift cards, only one gift card will be created with the total amount instead of multiple gift cards with the correct individual amounts This issue occurs because the field `reward_point_split` is missing from the kanban view of loyalty rules. So, when creating a new gift card, this field value, which should be True for gift cards, is not returned by the onchange method, and since nothing triggers a new computation unless the program type is changed, the field remains False. This fix simply restores this field in the kanban view (like before https://github.com/odoo/odoo/pull/172561) so that its value is correctly taken into account when creating a new gift card. opw-5103652 Forward-Port-Of: odoo/odoo#238993
This update ensures that coupon emails sent to customers display the expiration date in the localized format (e.g., yyyy-MM-dd) based on their language settings. Previously, the emails used a technical date format, leading to confusion. This change improves the customer experience and ensures accurate information delivery.
Original PR description
Steps to reproduce: 1. Install `loyalty` and `sale_management` 2. Activate another language with another date format, eg. English (AU) 3. Set that language on a contact 4. Sales > Product > Discount…
Steps to reproduce: 1. Install `loyalty` and `sale_management` 2. Activate another language with another date format, eg. English (AU) 3. Set that language on a contact 4. Sales > Product > Discount & loyalty 5. Create a record with program type coupons 6. Generate a coupon for that AU contact with an expiration date Issue: The coupon email received by the customer shows the expiration date using the yyyy-MM-dd format, and the attachment shows the same technical format instead of the customer’s localized date format. Cause: We are not using a formatted date according to the customer before: Customer with English AU language <img width="601" height="563" alt="image" src="https://github.com/user-attachments/assets/faea2840-aca6-4850-bfc9-b0d24da65a3b" /> <img width="1510" height="883" alt="image" src="https://github.com/user-attachments/assets/b0ebc0cc-6243-450d-ad12-cecda4858e26" /> After: <img width="603" height="543" alt="image" src="https://github.com/user-attachments/assets/5be2332b-3237-4ce5-8122-0766cd274650" /> <img width="1482" height="886" alt="image" src="https://github.com/user-attachments/assets/99d31b4c-33fa-4f92-9970-56720181911e" /> opw-5247621 Forward-Port-Of: odoo/odoo#237880
This fix resolves an issue where users connected to a POS session couldn't access the backend after logging out and back in. Previously, access was limited to the initial user who opened the POS. Now, connected users can access the backend regardless of who initially opened the session, improving workflow efficiency.
Original PR description
Currently a user that connected to a pos user cannot go backend if he was not the person who opened the session the first time. Steps to reproduce: ------------------- * Modify settings of the shop…
Currently a user that connected to a pos user cannot go backend if he was not the person who opened the session the first time. Steps to reproduce: ------------------- * Modify settings of the shop to use employee feature * Make sure admin and demo can access the shop, set them advenced employee for example. * Logged as Mitchell Admin, open the pos (It should have been closed before) * Use Mitchel admin employee * Complete cash control * Go backend * Log out * Log back in with Marc Demo * Enter the shop (it was already "opened" by Admin) * Use Marc demo employee * Now try to see the backend button > Observation: Backend button is not available Why the fix: ------------ Quoting this commit: https://github.com/odoo/odoo/commit/61df2871e1aac0144d26022a2a49c75ea9ecad4a > Now, the only employees that can go back to the backend are those binded to the user connected. However, `this.pos.session.user_id` only reflects the user who opened the pos the first time, in our case Mitchell Admin. It does not represent the connected user. opw-5276950 Forward-Port-Of: odoo/odoo#239627 Forward-Port-Of: odoo/odoo#238636
This update fixes a bug where credit notes weren't being properly accounted for during invoice settlement. The change ensures credit notes are now correctly processed, allowing for accurate reconciliation of payments and reducing potential discrepancies in financial reporting. This improves the reliability of the POS settlement process.
Original PR description
We had a bug when settling invoices and credit notes of a customer. The credit notes where not correctly computed. Steps to reproduce: ------------------- In accounting: * Create and confirm a customer invoice for a total of 10$. * Create and confirm for the same customer a credit note for a total of 2$. In POS: * In a seesion, open the customer selection menu. * In the burger menu at the right of our customer, select Settle invioces. * Select our invoice and credit note. > Observation: The credit note was previously seen as an amount to pay. Why the fix: ------------ Recomputing updates existing credit notes to use the signed residual logic. The domain change allows credit notes with negative pos_amount_unsettled to appear. After these changes, credit notes should appear in the "Settle invoices" dialog with negative amounts, and selecting them will create negative lines that reduce the total. opw-5257884
This update resolves a limitation preventing non-administrator users from utilizing the delivery_usps_rest module. By implementing sudo() calls, the module now grants necessary access to the USPS Rest API, expanding functionality without requiring elevated user permissions.
Original PR description
Non-admin users are currently unable to use the delivery_usps_rest module because several fields are limited to the "base.group_system" group. It's obviously not feasible to give everyone the "Role / Administrator" role. This PR makes necessary sudo() calls the same way that delivery_ups_rest does. Forward-Port-Of: odoo/enterprise#101163
These updates improve the accuracy of BIS3 export files by separating them from UBL dependencies and refining tax calculations. Specifically, the changes address issues with how fixed taxes are handled and improve the overall reliability of the BIS3 export process. This ensures more accurate financial reporting.
Original PR description
**[IMP] account: Add new tax helpers for EDI** (backport) task_id: 5096249 **[FIX] account_edi_ubl_cii: Fix management of fixed taxes** (backport) This commit contains 2 things: - an helper to…
**[IMP] account: Add new tax helpers for EDI** (backport) task_id: 5096249 **[FIX] account_edi_ubl_cii: Fix management of fixed taxes** (backport) This commit contains 2 things: - an helper to extract any tax_data and move it to another base_line - the usage of this helper in UBL to turn emptying taxes into additional base_lines == Add helpers to turn tax_data into new base_lines easily == With this helper, you can now exclude any tax from any base line and turn them into new base lines. Also, I changed a bit the smooth distribution of rounding because the math.ceil is sometimes too greedy and make the whole results to be less accurate. == Make a different behavior between recycling contribution taxes / emptying taxes == In UBL, all fixed taxes are treated as allowances/charges. In this commit, we make a clear distinction between recycling contribution taxes that are treated as allowances/charges and emptying taxes that are exempted of tax and are treated as addition invoice lines in the document. == Fix a small issue with aggregate_function passed to reduce_base_lines_with_grouping_function == The aggregator wasn't called when setting the 'target_base_line' at the very first time. task_id: 5182783 **[FIX] account_edi_ubl_cii: Reword export BIS3** - Separate the BIS3 from the annoying dependency between all the UBL files. You are not supposed to generate an UBL 2.0 & 2.1 UBL files. Those are templates with all the options you have to build your format on top of it. However, since we used them as a hierarchy and since most of the code and implementation are inside UBL 2.0, "fixing" any use case for one single implementation has impacts in all others. In order to fix issues about ways amounts are computed in BIS3, we first split BIS3 to be independant from UBL 2.0 / UBL 2.1 but using new generic helpers that could be used for any single format. The future goal will be to make all formats independant but that part is already big enough and we are in a hurry. "To be continued in a next PR" - Reword the test suite for exported files to be more explicit about which test is testing what exactly. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239580 Forward-Port-Of: odoo/odoo#238560
This update fixes an issue where scanning a lot in a batch transfer incorrectly updated line quantities. Specifically, when a subline without a lot was scanned after a related line was fully processed, the quantity was not updated correctly. This change ensures that all lines are updated accurately when a lot is scanned, improving inventory tracking.
Original PR description
…f related line is complete ### Steps to reproduce: - In the settings enable Lots & Serials and Batch transfers - On the delivery operation types enable show reserved lots in the barcode tab - Create…
…f related line is complete ### Steps to reproduce: - In the settings enable Lots & Serials and Batch transfers - On the delivery operation types enable show reserved lots in the barcode tab - Create a storable product tracked by lots and put 10 x lot1 in stock - Create and confirm a delivery for 10 units - Create a batch transfer with your delivery - Process your transfer from the barcode app - Scan one unit of LOT1 and put in pack - Toggle sublines select the 0/9 subline without lots nor package - Scan LOT1 #### > The 1/1 LOT1 line with a pack is updated to 2/1 rather than the 0/9 ### Cause of the issue: Since e45249c2f6883d743a4e7d19e736c622e26a3d58 and 27bfb985a29e9f0abe94dec8a76bf6d08560fbc9 an override of the `_findLine` method has been introduced in `BarcodePickingBatchModel` to ensure that scanning a lot referenced by an already existing line of the batch transfer triggers an update of that line rather than an override of the lot of an other line. However, these lines should not priorities a completed line when there is line without a set lot. opw-5340865 Forward-Port-Of: odoo/enterprise#101817 Forward-Port-Of: odoo/enterprise#101611
This update fixes a problem where tax calculations were inaccurate due to using the wrong currency for rounding. Previously, tax amounts were rounded based on the transaction's currency, leading to discrepancies. Now, tax amounts are correctly rounded using the company's designated currency, ensuring accurate financial reporting.
Original PR description
Before this commit, the rounding of tax amounts in the company currency was incorrectly done using the currency of the transaction. This could lead to discrepancies in tax calculations. opw-5342628 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238170
This update fixes a potential user confusion during POS session closure. If a cashier doesn't select an employee, a notification is now displayed, guiding them to complete the process. This ensures a smoother and clearer experience for staff managing point-of-sale transactions.
Original PR description
After this commit, when attempting to close a POS session, if the logged-in employee is not selected, a notification will inform the user. This prevents confusion. opw-5244818 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#234741
This update resolves an issue where long text inputs within the Odoo Web Studio application would overflow, causing display problems. Now, long text is automatically truncated, ensuring a clean and usable interface for users. This improves the overall stability and user experience of the Web Studio.
Original PR description
**Before this commit:** Long input text overflowed and was not truncated. **After this commit:** Long input text is now properly truncated, preventing overflow. task-5240113 Forward-Port-Of: odoo/enterprise#99535
This update resolves an issue in Firefox where scheduling multiple messages would cause the application to freeze. The problem stemmed from a flawed date sorting algorithm within the chat functionality, leading to an infinite loop. The fix ensures consistent date sorting across browsers, preventing the freeze and improving stability.
Original PR description
**Steps to reproduce:** - (Firefox only) - Go to any record which uses a chatter (e.g. Contact) - Send message > Full composer > click the schedule message icon (lower right corner) - Schedule the…
**Steps to reproduce:**
- (Firefox only)
- Go to any record which uses a chatter (e.g. Contact)
- Send message > Full composer > click the schedule message icon (lower right corner)
- Schedule the message in the future and click send
- You should see now a post in the chatter indicating that the message will be sent
- Now click Send message and repeat the above steps again to schedule a second message
- Whole page will be freezed
- Reloading doesn't help
**Issue:**
Infinite loop in reactive callback on firefox.
The code gets stuck in
```js
for (const callback of [...callbacks]) {
clearReactivesForCallback(callback);
callback();
}
```
because of
```js
const sortProxy2 = reactive(recordProxy, function sortObserver() {
self.requestSort(record, fieldName);
});
this.fieldsSortProxy2.set(fieldName, sortProxy2);
```
which loops over `store._.ADD_QUEUE("sort", record, fieldName);`
(Forcing the `requestSort` only change the infinite loop into a recursion error)
The recomputation seems to be caused by a bad sorting here:
```js
this.scheduledMessages = Record.many("ScheduledMessage", {
sort: (a, b) => {
if (a.scheduled_date === b.scheduled_date) {
return a.id - b.id;
}
return a.scheduled_date < b.scheduled_date ? -1 : 1;
},
```
In the case both datetimes are equal the first condition doesn't properly catches it:
```
> a.scheduled_date - b.scheduled_date
> 0
> a.scheduled_date === b.scheduled_date
> false
> a.scheduled_date < b.scheduled_date
> false
> a.scheduled_date > b.scheduled_date
> false
```
Which make the ordering change on each sort iteration:
```
> Array [ "ScheduledMessage,14", "ScheduledMessage,13" ]
> recordsFullProxy.sort(func);
> Array [ "ScheduledMessage,13", "ScheduledMessage,14" ]
> recordsFullProxy.sort(func);
> Array [ "ScheduledMessage,14", "ScheduledMessage,13" ]
```
Chromium based browsers probably use a different sorting algorithm than Firefox, which seems to prevent the issue.
**Fix:**
Use `compareDatetime` to ensure the ordering is constant for the same datetime values.
opw-5367371
Forward-Port-Of: odoo/odoo#239624
Forward-Port-Of: odoo/odoo#239199This update fixes a technical issue that prevented users from saving changes to their Point of Sale configuration. The problem stemmed from an infinite loop when updating fiscal position settings, impacting the ability to manage POS settings. This fix ensures stable configuration updates.
Original PR description
**Steps To Reproduce:-** 1. Install point_of_sale in 17.0 2. Activate flexible taxes setting 3. set default fiscal position and after that archived that fiscal position. 4. try edit and save the POS…
**Steps To Reproduce:-**
1. Install point_of_sale in 17.0
2. Activate flexible taxes setting
3. set default fiscal position and after that archived that fiscal position.
4. try edit and save the POS config any operation below mentioned recursion error will come.
**Issue :-**
Due to archived record of fiscal postion is keep updating due to not satisfying this condition [config.default_fiscal_position_id.id not in config.fiscal_position_ids.ids](https://github.com/odoo/odoo/blob/62652ba3a7a90699e7aa8ff98e2d4980f1b43694/addons/point_of_sale/models/pos_config.py#L529) here ``config.fiscal_position_ids`` on this active filter is applying and it coming empty and going to update many2many field this process goes infinite due to archive fiscal position record
**FIX:-**
adding the check of active record fiscal position
```
File "/data/build/odoo/addons/point_of_sale/models/pos_config.py", line 442, in _set_fiscal_position
config.fiscal_position_ids = [(4, config.default_fiscal_position_id.id)]
File "/data/build/odoo/odoo/fields.py", line 1337, in __set__
records.write({self.name: write_value})
File "/data/build/odoo/addons/pos_restaurant/models/pos_config.py", line 52, in write
return super(PosConfig, self).write(vals)
File "/data/build/odoo/addons/point_of_sale/models/pos_config.py", line 420, in write
self.sudo()._set_fiscal_position()
File "/data/build/odoo/addons/point_of_sale/models/pos_config.py", line 442, in _set_fiscal_position
config.fiscal_position_ids = [(4, config.default_fiscal_position_id.id)]
File "/data/build/odoo/odoo/fields.py", line 1337, in __set__
records.write({self.name: write_value})
File "/data/build/odoo/addons/pos_restaurant/models/pos_config.py", line 52, in write
return super(PosConfig, self).write(vals)
File "/data/build/odoo/addons/point_of_sale/models/pos_config.py", line 420, in write
self.sudo()._set_fiscal_position()
File "/data/build/odoo/addons/point_of_sale/models/pos_config.py", line 442, in _set_fiscal_position
config.fiscal_position_ids = [(4, config.default_fiscal_position_id.id)]
File "/data/build/odoo/odoo/fields.py", line 1337, in __set__
records.write({self.name: write_value})
File "/data/build/odoo/addons/pos_restaurant/models/pos_config.py", line 52, in write
return super(PosConfig, self).write(vals)
File "/data/build/odoo/addons/point_of_sale/models/pos_config.py", line 420, in write
self.sudo()._set_fiscal_position()
File "/data/build/odoo/addons/point_of_sale/models/pos_config.py", line 442, in _set_fiscal_position
config.fiscal_position_ids = [(4, config.default_fiscal_position_id.id)]
File "/data/build/odoo/odoo/fields.py", line 1337, in __set__
records.write({self.name: write_value})
File "/data/build/odoo/addons/pos_restaurant/models/pos_config.py", line 52, in write
return super(PosConfig, self).write(vals)
File "/data/build/odoo/addons/point_of_sale/models/pos_config.py", line 418, in write
result = super(PosConfig, self).write(vals)
File "/data/build/odoo/odoo/models.py", line 3820, in write
field.write(self, value)
File "/data/build/odoo/odoo/fields.py", line 4287, in write
return self.write_batch([(records, value)])
File "/data/build/odoo/odoo/fields.py", line 4308, in write_batch
return self.write_real(records_commands_list, create)
File "/data/build/odoo/odoo/fields.py", line 4835, in write_real
old_relation = {record.id: set(record[self.name]._ids) for record in records}
File "/data/build/odoo/odoo/fields.py", line 4835, in <dictcomp>
old_relation = {record.id: set(record[self.name]._ids) for record in records}
File "/data/build/odoo/odoo/models.py", line 6007, in __getitem__
return self._fields[key].__get__(self, self.env.registry[self._name])
File "/data/build/odoo/odoo/fields.py", line 2824, in __get__
return super().__get__(records, owner)
File "/data/build/odoo/odoo/fields.py", line 1270, in __get__
return self.convert_to_record(value, record)
File "/data/build/odoo/odoo/fields.py", line 4199, in convert_to_record
corecords = corecords.filtered(Comodel._active_name).with_prefetch(prefetch_ids)
File "/data/build/odoo/odoo/models.py", line 5496, in filtered
return self.browse([rec.id for rec in self if func(rec)])
File "/data/build/odoo/odoo/models.py", line 5496, in <listcomp>
return self.browse([rec.id for rec in self if func(rec)])
File "/data/build/odoo/odoo/models.py", line 5493, in <lambda>
func = lambda rec: any(rec.mapped(name))
File "/data/build/odoo/odoo/models.py", line 5470, in mapped
recs = recs._fields[name].mapped(recs)
File "/data/build/odoo/odoo/fields.py", line 1299, in mapped
return self.convert_to_record_multi(vals, records)
File "/data/build/odoo/odoo/fields.py", line 942, in convert_to_record_multi
return [convert(value, record) for value, record in zip(values, records)]
File "/data/build/odoo/odoo/fields.py", line 942, in <listcomp>
return [convert(value, record) for value, record in zip(values, records)]
File "/data/build/odoo/odoo/models.py", line 5844, in __iter__
yield self.__class__(self.env, (id_,), self._prefetch_ids)
RecursionError: maximum recursion depth exceeded
```
**OPW** - 5208462
**UPG** - 3248441
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#239727
Forward-Port-Of: odoo/odoo#233358This update fixes an issue where users without assigned tasks weren't visible in the Gantt view when searching or filtering by assignee. The fix streamlined the search logic to ensure the correct user rows are displayed, improving the usability of the project task visualization.
Original PR description
**Steps to reproduce:** Go to Project Go to All Tasks. Switch to the Gantt view. Search for an assignee who has no tasks assigned. **Cause:** The method was adding multiple conditions for the same field because both if statements were being applied. This made the domain incorrect when searching for users or custom filter on user **Issue:** The searched user’s row did not appear in the gantt view if they had no tasks. **Fix:** Changed the second if to elif so only one condition is applied at a time, ensuring the correct domain is used and the user row is visible. Task-5076701 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239541 Forward-Port-Of: odoo/odoo#230319
This update ensures that user rows are always visible in the Gantt view, even when they don't have assigned tasks. Previously, users without tasks weren't displayed, and searching by assignee was inconsistent. Now, the Gantt view accurately reflects all users and their tasks, improving project management clarity.
Original PR description
**Before this commit:** When searching for an assignee in the gantt view, the corresponding row was not displayed if the user had no tasks assigned. Similarly, when applying a custom filter on the assignee also not working properly. **After this commit:** When searching or filtering by an assignee, the corresponding user row is now always visible in the gantt view, even if the user has no assigned tasks. Custom filters on assignee also work properly. task-5076701 Forward-Port-Of: odoo/enterprise#101855 Forward-Port-Of: odoo/enterprise#96531
This update fixes an issue where unscheduled shifts weren't immediately reflected in the Gantt view, requiring a page refresh. The fix ensures that changes to shift schedules are updated instantly, improving the accuracy and usability of the planning tool. This prevents confusion and ensures data consistency.
Original PR description
**Steps to reproduce:** Go to planning gantt view. Click on shift. Click on unschedule button on popover. **Issue:** When clicking on Unschedule button on a shift popover, sometimes the shift still appears and again clicking on that it cause missing error occured until the page is refreshed. **Cause:** The record wasn’t updating in the view after a shift was unscheduled, so the unscheduled shift was still showing. **Fix:** Modified the method to reload the model and notify the view immediately after calling action_unschedule, ensuring shifts reflect the latest server state without requiring a manual refresh. task-5075381 Forward-Port-Of: odoo/enterprise#97108
This update corrects a potential issue where an update failure could cause the IoT Box to incorrectly believe it's up-to-date. By retaining the original branch name during update attempts, the system avoids this misinterpretation and ensures accurate status checks.
Original PR description
We used to renamed the Odoo branch name before running the update script in order to get the target branch name easily inside it. Issue is if for any reason the update fails, when the IoT Box will restart, the branch name will be the target one, so it will assume it's up to date. Task: 5407662 Forward-Port-Of: odoo/odoo#239758 Forward-Port-Of: odoo/odoo#239508
A minor bug in the code's transpilation process was causing the debugger to display incorrectly in test files. This update ensures that whitespace is preserved when converting unnamed imports to require statements, resolving this display issue. This ensures consistent debugging behavior in our test environment.
Original PR description
Steps to reproduce
==================
- Create a js file with a blank line followed by an unnamed import
```js
import { mailModels } from "@mail/../tests/mail_test_helpers";
import "@account_accountant/components/bank_reconciliation/list_view/list_view_many2one_multi_edit";
import "@account_accountant/components/bank_reconciliation/list_view/list";
debugger;
```
- Open the devtools
=> The debugger will be off by one line
Cause of the issue
==================
When remplacing unnamed imports by a require statement, the leading whitespace was not preserved.
Solution
========
We add back the captured space. This is done for every other replacement.
Forward-Port-Of: odoo/odoo#239531