Daily updates from Odoo
Wednesday, April 2, 2025
44 changes
22 changes
Enhancements to existing features
The subscription MRR log now makes the effective date visible with guidance while keeping it optional in the list view. Users can also filter for non-invoiced entries, making it easier to identify revenue log items that still need attention.
Original PR description
- Made the effective date field visible with a helper message - Set the effective date field as optional in the MRR log list view. - Added a filter for "Non Invoiced" entries based on the effective date. task-4633018
Odoo Studio now lets users edit placeholder text for many-to-many fields from the editor sidebar. The sidebar also hides a confusing placeholder option for number and monetary fields where it was not useful, making form customization clearer.
Custom filters in spreadsheets and documents now account for user avatars, making filter selections easier to recognize visually. The related automated checks and guided walkthroughs were updated so this improved display remains reliable.
Original PR description
*: documents_spreadsheet, spreadsheet_edition This commit adapts some tests and a tour to work with avatars due to https://github.com/odoo/odoo/pull/203726 task-4613150
This update aligns several enterprise apps with a newer way of loading session information in the background. It helps keep accounting, IoT, knowledge, mail, and studio features consistent with the main platform while reducing maintenance risk.
Original PR description
\* = account_accountant, iot, knowledge, test_mail_enterprise Enterprise counter-part. task-4676536 https://github.com/odoo/odoo/pull/194391
Resolved issues and error corrections
The Payroll Advice report layout was adjusted to improve readability and presentation. Text alignment, spacing, and signature placement are now cleaner, helping businesses produce more professional payroll documents.
Original PR description
Steps: - Generate the Payroll Advice report. - Observe content alignment, spacing issues, and signature positioning. Issues: - Some text elements had inconsistent spacing and alignment affecting readability. Fix: - Improved text alignment and spacing for better readability. - Repositioned certain things as per requirement to enhance the overall layout. Task - 4642759
Code cleanup and technical improvements
Odoo Studio now uses the standard mixed checkbox state instead of a custom visual workaround. This keeps the interface behavior easier to maintain while preserving the same user experience for configuring view rules.
Original PR description
This commit takes advantage of the "indeterminate" state of the CheckBox component (cf. `input[type=checkbox]:indeterminate`) instead of emulating it with classes.
Miscellaneous changes
The committed amount was incorrect because the budget report query is comparing a `datetime` column (purchase_order.date_order) to a `date` column (budget_line.date_to). This is wrong because `'03-31-2025 21:00:00' <= '02-31-2025' == False` This made committed amounts under-reported whenever relevant activity happened on the final day of the budget. Steps to reproduce: - It’s easier to follow by watching this [video](https://drive.google.com/file/d/1SNTUJpiQpcET5pBcu-8PpD3Aw7UHALVD/view
Original PR description
The committed amount was incorrect because the budget report query is comparing a `datetime` column (purchase_order.date_order) to a `date` column (budget_line.date_to). This is wrong because `'03-31-2025 21:00:00' <= '02-31-2025' == False` This made committed amounts under-reported whenever relevant activity happened on the final day of the budget. Steps to reproduce: - It’s easier to follow by watching this [video](https://drive.google.com/file/d/1SNTUJpiQpcET5pBcu-8PpD3Aw7UHALVD/view?usp=drive_link) - Create an analytic account - Create a new budget line with start and end dates set to today - Assign the analytic account as internal and link it to a budget - Go to Purchases > Create a new Request for Quotation - Use the analytic account in the analytical distribution - Confirm the order - Go back to the budget line: the committed amount will incorrectly show 0 OPW-4624672 Forward-Port-Of: odoo/enterprise#82010
Description of the issue this commit addresses: When paying taxes via the "Pay tax: <period>" button on the miscellaneous journal of the accounting dashboard, a traceback can be encountered. --- Steps to reproduce: 1. Install l10n_nl_reports_vat_pay_wizard. 2. Remove the company vat number. 3. Create and post a closing entry for a period with some tax amount. 4. Go to the accounting dashboard. 5. Click the "Pay tax: <period> in the miscellaneous journal's box. 6. A traceback is
Original PR description
Description of the issue this commit addresses: When paying taxes via the "Pay tax: <period>" button on the miscellaneous journal of the accounting dashboard, a traceback can be encountered. --- Steps to reproduce: 1. Install l10n_nl_reports_vat_pay_wizard. 2. Remove the company vat number. 3. Create and post a closing entry for a period with some tax amount. 4. Go to the accounting dashboard. 5. Click the "Pay tax: <period> in the miscellaneous journal's box. 6. A traceback is raised. --- Desired behavior after this commit is merged: Instead of a traceback, a UserError explains why this is not possible to the user. --- task-4677746 Forward-Port-Of: odoo/enterprise#82625
Before this commit, attempting to sell a combo product resulted in an error due to a missing tax configuration. However, combo products are not supposed to have taxes assigned, leading to an unintended issue. opw-4555159 Forward-Port-Of: odoo/enterprise#82119 Forward-Port-Of: odoo/enterprise#80571
Original PR description
Before this commit, attempting to sell a combo product resulted in an error due to a missing tax configuration. However, combo products are not supposed to have taxes assigned, leading to an unintended issue. opw-4555159 Forward-Port-Of: odoo/enterprise#82119 Forward-Port-Of: odoo/enterprise#80571
# HOW TO REPRODUCE: - Create products FNS & CMP - Set available quantity of CMP to 2 - Create MO of 1 FNS and 2 CMP -> Confirm - Open MO in barcode - Set FNS quantity to 1 - Set CMP quantity to 1 (1/2 of the demand) -> Produce MO => The CMP move has 2 lines of 1 unit, so 2 unit have been consumed instead of the 1 put on the barcode. https://github.com/user-attachments/assets/237c81bc-f342-4293-bc76-008b5c7cf876 OPW-4517284 Forward-Port-Of: odoo/enterprise#82664 Forward-Port-Of
Original PR description
# HOW TO REPRODUCE: - Create products FNS & CMP - Set available quantity of CMP to 2 - Create MO of 1 FNS and 2 CMP -> Confirm - Open MO in barcode - Set FNS quantity to 1 - Set CMP quantity to 1 (1/2 of the demand) -> Produce MO => The CMP move has 2 lines of 1 unit, so 2 unit have been consumed instead of the 1 put on the barcode. https://github.com/user-attachments/assets/237c81bc-f342-4293-bc76-008b5c7cf876 OPW-4517284 Forward-Port-Of: odoo/enterprise#82664 Forward-Port-Of: odoo/enterprise#81343
Forward-Port-Of: odoo/enterprise#82441 Forward-Port-Of: odoo/enterprise#82412
Original PR description
Forward-Port-Of: odoo/enterprise#82441 Forward-Port-Of: odoo/enterprise#82412
When automatically sending the receipt in a DE PoS, there was 2 receipt sent to the printer, one of them was empty and showing an error. Steps to reproduce: ------------------- * Setup a fiskaly PoS * Activate the automatic receipt printing * Open PoS and make an order * Pay the order > Observation: Two receipt are sent to the printer, one of them is empty and showing an error. Why the fix: ------------ We were calling the `super` method twice. This was causing the receipt to be p
Original PR description
When automatically sending the receipt in a DE PoS, there was 2 receipt sent to the printer, one of them was empty and showing an error. Steps to reproduce: ------------------- * Setup a fiskaly PoS * Activate the automatic receipt printing * Open PoS and make an order * Pay the order > Observation: Two receipt are sent to the printer, one of them is empty and showing an error. Why the fix: ------------ We were calling the `super` method twice. This was causing the receipt to be printed twice. We now call the `super` method only once. opw-4520201 Forward-Port-Of: odoo/enterprise#82127 Forward-Port-Of: odoo/enterprise#81771
Amazon SP-API is dropping support for the `POST_INVENTORY_AVAILABILITY_DATA` feed type. This was previously used in Odoo to synchronize the stock level with Amazon. This commit upgrades the feed api to use the new `JSON_LISTINGS_FEED` as a replacement. This new feed needs new informations that were not stored previously. Since this is a fix targeting stable versions of Odoo, it was decided to store this new inforamtion as a json dictionary in the `amazon.offer.amazon_feed_ref` field.
Original PR description
Amazon SP-API is dropping support for the `POST_INVENTORY_AVAILABILITY_DATA` feed type. This was previously used in Odoo to synchronize the stock level with Amazon. This commit upgrades the feed api to use the new `JSON_LISTINGS_FEED` as a replacement. This new feed needs new informations that were not stored previously. Since this is a fix targeting stable versions of Odoo, it was decided to store this new inforamtion as a json dictionary in the `amazon.offer.amazon_feed_ref` field. task-3820591 Forward-Port-Of: odoo/enterprise#82665 Forward-Port-Of: odoo/enterprise#78897
The `load templates` button was shown for portal users even though no template was accessible to them. This commit hides the button for portal users. Explanation: In the `knowledge.WysiwygArticleHelper` xml template, `isPortalUser` is used without having being instantiated in its related Component. Commit where `knowledge_article_html_field.js` was removed (previous scope for `isPortalUser` property for this feature): https://github.com/odoo/enterprise/commit/1e0f2950d613d6cd82d8889
Original PR description
The `load templates` button was shown for portal users even though no template was accessible to them. This commit hides the button for portal users. Explanation: In the `knowledge.WysiwygArticleHelper` xml template, `isPortalUser` is used without having being instantiated in its related Component. Commit where `knowledge_article_html_field.js` was removed (previous scope for `isPortalUser` property for this feature): https://github.com/odoo/enterprise/commit/1e0f2950d613d6cd82d8889fb07bc04d6c91c466 Commit where `wysiwyg_article_helper.js` was introduced without the `isPortalUser` property (oversight): https://github.com/odoo/enterprise/commit/e001efc750d25d5dfcc681e42adf7a46edc7f37b task-4687833 Forward-Port-Of: odoo/enterprise#82689
### Steps to reproduce: - Install "l10n_mx_edi" and switch to a Mexican company - In Accounting > Configuration > Taxes activate the tax "1.25 WH" - Create an invoice with one line with a price of $50 and the tax "1.25 WH" - Go to the customer of the invoice - Sale & Purchase > Fiscal information and activate "No Tax Breakdown" - Confirm the invoice and Send it to CFDI - Traceback ### Cause: This [commit](https://github.com/odoo/enterprise/pull/75381/commits/3f2e9437439fd6f987a1381647
Original PR description
### Steps to reproduce: - Install "l10n_mx_edi" and switch to a Mexican company - In Accounting > Configuration > Taxes activate the tax "1.25 WH" - Create an invoice with one line with a price of…
### Steps to reproduce: - Install "l10n_mx_edi" and switch to a Mexican company - In Accounting > Configuration > Taxes activate the tax "1.25 WH" - Create an invoice with one line with a price of $50 and the tax "1.25 WH" - Go to the customer of the invoice - Sale & Purchase > Fiscal information and activate "No Tax Breakdown" - Confirm the invoice and Send it to CFDI - Traceback ### Cause: This [commit](https://github.com/odoo/enterprise/pull/75381/commits/3f2e9437439fd6f987a13816473da2bd5a26953d) added a part in the code to prevent rounding error when specific discounts are applied which makes the base have a 5 as third digit. When having a withholding tax and selecting "No Tax Breakdown" on the partner, the base amount will be decreased by the amount of the tax. If this amount has a 5 as third digit, a difference is detected here: `delta_discount = currency.round(sum(x['importe'] for x in line_values_list)) - cfdi_values['subtotal']` because: - `x['importe']` is 49.375 which rounds up to 49.38 - `cfdi_values['subtotal']` is 49.37 because the tax was rounded up from 0.625 to 0.63 The code will then try to find lines with discounts but there are none so it raises an error at the `max()` function which is given nothing. ### Solution: Adding `default=None` to `max()` so it doesn't crash. But the rounding issue still needs to be fixed. The fix is to select a line with more than 2 digits and to remove the difference with its rounded value. This ensures that the resulting value stay in the same 2-digit range, preventing error CFDI40167, and that the sum of "importe" is rounded down. opw-4528766 Forward-Port-Of: odoo/enterprise#81563
To improve readability and performance, partners with a zero initial balance are now excluded from the partner ledger reports. task-4578612 Forward-Port-Of: odoo/enterprise#82647 Forward-Port-Of: odoo/enterprise#81642
Original PR description
To improve readability and performance, partners with a zero initial balance are now excluded from the partner ledger reports. task-4578612 Forward-Port-Of: odoo/enterprise#82647 Forward-Port-Of: odoo/enterprise#81642
https://www.awesomescreenshot.com/image/53256805?key=71bd00e266f6b08236b3b490b3383b78 How to reproduce: - In the Social app, enable DEMO mode from the configuration settings. - Now click POSTS from the menuitems available. - Click any of the post which has been posted on about 4 accounts. - Scroll down to find the POSTS section, where in you will see that the posts are aligned vertically. Issue: - By default the `<group>` tag makes renders as grid view with 2 columns. Fix: - We us
Original PR description
https://www.awesomescreenshot.com/image/53256805?key=71bd00e266f6b08236b3b490b3383b78 How to reproduce: - In the Social app, enable DEMO mode from the configuration settings. - Now click POSTS from the menuitems available. - Click any of the post which has been posted on about 4 accounts. - Scroll down to find the POSTS section, where in you will see that the posts are aligned vertically. Issue: - By default the `<group>` tag makes renders as grid view with 2 columns. Fix: - We use `colspan` to merge the columns. Task-4184968 Forward-Port-Of: odoo/enterprise#82413
It was not planned to now show this panel to portal users. Follow-up of 0d904521 / task 4318322. Task-4687497 Forward-Port-Of: odoo/enterprise#82666
Original PR description
It was not planned to now show this panel to portal users. Follow-up of 0d904521 / task 4318322. Task-4687497 Forward-Port-Of: odoo/enterprise#82666
There is a special case where users can make invoices "B" to foreign customers. However, we are not allowing to create credit or debit notes "B" to adjust those invoices. This PR adds the possibility to create "B" credit and debit notes (code "6" and "7" respectively) for foreign customers. _**Behavior before this PR:**_ An error message like the following was raised when validating the credit/debit note on AFIP: ``` Esto es lo que obtenemos: Observaciones de validación de la AFIP: *
Original PR description
There is a special case where users can make invoices "B" to foreign customers. However, we are not allowing to create credit or debit notes "B" to adjust those invoices. This PR adds the possibility…
There is a special case where users can make invoices "B" to foreign customers. However, we are not allowing to create credit or debit notes "B" to adjust those invoices. This PR adds the possibility to create "B" credit and debit notes (code "6" and "7" respectively) for foreign customers. _**Behavior before this PR:**_ An error message like the following was raised when validating the credit/debit note on AFIP: ``` Esto es lo que obtenemos: Observaciones de validación de la AFIP: * Code 10015: Para facturas B (CbteDesde igual a CbteHasta) mayor o igual a $417288, DocTipo debe ser uno de los valores devueltos por el método FEParamGetTiposDoc distinto a 99 y DocNro deberá ser mayor a 0. * Code 10015: Factura B (CbteDesde igual a CbteHasta), DocTipo: 80, DocNro 0 no se encuentra registrado en los padrones de AFIP y no corresponde a una cuit pais. ``` This happened because we have to send the "CUIT país" (vat number for the foreign country) as the customer vat so the document can be validated on AFIP. For invoices, we had the logic in the code to look for the country vat and set it in the XML we send to the organism, so I just added the related documents codes so they follow the same flow. **_Behavior after this PR:_** The credit/debit note should be validated on AFIP. **_Steps to reproduce the error:_** 1) Install l10n_ar_edi 2) Set a testing enviroment 3) Create an invoice "B" to a foreign customer. This customer won't have any VAT set. 4) Validate the invoice 5) Create a credit note from the invoice that you created before. 6) Try to validate it, and check that an error message is raised. Forward-Port-Of: odoo/enterprise#80169
In this commit, `position` has been replaced with `tooltipPosition`, as explained in the commit message. https://github.com/odoo/enterprise/commit/b7fc47fec39885ed1f9f99040ceaabefa539bc7b Forward-Port-Of: odoo/enterprise#82672
Original PR description
In this commit, `position` has been replaced with `tooltipPosition`, as explained in the commit message. https://github.com/odoo/enterprise/commit/b7fc47fec39885ed1f9f99040ceaabefa539bc7b Forward-Port-Of: odoo/enterprise#82672
In some cases, Amazon can confirm the delivery of a FBM order before the user confirm the picking. In these cases, 2 problems arise: - The synchronization of the picking will fail because Amazon will return an error, since the picking was already delivered. - If the user doesn't fill the Amazon required fields, there will be a user error, even if the carrier reference and tracking numbers are already available in Amazon's backend. To solve this, as we know when an order was successfully deliv
Original PR description
In some cases, Amazon can confirm the delivery of a FBM order before the user confirm the picking. In these cases, 2 problems arise: - The synchronization of the picking will fail because Amazon will return an error, since the picking was already delivered. - If the user doesn't fill the Amazon required fields, there will be a user error, even if the carrier reference and tracking numbers are already available in Amazon's backend. To solve this, as we know when an order was successfully delivered, we won't consider these pickings as being needed for Amazon any more. task-4524195 Forward-Port-Of: odoo/enterprise#78188
**Issue** When mergring two records with a chatter (e.g. Tasks), no log note appears in the chatter of the destination or source records. **Cause** The template changed modules when `data_cleaning` and `data_merge` were merged in 4fc497861fbefee7f4761c3341a3c2bd289edb31 opw-4513322 Forward-Port-Of: odoo/enterprise#82468 Forward-Port-Of: odoo/enterprise#81136
Original PR description
**Issue** When mergring two records with a chatter (e.g. Tasks), no log note appears in the chatter of the destination or source records. **Cause** The template changed modules when `data_cleaning` and `data_merge` were merged in 4fc497861fbefee7f4761c3341a3c2bd289edb31 opw-4513322 Forward-Port-Of: odoo/enterprise#82468 Forward-Port-Of: odoo/enterprise#81136
22 changes
Resolved issues and error corrections
This fixes an issue in Point of Sale where using Arabic could format dates with Arabic numerals, causing an error. The update keeps the date format compatible so stores using Arabic can continue operating without disruption.
Original PR description
When the Arabic language was selected, an error occurred due to the write date being formatted with Arabic numerals. This commit ensures that Latin digits are used in the date format, preventing the error and ensuring compatibility. opw-4654484 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes several unstable automated walkthroughs used to validate website, project, point of sale, and payment flows. By waiting for pages, images, forms, and order transfers to finish properly, it reduces false test failures and helps keep releases more dependable.
Original PR description
In this commit, we fix multiple indeterministic tours: - website/static/tests/tours/media_dialog.js Add a step to ensure all images are loaded before exiting the tour to avoid message: "CORS is…
In this commit, we fix multiple indeterministic tours: - website/static/tests/tours/media_dialog.js Add a step to ensure all images are loaded before exiting the tour to avoid message: "CORS is misconfigured on the API server, image will be treated as non-dynamic." - project/static/tests/tours/project_task_history.js Use stepUtils.saveForm to ensure form is well saved before continue. - website/static/tests/tours/snippets_all_drag_and_drop.js Remove a step that can cause undeterministic failure during tours. - pos_restaurant/static/tests/tours/pos_restaurant_tour.js Add a delay when transfering the order. - website/static/tests/tours/page_manager.js Add a last step to ensure reloading is done before exiting the tour to avoid "Error received after termination: TypeError: Failed to fetch" error. - website/static/tests/tours/html_editor.js Add steps to wait the iframe reload. 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
The mobile live chat leave warning dialog now appears above the ellipsis menu instead of being partially covered. This makes the confirmation message easier to read and helps users avoid accidentally leaving a chat.
Original PR description
**Current behavior before PR:** prior to this PR ellipsis was overlapping the leave warning dialog-box. **Desired behavior after PR is merged:** now issue was resolved by adding z-index to dialog-box higher then ellipsis. task-4630702 before PR:  after PR:  --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users paying Dutch VAT from the accounting dashboard will now see a clear explanation if the company VAT number is missing. This prevents an unexpected crash and helps users understand what must be corrected before paying taxes.
Original PR description
Description of the issue this commit addresses: When paying taxes via the "Pay tax: <period>" button on the miscellaneous journal of the accounting dashboard, a traceback can be encountered. --- Steps to reproduce: 1. Install l10n_nl_reports_vat_pay_wizard. 2. Remove the company vat number. 3. Create and post a closing entry for a period with some tax amount. 4. Go to the accounting dashboard. 5. Click the "Pay tax: <period> in the miscellaneous journal's box. 6. A traceback is raised. --- Desired behavior after this commit is merged: Instead of a traceback, a UserError explains why this is not possible to the user. --- task-4677746
Features or functions removed from Odoo
This change removes a standalone markup-related test that was added for a feature that was never fully completed. It keeps the test suite aligned with the actual product behavior and avoids maintaining checks for unused functionality.
Original PR description
This reverts commit 54b8a41bb6f61555511714ce7ff476132b97f45d. The feature was never fully implemented
Code cleanup and technical improvements
This draft pull request appears to be an internal code restructuring effort, but no file or commit details were provided. Based on the title, it is unlikely to introduce direct business-facing changes at this stage.
Miscellaneous changes
When viewing sale report for POS orders, the gross weight number will be off by a factor of how much larger/smaller the UOM ratio is compared to the base. For example, if we sell 1 qty of product with a weight of 25kg and a UOM of 25kg (25 * 1kg), the gross weight field will be 1 * 25kg * 25kg or 625kg instead of the expected 1 * 25kg or 25kg. This fix removes the UOM factor from being taken into account when calculating gross weight for POS orders. This is a valid solution because if we
Original PR description
When viewing sale report for POS orders, the gross weight number will be off by a factor of how much larger/smaller the UOM ratio is compared to the base. For example, if we sell 1 qty of product…
When viewing sale report for POS orders, the gross weight number will be off by a factor of how much larger/smaller the UOM ratio is compared to the base. For example, if we sell 1 qty of product with a weight of 25kg and a UOM of 25kg (25 * 1kg), the gross weight field will be 1 * 25kg * 25kg or 625kg instead of the expected 1 * 25kg or 25kg. This fix removes the UOM factor from being taken into account when calculating gross weight for POS orders. This is a valid solution because if we treat 'SUM(p.weight * l.product_uom_qty / u.factor * u2.factor)' as the ground truth from sale report for sale orders, the '/ u.factor * u2.factor' portion of the calculation will cancel out to 1 for POS orders. This is because the only time 'u2.factor/u.factor' is not 1 for sale orders is when the product template's UOM factor is different from the sale order line's UOM factor. Since we can not change the UOM of pos order lines, the pos order line's factor will always be the same as the product template's therefore 'u2.factor / u.factor' for pos orders will always be 1 and can be ignored. To reproduce error on blank DB: 1) For a product, change its UOM to a UOM with a ratio not equal to 1 2) For the same product, change its weight in the inventory tab to a number not equal to 0 3) In POS make a sale with this product and confirm the order 4) Check the gross weight of the product just sold through POS by going to sales->reporting->list view and adding gross weight to the view through studio opw-4452892 Forward-Port-Of: odoo/odoo#203849 Forward-Port-Of: odoo/odoo#203144
Currently when the user upload an e-invoice in compatible format, accounting information will be extracted to automatically create the bill and associated records. While creating the parnter, however, only basic information is filled in (name, vat, email, phone, country), leaving out the address Steps to reproduce: - Import an xml bill with complete partner info Issue: Only some partner fields are imported opw-4488308 Forward-Port-Of: odoo/odoo#203811 Forward-Port-Of: odoo/odoo#2017
Original PR description
Currently when the user upload an e-invoice in compatible format, accounting information will be extracted to automatically create the bill and associated records. While creating the parnter, however, only basic information is filled in (name, vat, email, phone, country), leaving out the address Steps to reproduce: - Import an xml bill with complete partner info Issue: Only some partner fields are imported opw-4488308 Forward-Port-Of: odoo/odoo#203811 Forward-Port-Of: odoo/odoo#201760
Steps to reproduce: - go to a blog post with several paragraph - edit translations Issue 1: - select several paragraph completely and use the translate tool - insert the translation => the translation are not inserted Issue 2: - select 3 paragraphs but don't start at the beginning or end of the text - insert translation - see that all translations is inserted at end of paragraph 1, paragraph 2 is emptied and paragraph 3 selected part is removed - save => paragraph 1 and 2 a
Original PR description
Steps to reproduce: - go to a blog post with several paragraph - edit translations Issue 1: - select several paragraph completely and use the translate tool - insert the translation => the…
Steps to reproduce: - go to a blog post with several paragraph - edit translations Issue 1: - select several paragraph completely and use the translate tool - insert the translation => the translation are not inserted Issue 2: - select 3 paragraphs but don't start at the beginning or end of the text - insert translation - see that all translations is inserted at end of paragraph 1, paragraph 2 is emptied and paragraph 3 selected part is removed - save => paragraph 1 and 2 are deleted (so we show original lang value), selected part of paragraph 3 is removed Why: In the blog post content, we are inside a "blog.post().content" editable field, this allows the editor to select several translations nodes which will work wrongly with the editor because translation mode only expect to change the content of translation nodes. The first paragraph translation is saved empty because the editor is cloning the node with the same "data-oe-translation-source-sha" because we are inserting several paragraphs inside it. Fix: in translation mode, make the editable node of html fields around translation nodes uneditable so we can't select several translation nodes thanks to how browser handle selection and content editable. Note: the added test step is very light, because in javascript it is programmatically possible to select 2 separate content editable. At the step that is added in the tour, with the fix it is not possible to select both the H1 and P nodes. opw-4221993 opw-4482717 pr note: opw-4221993 could possibly solved by this fix too (the video reproduction seemed to be about a bulleted list but I could not reproduce, and the original report video is deleted) Forward-Port-Of: odoo/odoo#203859 Forward-Port-Of: odoo/odoo#197511
Steps to reproduce: - Install the Website. - Enter edit mode. - Click on the "Add to Cart Button" snippet in the snippet menu. - Bug: The message displayed in the dialog is "Do you want to install the Add to Cart Button app?". This is incorrect; the app name should be the module name instead of the snippet name. This commit displays the module name as expected and slightly enhances the design of the dialog (line break before the link + add an arrow icon before the link to the app info).
Original PR description
Steps to reproduce: - Install the Website. - Enter edit mode. - Click on the "Add to Cart Button" snippet in the snippet menu. - Bug: The message displayed in the dialog is "Do you want to install the Add to Cart Button app?". This is incorrect; the app name should be the module name instead of the snippet name. This commit displays the module name as expected and slightly enhances the design of the dialog (line break before the link + add an arrow icon before the link to the app info). #### Preview | Before | |--------| |  | | After | |--------| |  | task-4434981 Forward-Port-Of: odoo/odoo#201873 Forward-Port-Of: odoo/odoo#201757
Fixing up commit 6b4c35fbc47ef1d23c1991f06de09072e0072085 which introduced non stable changes sentry-6489805050 Forward-Port-Of: odoo/odoo#204347
Original PR description
Fixing up commit 6b4c35fbc47ef1d23c1991f06de09072e0072085 which introduced non stable changes sentry-6489805050 Forward-Port-Of: odoo/odoo#204347
**Current behavior before PR:** - Rotating a cropped image reset the cropper to cover the entire image. - When saving the record, all attributes not in the safe_attrs list were sanitized. As a result, if the record contained a cropped image, its crop-related attributes were also sanitized. Consequently, when the cropper was reopened, the container displayed the entire image instead of the cropped version. **Desired behavior after PR is merged:** - The cropper now retains
Original PR description
**Current behavior before PR:** - Rotating a cropped image reset the cropper to cover the entire image. - When saving the record, all attributes not in the safe_attrs list were sanitized. As a result, if the record contained a cropped image, its crop-related attributes were also sanitized. Consequently, when the cropper was reopened, the container displayed the entire image instead of the cropped version. **Desired behavior after PR is merged:** - The cropper now retains its size when rotating a cropped image, maintaining the original crop area. - Image attributes such as data-width, data-height, data-scale-x, data-scale-y, data-x, and data-y are no longer sanitized during the save process. This ensures that when the cropper is reopened for a cropped image, the container correctly displays only the cropped portion of the image, rather than the entire image. task-4290693 Forward-Port-Of: odoo/odoo#203810 Forward-Port-Of: odoo/odoo#186864
[FIX] web_editor: translate paragraph links as a whole. Steps to reproduce: 1. Enable a second language in the website (e.g., French). 2. Add a "Text" block (in edit mode) > Save the page. 3. Translate a text paragraph to french > Save. 4. In edit mode again, add a link to a word in the paragraph > Save. 5. The translation in French is lost, and sometimes the whole French translation is used for the text before or after the link. This is actually a limitation in the tran
Original PR description
[FIX] web_editor: translate paragraph links as a whole. Steps to reproduce: 1. Enable a second language in the website (e.g., French). 2. Add a "Text" block (in edit mode) > Save the page. 3.…
[FIX] web_editor: translate paragraph links as a whole. Steps to reproduce: 1. Enable a second language in the website (e.g., French). 2. Add a "Text" block (in edit mode) > Save the page. 3. Translate a text paragraph to french > Save. 4. In edit mode again, add a link to a word in the paragraph > Save. 5. The translation in French is lost, and sometimes the whole French translation is used for the text before or after the link. This is actually a limitation in the translation implementation. If we initially have `text_1_en text_2_en text_3_en` translated to French this way: terms en_US: `["text_1_en text_2_en text_3_en"]` terms fr_BE: `["text_1_fr text_2_fr text_3_fr"]` After adding a link: `text_1_en<a...>text_2_en</a>text_3_en`, and since the links are not translated as a whole, we should get: terms en_US: `["text_1_en", "text_2_en", "text_3_en"]` terms fr_BE: `["text_1_fr text_2_fr text_3_fr"]` Which means the current translation will be lost, and the result will depend on the outcome of `get_close_matches()`. Which explains why when the link is added to the first words of the paragraph, the system still maps the rest of the paragraph to its "full old translation". The goal of this commit is to make this behavior less aggressive by forcing the links added in paragraphs [1] to be translated as a whole. This way, the `get_close_matches()` will map the new content with a link to its old translation (without a link), and then, the user can set the link in the "the most meaningful part of the translation" in the translate mode. [1]: We should use the "translate as a whole" feature carefully with links, since there are already some situations where it's causing issues (see the fix in [2]). So we only force them inside paragraphs. [2]: https://github.com/odoo/odoo/commit/9bd60ca93510e410a0136b8b433f596330900593 opw-3984439 Forward-Port-Of: odoo/odoo#204207 Forward-Port-Of: odoo/odoo#179167
Steps to reproduce: - Create a copy of the CRM lead dashboard - Go to the duplicated dashboard, change some global filter - Go to the CRM lead original dashboard => The global filter has the same value as the one in the duplicated dashboard - Try to change a global filter => The data is filtered, but nothing change in the global filter topbar This was caused by a faulty t-key, which was based on the filter id, which is not unique across dashboards. This commit changes the t-key to be base
Original PR description
Steps to reproduce: - Create a copy of the CRM lead dashboard - Go to the duplicated dashboard, change some global filter - Go to the CRM lead original dashboard => The global filter has the same value as the one in the duplicated dashboard - Try to change a global filter => The data is filtered, but nothing change in the global filter topbar This was caused by a faulty t-key, which was based on the filter id, which is not unique across dashboards. This commit changes the t-key to be based on the dashboard id and the filter id, so that the filter is unique across dashboards. Task: 4636672 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#204403 Forward-Port-Of: odoo/odoo#204110
- With a IT company, create a vendor bill with a line with the tax 22% G RC and set l10n_it_payment_method to MP01. - Export the bill with "Send Tax Integration". - Import the xml generated. The l10n_it_payment_method field is not set to MP01. In the l10n_it_edi_import_invoice, the l10n_it_payment_method field was not imported opw-4646816 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I
Original PR description
- With a IT company, create a vendor bill with a line with the tax 22% G RC and set l10n_it_payment_method to MP01. - Export the bill with "Send Tax Integration". - Import the xml generated. The l10n_it_payment_method field is not set to MP01. In the l10n_it_edi_import_invoice, the l10n_it_payment_method field was not imported opw-4646816 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#203232
### Description of the issue/feature this PR addresses: There is no need to print the tax detail information when the invoice's currency is not the same as the company's currency. This change removes that part of the report, and it only affects the AR Invoice Legal report. This functionality was added to the account module and affects all the invoice reports, but we do not want them to be in the AR legal report. For more information about the extra tax detail in the company's currency, you
Original PR description
### Description of the issue/feature this PR addresses: There is no need to print the tax detail information when the invoice's currency is not the same as the company's currency. This change removes…
### Description of the issue/feature this PR addresses: There is no need to print the tax detail information when the invoice's currency is not the same as the company's currency. This change removes that part of the report, and it only affects the AR Invoice Legal report. This functionality was added to the account module and affects all the invoice reports, but we do not want them to be in the AR legal report. For more information about the extra tax detail in the company's currency, you can check this commit https://github.com/odoo/odoo/commit/8823e01040f9522947e5d11c7312d09c50867cc4 ### Current behavior before PR:  ### Desired behavior after PR is merged:  LATAM task 1329 / Adhoc ticket 88609 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#201084
__Current behavior before commit:__ Sometimes when a Worldline terminal makes a payment with Edenred or Sodexo, it creates a ticket with special ascii characters like `0x0E` that are not supposed to be printed. Some of those characters make the [`createImage`][1] method throw an error with the `onerror` Event. __Description of the fix:__ Added the `sanitizeNodeText` function to remove all problematic ascii characters that should not be printed anyway. Added a test to make sure `htmlToCanva
Original PR description
__Current behavior before commit:__ Sometimes when a Worldline terminal makes a payment with Edenred or Sodexo, it creates a ticket with special ascii characters like `0x0E` that are not supposed to be printed. Some of those characters make the [`createImage`][1] method throw an error with the `onerror` Event. __Description of the fix:__ Added the `sanitizeNodeText` function to remove all problematic ascii characters that should not be printed anyway. Added a test to make sure `htmlToCanvas` can handle all ascii characters without crashing. opw-4322339 [1]:https://github.com/odoo/odoo/blob/a98e802976f6798f3aea07231a366fbcd8002ce2/addons/point_of_sale/static/src/app/utils/html-to-image.js#L217 Forward-Port-Of: odoo/odoo#197134 Forward-Port-Of: odoo/odoo#195004
Currently, An error occurs when quick create an hr leave (Time Off Request). Step to produce: - Install the `hr_holidays` module. - Enable debug mode. - Open Settings / Technical / Resource / Resource Time Off, Create a new record, and attempt to quick create a 'Time Off Request'. Traceback: ``` File "/home/odoo/odoo/community/odoo/http.py", line 1788, in _serve_db return service_model.retrying(self._serve_ir_http, self.env) File "/home/odoo/odoo/community/odoo/service/m
Original PR description
Currently, An error occurs when quick create an hr leave (Time Off Request). Step to produce: - Install the `hr_holidays` module. - Enable debug mode. - Open Settings / Technical / Resource /…
Currently, An error occurs when quick create an hr leave (Time Off Request).
Step to produce:
- Install the `hr_holidays` module.
- Enable debug mode.
- Open Settings / Technical / Resource / Resource Time Off, Create a new record, and attempt to quick create a 'Time Off Request'.
Traceback:
```
File "/home/odoo/odoo/community/odoo/http.py", line 1788, in _serve_db
return service_model.retrying(self._serve_ir_http, self.env)
File "/home/odoo/odoo/community/odoo/service/model.py", line 133, in retrying
result = func()
File "/home/odoo/odoo/community/odoo/http.py", line 1816, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/odoo/community/odoo/http.py", line 2020, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/odoo/community/odoo/addons/base/models/ir_http.py", line 221, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/odoo/community/odoo/http.py", line 757, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/odoo/community/addons/web/controllers/dataset.py", line 24, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/home/odoo/odoo/community/addons/web/controllers/dataset.py", line 20, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/odoo/odoo/community/odoo/api.py", line 464, in call_kw
result = _call_kw_model(method, model, args, kwargs)
File "/home/odoo/odoo/community/odoo/api.py", line 435, in _call_kw_model
result = method(recs, *args, **kwargs)
File "/home/odoo/odoo/community/odoo/models.py", line 1708, in name_create
record = self.create({self._rec_name: name})
File "<decorator-gen-165>", line 2, in create
File "/home/odoo/odoo/community/odoo/api.py", line 414, in _model_create_multi
return create(self, [arg])
File "/home/odoo/odoo/community/addons/hr_holidays/models/hr_leave.py", line 937, in create
if mapped_validation_type[leave_type_id] == 'no_validation':
KeyError: None
```
The error occurs because the system attempts to access 'leave_type_id' from the `vals_list` at [1], But vals_list has no data.
Link [1]: https://github.com/odoo/odoo/blob/a1969de6e6a292b14ad1d19c256ead04dc202528/addons/hr_holidays/models/hr_leave.py#L945C17-L945C68
To resolve this issue, remove the `quick_create` option for `Time Off Request` field from the 'Resource Time Off' form view.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#199163Versions -------- - 17.0+ Steps ----- 1. Have a rental product with a minimum rental duration of 1 day; 2. open its eCommerce page; 3. select two days in the rental period datepicker; 4. go to cart; 5. go back to the product page and refresh. Issue ----- The product is displayed with a rental period of 3 days. Cause ----- Commit 0573ad5 attempted to add a timezone correction when retrieving DateTime values from the server. When duration isn't with hours, it gets the `startOf
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Have a rental product with a minimum rental duration of 1 day; 2. open its eCommerce page; 3. select two days in the rental period datepicker; 4. go to cart;…
Versions -------- - 17.0+ Steps ----- 1. Have a rental product with a minimum rental duration of 1 day; 2. open its eCommerce page; 3. select two days in the rental period datepicker; 4. go to cart; 5. go back to the product page and refresh. Issue ----- The product is displayed with a rental period of 3 days. Cause ----- Commit 0573ad5 attempted to add a timezone correction when retrieving DateTime values from the server. When duration isn't with hours, it gets the `startOf` of the start datetime, and the `endOf` of the end datetime as a means of converting datetimes to dates. This only works correctly if the parses datetime value was serialized with a timezone value. This was already done for the default start dates passed to `combination_info`, but not when retrieving date fields from a current sale order. Solution -------- Use the `_get_localized_renting_dates` method in the template to get the relevant date values with the correct timezone offset. opw-4583312 Forward-Port-Of: odoo/enterprise#82577 Forward-Port-Of: odoo/enterprise#82353
Currently, an exception is generated when the system tries to find the 'Out of Contract' work_entry_type after it has been deleted. Steps to Reproduce: 1 - Install hr_payroll module without demo data 2 - Navigate to hr payroll -> configuration -> work entry types 3 - delete the 'Out of contract' work entry type 4 - Navigate to hr payroll -> Contracts -> Contract 5 - Create a contract with a start date next to the current. 6 - Change the contract state to 'Running'. 7 - Navigate to
Original PR description
Currently, an exception is generated when the system tries to find the 'Out of Contract' work_entry_type after it has been deleted. Steps to Reproduce: 1 - Install hr_payroll module without demo data…
Currently, an exception is generated when the system tries to find the 'Out of Contract' work_entry_type after it has been deleted. Steps to Reproduce: 1 - Install hr_payroll module without demo data 2 - Navigate to hr payroll -> configuration -> work entry types 3 - delete the 'Out of contract' work entry type 4 - Navigate to hr payroll -> Contracts -> Contract 5 - Create a contract with a start date next to the current. 6 - Change the contract state to 'Running'. 7 - Navigate to hr payroll -> payslips -> To pay 8 - Try to create Payslips To Pay for created contract 9 - an error occurs Error: ```ValueError External ID not found in the system: hr_payroll.hr_work_entry_type_out_of_contract ``` This issue[1] occurs because when the system tries to reference the missing 'Out of Contract' work entry type it results in a ValueError due to a missing required record. The same issue [2] occurs in the `l10n_hk_hr_payroll` module. [1] - https://github.com/odoo/enterprise/blob/265177dfd281f3aa1d61db6587ddfa37790570fe/hr_payroll/models/hr_payslip.py#L597 [2] -https://github.com/odoo/enterprise/blob/31e56779f8e0011ddc5c1a2821f68c8f041efbe4/l10n_hk_hr_payroll/models/hr_payslip.py#L180 This fix resolves the issue by ensuring that if the `Out of Contract` work entry type is missing, it returns a false value. A similar fix has been applied in `l10n_hk_hr_payroll`. Additionally, code has been added to prevent the deletion of any work entry type using @api.ondelete. sentry-6277939517 Forward-Port-Of: odoo/enterprise#82523 Forward-Port-Of: odoo/enterprise#79053
## How to reproduce the issue: - In the Gantt view of the **All Tasks** view in **Project**, create a new task with allocated hours. - Set the task to last **at least two days** and set its **end date** between **12:00 AM and 3:00 AM** (or its **start date** between **9:00 PM and 12:00 AM**). Instead of displaying the **task name**, the **display name** shows the **start and end times**. This happens because if a task **spans across days** but its start/end time is within **3 hours o
Original PR description
## How to reproduce the issue: - In the Gantt view of the **All Tasks** view in **Project**, create a new task with allocated hours. - Set the task to last **at least two days** and set its **end…
## How to reproduce the issue: - In the Gantt view of the **All Tasks** view in **Project**, create a new task with allocated hours. - Set the task to last **at least two days** and set its **end date** between **12:00 AM and 3:00 AM** (or its **start date** between **9:00 PM and 12:00 AM**). Instead of displaying the **task name**, the **display name** shows the **start and end times**. This happens because if a task **spans across days** but its start/end time is within **3 hours of midnight**, the display name includes the **start and end time** in the **week and month scale view**. Commit https://github.com/odoo/enterprise/commit/1713de228c772e43d756f068dc8b7258e3299af0 introduced a fix via `spanAccrossDays` to display the **start and end times** for tasks (shifts) where the **startDate** or **endDate** falls within **3 hours of midnight**. If `spanAccrossDays` is **false**, then the pill display name is the **start and end time** in the **week and month scale view**. However, this behavior also applied to tasks spanning more than two days. After this commit, if the pill **spans more than two days**, the pill name will only be the **task name**: - **Example 1:** **Start:** *01/01/2025, 4 PM*, **End:** *02/01/2025, 1 AM* → **Display name: Start/End Time - Task name** (since the end time is before 3 AM). - **Example 2:** **Start:** *01/01/2025, 4 PM*, **End:** *03/01/2025* → **Display name: Task Name** (since the task spans more than two days). opw-4474991 Forward-Port-Of: odoo/enterprise#82134 Forward-Port-Of: odoo/enterprise#78174
There is a special case where users can make invoices "B" to foreign customers. However, we are not allowing to create credit or debit notes "B" to adjust those invoices. This PR adds the possibility to create "B" credit and debit notes (code "6" and "7" respectively) for foreign customers. _**Behavior before this PR:**_ An error message like the following was raised when validating the credit/debit note on AFIP: ``` Esto es lo que obtenemos: Observaciones de validación de la AFIP: *
Original PR description
There is a special case where users can make invoices "B" to foreign customers. However, we are not allowing to create credit or debit notes "B" to adjust those invoices. This PR adds the possibility…
There is a special case where users can make invoices "B" to foreign customers. However, we are not allowing to create credit or debit notes "B" to adjust those invoices. This PR adds the possibility to create "B" credit and debit notes (code "6" and "7" respectively) for foreign customers. _**Behavior before this PR:**_ An error message like the following was raised when validating the credit/debit note on AFIP: ``` Esto es lo que obtenemos: Observaciones de validación de la AFIP: * Code 10015: Para facturas B (CbteDesde igual a CbteHasta) mayor o igual a $417288, DocTipo debe ser uno de los valores devueltos por el método FEParamGetTiposDoc distinto a 99 y DocNro deberá ser mayor a 0. * Code 10015: Factura B (CbteDesde igual a CbteHasta), DocTipo: 80, DocNro 0 no se encuentra registrado en los padrones de AFIP y no corresponde a una cuit pais. ``` This happened because we have to send the "CUIT país" (vat number for the foreign country) as the customer vat so the document can be validated on AFIP. For invoices, we had the logic in the code to look for the country vat and set it in the XML we send to the organism, so I just added the related documents codes so they follow the same flow. **_Behavior after this PR:_** The credit/debit note should be validated on AFIP. **_Steps to reproduce the error:_** 1) Install l10n_ar_edi 2) Set a testing enviroment 3) Create an invoice "B" to a foreign customer. This customer won't have any VAT set. 4) Validate the invoice 5) Create a credit note from the invoice that you created before. 6) Try to validate it, and check that an error message is raised. Forward-Port-Of: odoo/enterprise#80169