Friday, May 23, 2025
57 changes · saas-18.2
Resolved issues and error corrections
The exhibitor “More Info” button now opens correctly for website visitors instead of showing an error, including when debug mode is enabled. The exhibitor page also avoids showing empty parentheses when no timezone label is needed, making the event information cleaner for visitors.
Original PR description
**Steps to reproduce**: 1. Install the website_event app 2. Enable Online Exhibitors in settings 3. Open any upcoming event and check website submenu and showcase exhibitors 4. Click on the sponsor…
**Steps to reproduce**: 1. Install the website_event app 2. Enable Online Exhibitors in settings 3. Open any upcoming event and check website submenu and showcase exhibitors 4. Click on the sponsor smart button 5. Create a new sponsor with type 'Exhibitor' 6. Now click on Go to website smart button and make it publish 7. Open private window in browser and go to exhibitor page by cliking on 8. Go to Event > Modified upcoming event > exhibitors submenu 9. Now click on more info button inside the exhibitor card 10. Observe the console error or Error if Debug mode is on. **Issue**: - The dialog displayed for non-event managers attempts to use t-options within a <span> tag, causing Unknown QWeb directive error. - Missing prop error in Debug mode **Solution**: - Replace the t-options logic with a dedicated property of the object with correct format of date_begin field - Add close prop in ExhibitorConnectClosedDialog **UI Improvement:** - notice on the next exhibitor page we're displaying: ```<span>(<t t-if="website_visitor_timezone != sponsor.event_id.date_tz" t-out="event.date_tz"/>)</span>``` It would be nice to remove the parentheses when the condition doesn't pass, as it currently results in empty brackets () being shown opw-4737183
The chatter activity list layout has been adjusted so activity avatars line up consistently with message avatars. This creates a cleaner, more polished view and makes the activity and message sections feel visually consistent.
Original PR description
This commit changes the activity component sidebar structure to match the message sidebar's. This is done to make sure the avatars in the chatter are all horizontally aligned. This commit also adds padding to the Activities separator/dropdown to align with the messages date separator. Before:  After: 
Miscellaneous changes
When using shiplater in PoS and creating a backorder from the original picking, the COGS would be duplicated when validating the backorder. Steps to reproduce: ------------------- * Create 2 products, one with a cost of 20 and one with a cost of 0 * Create a PoS order with 2 lines, one for each product * Validate the order using the shiplater option * Close the session and go to the picking created * Validate the delivery only for the product with a cost of 20 and make a backorder for t
Original PR description
When using shiplater in PoS and creating a backorder from the original picking, the COGS would be duplicated when validating the backorder. Steps to reproduce: ------------------- * Create 2…
When using shiplater in PoS and creating a backorder from the original picking, the COGS would be duplicated when validating the backorder. Steps to reproduce: ------------------- * Create 2 products, one with a cost of 20 and one with a cost of 0 * Create a PoS order with 2 lines, one for each product * Validate the order using the shiplater option * Close the session and go to the picking created * Validate the delivery only for the product with a cost of 20 and make a backorder for the product with a cost of 0 * Go to the session accounting entries and check the COGS entries, you should see one entry for the product we just processed * Validate the backorder > Observation: A second COGS entry is created for the product with a cost of 20 Why the fix: ------------ Instead of creating the COGS entries based on the PoS order lines, we now create them based on the stock move lines. This way, we only create the COGS entries for the stock move lines that are actually processed. We also avoid creating COGS entries for the stock move lines that have no cost. opw-4597430 Forward-Port-Of: odoo/odoo#210704 Forward-Port-Of: odoo/odoo#207075
Abandoned cart emails would send twice because the email values for the abandoned cart template would include the partner on the record already, but we were also including the partner email in the email values. Adjusted the email values to be empty when there is already a recipient found on the template. opw-4684534 Forward-Port-Of: odoo/odoo#210586 Forward-Port-Of: odoo/odoo#206158
Original PR description
Abandoned cart emails would send twice because the email values for the abandoned cart template would include the partner on the record already, but we were also including the partner email in the email values. Adjusted the email values to be empty when there is already a recipient found on the template. opw-4684534 Forward-Port-Of: odoo/odoo#210586 Forward-Port-Of: odoo/odoo#206158
Currently, the default ffmpeg configuration used for screencast conversion fails when browser dimensions result in odd-numbered width or height, as H.264 requires even dimensions. This commit adds a padding filter to ensure dimensions are even numbers. runbot-160976 Forward-Port-Of: odoo/odoo#209100
Original PR description
Currently, the default ffmpeg configuration used for screencast conversion fails when browser dimensions result in odd-numbered width or height, as H.264 requires even dimensions. This commit adds a padding filter to ensure dimensions are even numbers. runbot-160976 Forward-Port-Of: odoo/odoo#209100
Current behavior before PR: When selecting an even row by clicking on it (if it's not opening a record) or by selecting the checkbox and then unchecking it, it will highlight this row. This is only working on even rows but not on odd rows. Desired behavior after PR is merged: This fix aims to make even and odd rows work correctly by being highlighted. task-4809597 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#
Original PR description
Current behavior before PR: When selecting an even row by clicking on it (if it's not opening a record) or by selecting the checkbox and then unchecking it, it will highlight this row. This is only working on even rows but not on odd rows. Desired behavior after PR is merged: This fix aims to make even and odd rows work correctly by being highlighted. task-4809597 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210987
Scenario: - create an object_write (Update the Record) action - update a field with equation evaluation (Python expression) with an expression like "record.id" - click on "Create contextual action" - go to a list view of the model, execute the action for several records Result: the value of the field of all records are computed based on the first selected record. Issue: we don't change the "record" in the evaluation context and just keep the first record. Fix: changing the reco
Original PR description
Scenario: - create an object_write (Update the Record) action - update a field with equation evaluation (Python expression) with an expression like "record.id" - click on "Create contextual action" -…
Scenario:
- create an object_write (Update the Record) action
- update a field with equation evaluation (Python expression) with an
expression like "record.id"
- click on "Create contextual action"
- go to a list view of the model, execute the action for several records
Result: the value of the field of all records are computed based on the
first selected record.
Issue: we don't change the "record" in the evaluation context and just
keep the first record.
Fix: changing the record.
Note: without the fix, the added test fails because the city of the
second record is set to the value of the ID of the first record.
opw-4491099
__PR code note__:
I did the change in "run" but this could be done in `_run_action_object_write`, I chose run because we are already changing the action_id in it.
The "`if eval_context.get('record') is not None`" is to not change an hypothetical case where `self.model_id` doesn't match the `context.action_model`.
__PR note__:
If it was too risky, we could probably merge in an higher version, the ticket is in 17.0 and this is still happening in master.
I've not heard of this issue before so this must not be very frequent or urgent, but I guess this is because people either use a python constant or they just use a python action with a for loop in general.
Forward-Port-Of: odoo/odoo#211122
Forward-Port-Of: odoo/odoo#210855Speed up queries like in _check_uom_not_in_invoice Before: https://explain.dalibo.com/plan/dh442bag02518830 After: https://explain.dalibo.com/plan/db2ef078c8dd4ac0 From 12 seconds to .3ms 10 Millions account_ move_ line in the database 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#2
Original PR description
Speed up queries like in _check_uom_not_in_invoice Before: https://explain.dalibo.com/plan/dh442bag02518830 After: https://explain.dalibo.com/plan/db2ef078c8dd4ac0 From 12 seconds to .3ms 10 Millions account_ move_ line in the database 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#210981 Forward-Port-Of: odoo/odoo#208992
**Issue:** when defining the form for kanban view, required attribute is not added making it true by default **steps to reproduce:** 1. install timesheets app 2. from projects app, open a task with timesheet in mobile view 3. click on `Add` button present in timesheet page 4. try to save the timesheet without 'Description' observation: Form not saved with notification "invalid field: Description" **solution:** Add relevant `required` and `readonly` property to the field this ma
Original PR description
**Issue:** when defining the form for kanban view, required attribute is not added making it true by default **steps to reproduce:** 1. install timesheets app 2. from projects app, open a task with timesheet in mobile view 3. click on `Add` button present in timesheet page 4. try to save the timesheet without 'Description' observation: Form not saved with notification "invalid field: Description" **solution:** Add relevant `required` and `readonly` property to the field this makes the behavior same across each view [see list view](https://github.com/odoo/odoo/blob/17.0/addons/hr_timesheet/views/project_task_views.xml#L41-L54) note: 1. techincal name of Description field is 'name' 2. `readonly` attribute is added to make the behavior same across each view opw-4725348 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr ; Forward-Port-Of: odoo/odoo#210957 Forward-Port-Of: odoo/odoo#209630
**Problem:** When changing the price type of a Discount pricelist rule to "formula" and going back to the original price type "discount" the rule does not take into account the base pricelist anymore and uses the list price of the product to compute the discount **Steps to reproduce:** - Navigate to Sales/Products/Pricelists - Create a new pricelist, click on Add a line - In "Price Type" select Fixed Price and set a Fixed Price of 10 - Save and Close > create a second new price list
Original PR description
**Problem:** When changing the price type of a Discount pricelist rule to "formula" and going back to the original price type "discount" the rule does not take into account the base pricelist anymore…
**Problem:** When changing the price type of a Discount pricelist rule to "formula" and going back to the original price type "discount" the rule does not take into account the base pricelist anymore and uses the list price of the product to compute the discount **Steps to reproduce:** - Navigate to Sales/Products/Pricelists - Create a new pricelist, click on Add a line - In "Price Type" select Fixed Price and set a Fixed Price of 10 - Save and Close > create a second new price list - Click on "Add a line" and select a Price Type Discount - Set a 50% discount percent and select your first pricelist as the base price (next to "on") - Save and Close > save the form - Open the rule again and change the Price Type to formula - Change the Price Type back to Discount and set a discount percentage of 50% again - Save and Close - Create a new quotation with a product and select the second pricelist you created > click on Update Prices **Current behavior:** Amount is 50% of the price of the product **Expected behavior:** It should be 50% of 10 because our second pricelist is based on the first one which has a fixed price of 10 **Cause of the issue:** when _onchange_compute_price is triggeredwhen going back to discount value, base will be set to list_price https://github.com/odoo/odoo/blob/d3e43681fd2b989ae7272731662cc3ac6a6d913b/addons/product/models/product_pricelist_item.py#L334-L342 because of this, the base price will not be computed based on the base pricelist https://github.com/odoo/odoo/blob/d3e43681fd2b989ae7272731662cc3ac6a6d913b/addons/product/models/product_pricelist_item.py#L580-L583 **fix:** By resetting the base_pricelist_id, it's now visible to the user on the form that the computation is no more based on a pricelist. If the user enters a pricelist, the correct value will be computerd for base and base_pricelist_id at that time. opw-4757951 Forward-Port-Of: odoo/odoo#208899
Before this PR: In A4 statement format reports, the folder layout was overwriting header information, causing important header details to be obscured in the printed output. After this PR: Fixed folder layout rendering to preserve header information in A4 statement format reports, ensuring all header details are properly displayed. Solution: Adapted the A4 statement format implementation to work with the new report margin approach that replaces paperformat spacing with $o-default-report-
Original PR description
Before this PR: In A4 statement format reports, the folder layout was overwriting header information, causing important header details to be obscured in the printed output. After this PR: Fixed folder layout rendering to preserve header information in A4 statement format reports, ensuring all header details are properly displayed. Solution: Adapted the A4 statement format implementation to work with the new report margin approach that replaces paperformat spacing with $o-default-report-margins CSS variable, preventing layout conflicts that were causing header overwrites. OPW-4741128 Forward-Port-Of: odoo/odoo#211168
This PR removes the `onchange` logic previously used to auto-set the l10n_in_gst_treatment field based on company_type and country_id. The GST Treatment is now set dynamically by the PartnerAutoComplete service. If a user manually creates a partner (without using autocomplete), they will need to select the GST Treatment manually. Related IAP-https://github.com/odoo/iap-apps/pull/1051 Forward-Port-Of: odoo/odoo#205714
Original PR description
This PR removes the `onchange` logic previously used to auto-set the l10n_in_gst_treatment field based on company_type and country_id. The GST Treatment is now set dynamically by the PartnerAutoComplete service. If a user manually creates a partner (without using autocomplete), they will need to select the GST Treatment manually. Related IAP-https://github.com/odoo/iap-apps/pull/1051 Forward-Port-Of: odoo/odoo#205714
The tour fixed implicitly checks the browser's history. In Odoo, and history entry is pushed after a setTimeout(0) to allow multiple calls to be aggregated. The fix aknowledges this by introducing delays before executing the action. runbot-error-108129 runbot-error-223364 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/submi
Original PR description
The tour fixed implicitly checks the browser's history. In Odoo, and history entry is pushed after a setTimeout(0) to allow multiple calls to be aggregated. The fix aknowledges this by introducing delays before executing the action. runbot-error-108129 runbot-error-223364 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#211207
**Steps to reproduce:** 1. Go to definition of default_website and add `<field name="configurator_done" eval="True"/>` . 2. install website module. **Issue:** Users are incorrectly redirected to the configurator screen instead of the website page. However, refreshing the page correctly redirects to the home screen as the server-side route is triggered on reload. **Reason:** The issue started in Odoo 16. Until Odoo 15, redirection to the configurator route is handled using ir.actions.ac
Original PR description
**Steps to reproduce:** 1. Go to definition of default_website and add `<field name="configurator_done" eval="True"/>` . 2. install website module. **Issue:** Users are incorrectly redirected to the…
**Steps to reproduce:** 1. Go to definition of default_website and add `<field name="configurator_done" eval="True"/>` . 2. install website module. **Issue:** Users are incorrectly redirected to the configurator screen instead of the website page. However, refreshing the page correctly redirects to the home screen as the server-side route is triggered on reload. **Reason:** The issue started in Odoo 16. Until Odoo 15, redirection to the configurator route is handled using ir.actions.act_url, which triggered a full page reload, ensuring the server route executed. From Odoo 16 onwards, this action is removed, and a direct client action is attached. Within `configurator.js`, navigation is now handled using the `history.pushState` method which replace the current url and does not trigger a reload. As a result, even when navigating to the configurator route, the server route is not executed, leading to incorrect redirection. **Fix:** Added a check in configurator.js to verify the configurator status. If it is true, the user is redirected to the website page instead of the configurator. Otherwise, the normal configurator flow continues. **Key Changes:** 1. In configurator_init, added a check: if configurator_done is True, set the default theme using button_choose_theme and store its result (a dict containing the next action to execute) as redirect_url. 2. In the Configurator component, added redirect_url to the store, and inside the onWillStart method, checked if redirect_url exists. If it does, redirect to the home screen using doAction. This PR ensures the correct redirection behavior when users follow the Industries installation flow. task-4555467 Forward-Port-Of: odoo/odoo#197593
Problem: When pasting a YouTube link and embedding it as an `iframe`, saving removes the `iframe` element. This happens because `iframe` is listed as a `kill_tag` in `SANITIZE_TAGS`, leading to its removal. As a result, the wrapper `div` becomes empty and is converted to a self-closing element, which produces invalid HTML. Solution: Disable video embedding on `body_html` of email templates to avoid inserting `iframe` elements that will later be stripped. Steps to reproduce: 1. Paste
Original PR description
Problem: When pasting a YouTube link and embedding it as an `iframe`, saving removes the `iframe` element. This happens because `iframe` is listed as a `kill_tag` in `SANITIZE_TAGS`, leading to its removal. As a result, the wrapper `div` becomes empty and is converted to a self-closing element, which produces invalid HTML. Solution: Disable video embedding on `body_html` of email templates to avoid inserting `iframe` elements that will later be stripped. Steps to reproduce: 1. Paste a YouTube link in an email template. 2. Choose "Embed YouTube Video" from the popup. 3. Save the template. → The content is broken due to missing `iframe`. opw-4746178 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209549
Problem: Adding a document when creating a new email template using `/media` results in duplicated content on save. Cause: During HTML processing on save, `flattenBackgroundImages` wraps elements with inline background images (`style*=background-image`) in MSO-specific comments: `<!--[if mso]><![endif]-->`. However, if multiple such elements are nested, they are each wrapped, resulting in invalid nested comments and broken layout. Solution: Since the two conditions are opposites,
Original PR description
Problem: Adding a document when creating a new email template using `/media` results in duplicated content on save. Cause: During HTML processing on save, `flattenBackgroundImages` wraps elements…
Problem: Adding a document when creating a new email template using `/media` results in duplicated content on save. Cause: During HTML processing on save, `flattenBackgroundImages` wraps elements with inline background images (`style*=background-image`) in MSO-specific comments: `<!--[if mso]><![endif]-->`. However, if multiple such elements are nested, they are each wrapped, resulting in invalid nested comments and broken layout. Solution: Since the two conditions are opposites, we remove completely the content of the nested comment if it has oppisite condition otherwise we just remove the comment tags since they will be replaced with the upper comment Fixed in `web_editor` in https://github.com/odoo/odoo/commit/fcedeb63f5b5da6758e75d02f0c1d4f3b965adc1 Steps to reproduce: 1. Create a new email template. 2. Add a document using `/media`. 3. Save. → The content is duplicated or layout is broken. opw-4775908 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208788
Suppose an invoice line of 11.0 with 21% tax. The total of the invoice is 13.31. With a cash rounding of 0.05 UP, the total of the invoice becomes 13.35. If we apply an early payment discount of 2% on payments, we expect a discount of 0.25 because 13.35 * 0.98 = 13.08 but 13.10 with the cash rounding. 13.35 - 13.10 = 0.25 However, the cash rounding of the payment register wizard is computed from the total invoice instead of taking the amount stored on the accounting item. Then, he was computi
Original PR description
Suppose an invoice line of 11.0 with 21% tax. The total of the invoice is 13.31. With a cash rounding of 0.05 UP, the total of the invoice becomes 13.35. If we apply an early payment discount of 2% on payments, we expect a discount of 0.25 because 13.35 * 0.98 = 13.08 but 13.10 with the cash rounding. 13.35 - 13.10 = 0.25 However, the cash rounding of the payment register wizard is computed from the total invoice instead of taking the amount stored on the accounting item. Then, he was computing an early payment of 13.35 * 0.02 = 0.27 instead. At the end, the invoice was still open with a residual amount of 0.02. opw-4730764 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207562 Forward-Port-Of: odoo/odoo#207049
The failing step is creating a new website, which could take a long time. Increasing the timeout for the next step should prevent the error. runbot-error-104332 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210935 Forward-Port-Of: odoo/odoo#210121
Original PR description
The failing step is creating a new website, which could take a long time. Increasing the timeout for the next step should prevent the error. runbot-error-104332 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210935 Forward-Port-Of: odoo/odoo#210121
Since we only update the fiscal positions for newly created taxes, there is nothing to update in the mapping when nothing will be created. upg-2769042 Forward-Port-Of: odoo/odoo#207700
Original PR description
Since we only update the fiscal positions for newly created taxes, there is nothing to update in the mapping when nothing will be created. upg-2769042 Forward-Port-Of: odoo/odoo#207700
JoFotara portal expects credit notes lines ids (in the XML) to match those of the original invoice. This expectation was not satisfied before, causing partial credit notes submission to fail. This commit solves this issue. task-4752035 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211280 Forward-Port-Of: odoo/odoo#209882
Original PR description
JoFotara portal expects credit notes lines ids (in the XML) to match those of the original invoice. This expectation was not satisfied before, causing partial credit notes submission to fail. This commit solves this issue. task-4752035 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211280 Forward-Port-Of: odoo/odoo#209882
…ew PCSID When a journal is re-onboarding on ZATCA and a new PCSID is generated, the Invoice Counter Value (ICV) should be reset > Currently, the system does not reset the ICV when a journal is re-onboarded. The fix resets the sequence back to 1 on re-onboarding task-4652483 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/
Original PR description
…ew PCSID When a journal is re-onboarding on ZATCA and a new PCSID is generated, the Invoice Counter Value (ICV) should be reset > Currently, the system does not reset the ICV when a journal is re-onboarded. The fix resets the sequence back to 1 on re-onboarding task-4652483 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#210078
Purpose of this commit: To remove the restriction of the partner being mentioned on a public channel. Forward-Port-Of: odoo/odoo#211232
Original PR description
Purpose of this commit: To remove the restriction of the partner being mentioned on a public channel. Forward-Port-Of: odoo/odoo#211232
Following [1], the blog page reverted to using the first blog post as the cover. However, the title of the page ("Our Latest Posts") was made non-editable and, consequently, non-translatable, which is not ideal. This commit addresses the issue by making the title editable, ensuring it can also be translated. [1]: https://github.com/odoo/odoo/commit/05ef95d3f13ac42713bb8d8a3002f149345cc08b opw-4289735 Forward-Port-Of: odoo/odoo#187680
Original PR description
Following [1], the blog page reverted to using the first blog post as the cover. However, the title of the page ("Our Latest Posts") was made non-editable and, consequently, non-translatable, which is not ideal.
This commit addresses the issue by making the title editable, ensuring it can also be translated.
[1]: https://github.com/odoo/odoo/commit/05ef95d3f13ac42713bb8d8a3002f149345cc08b
opw-4289735
Forward-Port-Of: odoo/odoo#187680- On a slow connection; - In a list view (or a form view), click on a button (a view button); - Make some changes and click on the Discard button; - Make some changes in the main view. Because the connection is slow, the main view reloads after the user has made some changes. This causes some issues, for example : the changes may be lost, editable list views may become uneditable, forcing the user to click again. This happens because on the action service, the callback function (`onClos
Original PR description
- On a slow connection; - In a list view (or a form view), click on a button (a view button); - Make some changes and click on the Discard button; - Make some changes in the main view. Because the…
- On a slow connection; - In a list view (or a form view), click on a button (a view button); - Make some changes and click on the Discard button; - Make some changes in the main view. Because the connection is slow, the main view reloads after the user has made some changes. This causes some issues, for example : the changes may be lost, editable list views may become uneditable, forcing the user to click again. This happens because on the action service, the callback function (`onClose`) is called after the dialog is closed. In the case of a view button, the callback function will reload the main view. This commit, is related to [1], in which an almost identical issue was resolved. The difference is that in previous commit the user clicked on the `Save` button in the dialog; whereas in this commit, it is the `Discard` button that is causing the issues. This commit changes that order, we will wait for the execution of the callback to complete before closing the dialog. [1] : https://github.com/odoo/odoo/commit/31c00161fd3a77c9fbd260754cb8c142fcb0d652 Forward-Port-Of: odoo/odoo#210521
Follow up of https://github.com/odoo/odoo/pull/193597 Starting from 18.1, the unavailable operators (due to being in call in particular) are excluded from available_operator_ids, rather than filtered afterwards. This means the gc will not be called if all operators are in call, even though the goal was to remove potentially obsolete calls. Forward-Port-Of: odoo/odoo#211255
Original PR description
Follow up of https://github.com/odoo/odoo/pull/193597 Starting from 18.1, the unavailable operators (due to being in call in particular) are excluded from available_operator_ids, rather than filtered afterwards. This means the gc will not be called if all operators are in call, even though the goal was to remove potentially obsolete calls. Forward-Port-Of: odoo/odoo#211255
Steps to reproduce ================== Run the test `/test_mail.test_message_process_references_multi_parent_notflat` a bunch of times. It will eventually fail. Or simply change the random range from `randint(0, 99998)` to `randint(0, 98)` Cause of the issue ================== ```py "<%.7f-%05d-test@iron.sky>" % (time.time(), randint(0, 99998)) ``` If randint returns a low enough value, the msg_id might look like `'<1747742185.1234567- 42-test@iron.sky>'` Solution ======
Original PR description
Steps to reproduce ================== Run the test `/test_mail.test_message_process_references_multi_parent_notflat` a bunch of times. It will eventually fail. Or simply change the random range from `randint(0, 99998)` to `randint(0, 98)` Cause of the issue ================== ```py "<%.7f-%05d-test@iron.sky>" % (time.time(), randint(0, 99998)) ``` If randint returns a low enough value, the msg_id might look like `'<1747742185.1234567- 42-test@iron.sky>'` Solution ======== We can pad the random int with zeros. runbot-110801 Forward-Port-Of: odoo/odoo#210833
The system raised a `psycopg2.errors.UndefinedFunction` error when attempting to compute a `SUM` on a `timestamp field (create_date)` in gamification goals. This is because PostgreSQL does not support `SUM(timestamp)` — `SUM` can only be used with numeric types such as integer, float, or monetary. Steps to reproduce: --- - Install `Gamification` and `hr_appraisal` modules - Create a Gamification Challenge, and also create a Goal Definition and set `Computation Mode` -> `Sum`, `Model` -> `A
Original PR description
The system raised a `psycopg2.errors.UndefinedFunction` error when attempting to compute a `SUM` on a `timestamp field (create_date)` in gamification goals. This is because PostgreSQL does not…
The system raised a `psycopg2.errors.UndefinedFunction` error when attempting to compute a `SUM` on a `timestamp field (create_date)` in gamification goals. This is because PostgreSQL does not support `SUM(timestamp)` — `SUM` can only be used with numeric types such as integer, float, or monetary.
Steps to reproduce:
---
- Install `Gamification` and `hr_appraisal` modules
- Create a Gamification Challenge, and also create a Goal Definition and set `Computation Mode` -> `Sum`, `Model` -> `Appraisal Goal`, `Field to Sum` -> `Created on (Appraisal Goal)`, `Filter Domain` -> `[]`
- `Start Challenge` in Gamification Challenge
Traceback:
---
```
UndefinedFunction
function sum(timestamp without time zone) does not exist LINE 1: SELECT SUM("hr_appraisal_goal"."create_date") FROM "hr_appra...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
```
To fix this, we now check the field type before applying aggregation. If the computation mode is set to `sum` but the field is not numeric, we gracefully fallback to using `count` instead. This prevents SQL errors and ensures that goal computations remain reliable even with misconfigured definitions.
sentry-6575130734
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#208077If a tag is set on a product, it has to be propagated on the base and the tax lines. It was only set on the base line before this fix. task_id: 4789153 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210541 Forward-Port-Of: odoo/odoo#209676
Original PR description
If a tag is set on a product, it has to be propagated on the base and the tax lines. It was only set on the base line before this fix. task_id: 4789153 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210541 Forward-Port-Of: odoo/odoo#209676
### Steps to reproduce: - Have 2 companies: COMP1 and COMP2 - Create a storable product P with a kit bom for attached to COMP1. - With COMP2 create a delivery for 1 unit of P. > If you click on check availability the move should not be assigned. - As COMP1 and with COMP2 active, click on check availability once more #### > The move is assigned. ### Cause of the issue: Checking the availability will launch a call of the `action_assign` of the stock picking. During this call, the mov
Original PR description
### Steps to reproduce: - Have 2 companies: COMP1 and COMP2 - Create a storable product P with a kit bom for attached to COMP1. - With COMP2 create a delivery for 1 unit of P. > If you click on check…
### Steps to reproduce: - Have 2 companies: COMP1 and COMP2 - Create a storable product P with a kit bom for attached to COMP1. - With COMP2 create a delivery for 1 unit of P. > If you click on check availability the move should not be assigned. - As COMP1 and with COMP2 active, click on check availability once more #### > The move is assigned. ### Cause of the issue: Checking the availability will launch a call of the `action_assign` of the stock picking. During this call, the moves that shoudl by pass the reservation process will automatically be reserved: https://github.com/odoo/odoo/blob/9b0c1c416eaa0df64fbe28c5672f2590a218f315/addons/stock/models/stock_move.py#L1852-L1853 However, kit products are flagged to bypass the reservation process by these lines: https://github.com/odoo/odoo/blob/9b0c1c416eaa0df64fbe28c5672f2590a218f315/addons/mrp/models/stock_move.py#L521-L522 The issue with this line being that the product is a kit form COMP1 and not for COMP2 (the context is used to determine this in the compute method): https://github.com/odoo/odoo/blob/9b0c1c416eaa0df64fbe28c5672f2590a218f315/addons/mrp/models/product.py#L38-L40 ### Note: The issue can not be reproduced prior to 18.0, since the override of the `_should_bypass_reservation` was introduced by commit 4e1d46869e6c2d1ff473317179393007522a10a3 opw-4660233 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209900
The usecase occurs in x2many lists in form views. The total width of the table's parent div may change, for instance if a scrollbar appears on the sheet at some point. When this happens, the widths must be recomputed, to properly fit with the new available space. Before this commit, we only listened to window resize, not to the parent div itself. This could lead to an horizontal scrollbar being sometimes displayed, for instance: - with the chatter below the form view, as it is loaded asynch
Original PR description
The usecase occurs in x2many lists in form views. The total width of the table's parent div may change, for instance if a scrollbar appears on the sheet at some point. When this happens, the widths…
The usecase occurs in x2many lists in form views. The total width of the table's parent div may change, for instance if a scrollbar appears on the sheet at some point. When this happens, the widths must be recomputed, to properly fit with the new available space. Before this commit, we only listened to window resize, not to the parent div itself. This could lead to an horizontal scrollbar being sometimes displayed, for instance: - with the chatter below the form view, as it is loaded asynchronously, when it contains messages such that there's no (vertical) scrollbar before it is loaded, and there's one after. - with the document previewer, as its width changes when it is loaded. This commit fixes the issue by using a resize observer to listen to the parent div directly, instead of on a window, which is more accurate. Bug reported by our cto 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#210798 Forward-Port-Of: odoo/odoo#210366
Before this commit, scanning the barcode of a product with attributes set to never creation type, but with only one option available, would still trigger the product configuration popup. opw-4754801 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210353 Forward-Port-Of: odoo/odoo#208272
Original PR description
Before this commit, scanning the barcode of a product with attributes set to never creation type, but with only one option available, would still trigger the product configuration popup. opw-4754801 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210353 Forward-Port-Of: odoo/odoo#208272
Account 461411, set by default on the sales taxes in LU localization does not need to be reconcilable as only payables and receivables defined in tax groups have to be opw-4749885 Forward-Port-Of: odoo/odoo#211244 Forward-Port-Of: odoo/odoo#210613
Original PR description
Account 461411, set by default on the sales taxes in LU localization does not need to be reconcilable as only payables and receivables defined in tax groups have to be opw-4749885 Forward-Port-Of: odoo/odoo#211244 Forward-Port-Of: odoo/odoo#210613
Add a tracking flag to the payments state to be logged into the chatter. task-4531618 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#199967
Original PR description
Add a tracking flag to the payments state to be logged into the chatter. task-4531618 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#199967
Steps: ------ 1. Create a combo product and make it available in restaurant 2. In PoS, add this product to an order 3. Click the product line, and set the quantity to 2 let's 4. Click split button, it takes you to the split screen Observation: We can not select one of these 2 combos to split, it's either all of them, or none. Reason: ------- That's because combos are considered as non groupable in pos, see `is_pos_groupable` [1]. And then, when splitting a combo in `_splitQuantity`
Original PR description
Steps: ------ 1. Create a combo product and make it available in restaurant 2. In PoS, add this product to an order 3. Click the product line, and set the quantity to 2 let's 4. Click split button,…
Steps: ------ 1. Create a combo product and make it available in restaurant 2. In PoS, add this product to an order 3. Click the product line, and set the quantity to 2 let's 4. Click split button, it takes you to the split screen Observation: We can not select one of these 2 combos to split, it's either all of them, or none. Reason: ------- That's because combos are considered as non groupable in pos, see `is_pos_groupable` [1]. And then, when splitting a combo in `_splitQuantity` [2], we either take all the quantity or 0. Fix: ---- We update the split logic to account for special combo cases. [1]: https://github.com/odoo/odoo/blob/bee8b55d7783ea11f2362990cd9d7695b877b8e9/addons/point_of_sale/static/src/app/store/models.js#L829 [2]: https://github.com/odoo/odoo/blob/bee8b55d7783ea11f2362990cd9d7695b877b8e9/addons/pos_restaurant/static/src/app/split_bill_screen/split_bill_screen.js#L124-L127 opw-4737788 Forward-Port-Of: odoo/odoo#208679 Forward-Port-Of: odoo/odoo#208055
In odoo/odoo#208571, a fix was made to prevent 1 unit of weight from added when cancelling weighing. However, this also changed the behaviour when a scale error (such as IoT box being disconnected) occurs, preventing the product from being manually entered. In this commit, we amend the condition to only stop adding the order line if the user closes the scale popup, but still add it on error. opw-4643243 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/subm
Original PR description
In odoo/odoo#208571, a fix was made to prevent 1 unit of weight from added when cancelling weighing. However, this also changed the behaviour when a scale error (such as IoT box being disconnected) occurs, preventing the product from being manually entered. In this commit, we amend the condition to only stop adding the order line if the user closes the scale popup, but still add it on error. opw-4643243 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211234 Forward-Port-Of: odoo/odoo#209815
### Steps to reproduce: - install fsm_industry - run any of these tests: - test_change_parent_plan - test_change_parent_plan_conflict - test_change_parent_plan_with_intermediate - test_change_plan - test_change_plan_conflict - test_change_plan_no_conflict #### > create access right error for the `account.analytic.line` model ### Cause of the issue: The following three record rules provide the creation of `account.analytic.line` for users related to projec
Original PR description
### Steps to reproduce: - install fsm_industry - run any of these tests: - test_change_parent_plan - test_change_parent_plan_conflict - test_change_parent_plan_with_intermediate - test_change_plan -…
### Steps to reproduce:
- install fsm_industry
- run any of these tests:
- test_change_parent_plan
- test_change_parent_plan_conflict
- test_change_parent_plan_with_intermediate
- test_change_plan
- test_change_plan_conflict
- test_change_plan_no_conflict
#### > create access right error for the `account.analytic.line` model
### Cause of the issue:
The following three record rules provide the creation of `account.analytic.line` for users related to project or timesheet access rights unless the analytic line it self is linked to a project: https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L52-L64 https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L66-L76 https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L78-L83 Since the analytic module is unrelated to the project module, these tests will inevitably fail.
### Note:
These record rules do not stop the record creation once the account module is installed since the following record rules override the creation access rights for `account.group_account_invoice` users: https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/account/security/account_security.xml#L102-L107
Similar issue treated in commit 9d164c1d2cd8e532109b9859ab776fcf2f71d115
### Note 2:
A priori, the same problem would occur if we were to write post install analytic tests for portal users:
https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L33-L50
### Forward port additional fix (18.0):
Since Commit 0e997470b7174a187c876d734e38f633223f65ec the test of the `TestAnalyticAccount` class are launched in sudo mode since the environment is set using OdooBot and never associated with an other user:
https://github.com/odoo/odoo/blob/ed38752e55d6bafbc71fac3df249f226a4eba332/odoo/tests/common.py#L979
https://github.com/odoo/odoo/blob/4baf55a5d108063b0b60beddf332b6ae367f1871/odoo/api.py#L568-L571
In 17.0 the environment was reset to a non sudo mode by the user reassignement:
https://github.com/odoo/odoo/blob/d2ea23f252f0f8f329e2b0ff96de6ee2a14b922f/addons/analytic/tests/test_analytic_account.py#L28-L31
In order for the tests to also check access rights we have added our own `setup_independent_user` in the `AnalyticCommon` class.
runbot-160013
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#210001
Forward-Port-Of: odoo/odoo#208978In the Time Off app dashboard, employees can view whether some of their unused time off days are set to expire and the exact expiration date. At the accrual plan level, a validity period can be defined for carried-over days, after which they expire. However, the expiration date of these carried-over days hasn't been considered when calculating the employee's expiring balance. Steps to reproduce: 1. Create a new accrual plan. 2. Define a new accrual plan level. 3. Configure the lev
Original PR description
In the Time Off app dashboard, employees can view whether some of their unused time off days are set to expire and the exact expiration date. At the accrual plan level, a validity period can be…
In the Time Off app dashboard, employees can view whether some of their unused time off days are set to expire and the exact expiration date. At the accrual plan level, a validity period can be defined for carried-over days, after which they expire. However, the expiration date of these carried-over days hasn't been considered when calculating the employee's expiring balance. Steps to reproduce: 1. Create a new accrual plan. 2. Define a new accrual plan level. 3. Configure the level to accrue 10 days annually. 4. Set the carryover validity to 2 months. 5. Keep all other settings as default. 6. Create a new allocation. 7. Apply the previously defined accrual plan. 8. Set the start date to 01/01/20xx (where xx is the previous year). 9. Confirm the employee's balance is now 10 days. 10. Navigate to the dashboard. 11. Set the date to 01/01/(20xx + 2), corresponding to the carryover date. 12. Notice that no expiration date is displayed on the dashboard. 13. The expiration date should be displayed as 01/03/(20xx + 2). This update addresses the issue by incorporating the expiration dates of carried-over days into the calculation. task-4207987 Forward-Port-Of: odoo/odoo#209992 Forward-Port-Of: odoo/odoo#181502
Before this patch, it was impossible to resequence vendor bills if already sent to SII/tbai. However, it is required to be able to resequence them, and the move name isn't sent anymore since https://github.com/odoo/odoo/pull/195113 was merged. Thus, here I'm lifting that constraint to allow accountants do the resequencing. @moduon MT-8728 OPW-4567144 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209305 Forward-
Original PR description
Before this patch, it was impossible to resequence vendor bills if already sent to SII/tbai. However, it is required to be able to resequence them, and the move name isn't sent anymore since https://github.com/odoo/odoo/pull/195113 was merged. Thus, here I'm lifting that constraint to allow accountants do the resequencing. @moduon MT-8728 OPW-4567144 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209305 Forward-Port-Of: odoo/odoo#197284
Since [1], domain name matching in get_current_website did not account for IDNA (punycode) encoding, making it impossible to use non-ASCII domain names (e.g., düsseldorf.localhost). This commit fixes the issue by normalizing the incoming domain to Unicode, then encoding it to punycode for comparison with stored website domains, ensuring correct resolution of websites with internationalized domain names. [1]: https://github.com/odoo/odoo/commit/4a202440b8d9bbe8e93e1ae47b68159330c8836d
Original PR description
Since [1], domain name matching in get_current_website did not account for IDNA (punycode) encoding, making it impossible to use non-ASCII domain names (e.g., düsseldorf.localhost). This commit fixes the issue by normalizing the incoming domain to Unicode, then encoding it to punycode for comparison with stored website domains, ensuring correct resolution of websites with internationalized domain names. [1]: https://github.com/odoo/odoo/commit/4a202440b8d9bbe8e93e1ae47b68159330c8836d task-4756915 Forward-Port-Of: odoo/odoo#207884
When viewing the valuation in the past, the default measures 'Remaining Qty' and 'Remaining Value' are irrelevant. Instead, display the 'Quantity' and 'Total Value' measures by default. opw-4517548 Forward-Port-Of: odoo/odoo#202685
Original PR description
When viewing the valuation in the past, the default measures 'Remaining Qty' and 'Remaining Value' are irrelevant. Instead, display the 'Quantity' and 'Total Value' measures by default. opw-4517548 Forward-Port-Of: odoo/odoo#202685
Before this commit, when a message has at least 1 reaction, using the quick reaction button in mobile displayed the emoji picker that shared the viewport of message list. This makes it hardly practical. This happens because the `useEmojiPicker()` in message reactions provide a ref, and this ref in mobile is used as a target to mount the emoji picker. This feature is useful for discuss composer to place emoji picker nicely under the composer input. In desktop the ref is used for click targe
Original PR description
Before this commit, when a message has at least 1 reaction, using the quick reaction button in mobile displayed the emoji picker that shared the viewport of message list. This makes it hardly…
Before this commit, when a message has at least 1 reaction, using the quick reaction button in mobile displayed the emoji picker that shared the viewport of message list. This makes it hardly practical. This happens because the `useEmojiPicker()` in message reactions provide a ref, and this ref in mobile is used as a target to mount the emoji picker. This feature is useful for discuss composer to place emoji picker nicely under the composer input. In desktop the ref is used for click target of popover. In practice the passing of ref in mobile is niche use-case: most of the time it should open in bottom screen as a dialog in a similar fashion as popover. This commit fixes the issue by making 1st param of `useEmojiPicker` only act as the toggler part . In mobile to provide the container of emoji picker, one need to call `open(ref)` explicitly. Task-4800688 From click there:  Before  After  Forward-Port-Of: odoo/odoo#210802
Currently a traceback is occurring when the user tries to generate a payslip report. To reproduce this issue: 1) Install `l10n_in_hr_payroll` and shift to Indian company 2) Create an employee and a bank account in the private information of employee 3) Remove the `Bank Identifier Code` from the `Bank` while creating a bank record 4) Create a new `payslip` record with a `running contract` 5) Confirm the payslip and click the `Create Payment Report` Error:- ``` TypeError: expect
Original PR description
Currently a traceback is occurring when the user tries to generate a payslip report. To reproduce this issue: 1) Install `l10n_in_hr_payroll` and shift to Indian company 2) Create an employee and a bank account in the private information of employee 3) Remove the `Bank Identifier Code` from the `Bank` while creating a bank record 4) Create a new `payslip` record with a `running contract` 5) Confirm the payslip and click the `Create Payment Report` Error:- ``` TypeError: expected string or bytes-like object, got 'bool' ``` As the `bank_bic` is not a required field, user can removes it. if there is no `bank_bic`, it leads to the above traceback from the below line. https://github.com/odoo/enterprise/blob/e2a9442ac33579c9833f65f59cf8341b3c6eafc8/l10n_in_hr_payroll/models/hr_employee.py#L24 sentry-6199042870 Forward-Port-Of: odoo/enterprise#81682
…o switzerland Forward-Port-Of: odoo/enterprise#86183
Original PR description
…o switzerland Forward-Port-Of: odoo/enterprise#86183
Repro steps: 1.Install l10n_lu_reports module 2. Go to Reporting > Tax Return > Annual VAT Declaration 3. Click on `Appendix to Operational Expidenture` 4. You will get a traceback error Cause: As of this PR in 18.1: https://github.com/odoo/enterprise/pull/70280 The function `registerCustomComponent` changed in 2 ways: 1. It now expects a module name 2. It registers the component by its name These changes were not applied in l10n_lu_reports module hence causing the error of the comp
Original PR description
Repro steps: 1.Install l10n_lu_reports module 2. Go to Reporting > Tax Return > Annual VAT Declaration 3. Click on `Appendix to Operational Expidenture` 4. You will get a traceback error Cause: As of this PR in 18.1: https://github.com/odoo/enterprise/pull/70280 The function `registerCustomComponent` changed in 2 ways: 1. It now expects a module name 2. It registers the component by its name These changes were not applied in l10n_lu_reports module hence causing the error of the component not being found in the registery This commit solves this issue by applying those changes in l10n_lu_reports module task-4816146 Forward-Port-Of: odoo/enterprise#86284
This commit simply amends the expected scale checksum after the fix that was carried out in the community PR (odoo/odoo#209815) opw-4643243 Forward-Port-Of: odoo/enterprise#86214 Forward-Port-Of: odoo/enterprise#85442
Original PR description
This commit simply amends the expected scale checksum after the fix that was carried out in the community PR (odoo/odoo#209815) opw-4643243 Forward-Port-Of: odoo/enterprise#86214 Forward-Port-Of: odoo/enterprise#85442
Before this commit, if a user attempted to open a spreadsheet they lacked access to or that did not exist, they would get a traceback due to improper error handling. This commit resolves the issue by handling server errors when fetching the spreadsheet and redirecting the user to the documents app. Steps to reproduce: - Create a spreadsheet with Mitchell Admin. - Copy a hyperlink. - In another browser, log in as Marc Demo and paste the hyperlink. - You get a traceback and you don't unders
Original PR description
Before this commit, if a user attempted to open a spreadsheet they lacked access to or that did not exist, they would get a traceback due to improper error handling. This commit resolves the issue by handling server errors when fetching the spreadsheet and redirecting the user to the documents app. Steps to reproduce: - Create a spreadsheet with Mitchell Admin. - Copy a hyperlink. - In another browser, log in as Marc Demo and paste the hyperlink. - You get a traceback and you don't understand what's going on. task-4551255 Forward-Port-Of: odoo/enterprise#81276
* Hide smart buttons when there are no elements and include `in process` payments to the collections smart button. * Consider all payments linked to a mandate as Collections not only the ones have journal entries * Log in the payment chatter the inclusion/exclusion of the payment in a batch. * Validate only in process payments task-4531618 Forward-Port-Of: odoo/enterprise#85926 Forward-Port-Of: odoo/enterprise#80494
Original PR description
* Hide smart buttons when there are no elements and include `in process` payments to the collections smart button. * Consider all payments linked to a mandate as Collections not only the ones have journal entries * Log in the payment chatter the inclusion/exclusion of the payment in a batch. * Validate only in process payments task-4531618 Forward-Port-Of: odoo/enterprise#85926 Forward-Port-Of: odoo/enterprise#80494
### **Version:** saas-18.1 --- ### **Steps to reproduce:** 1. Open a sign template. 2. Make **no changes** to the template. 3. Try to send or reuse the template which has sign_request. 4. A warning appears. --- ### **Issue:** The warning dialog is incorrectly triggered even when the template hasn't been modified. This leads to unnecessary interruption and confusion, especially when the user only intends to reuse or send the existing template without editing it. ---
Original PR description
### **Version:** saas-18.1 --- ### **Steps to reproduce:** 1. Open a sign template. 2. Make **no changes** to the template. 3. Try to send or reuse the template which has sign_request. 4. A warning appears. --- ### **Issue:** The warning dialog is incorrectly triggered even when the template hasn't been modified. This leads to unnecessary interruption and confusion, especially when the user only intends to reuse or send the existing template without editing it. --- ### **Cause:** The `saveTemplate()` method did not verify whether the template had any actual changes. --- ### **Solution:** Added a check to ensure the warning is shown when the user made actual changes to the template. task-4778666 Forward-Port-Of: odoo/enterprise#85335
**[FIX] l10_ke_edi_oscu: Handle None name of fresh unposted credit notes.** To reproduce the issue: - Create an invoice with some lines - Create the first credit note and change the product set on one of the lines or its quantity to trigger the fix piece of the code (do not confirm the credit note) - Create another credit note and try to post it -> Traceback The issue is caused by the fact that newly created moves generally have `None` in the `name` field, which is only populated after
Original PR description
**[FIX] l10_ke_edi_oscu: Handle None name of fresh unposted credit notes.** To reproduce the issue: - Create an invoice with some lines - Create the first credit note and change the product set on one of the lines or its quantity to trigger the fix piece of the code (do not confirm the credit note) - Create another credit note and try to post it -> Traceback The issue is caused by the fact that newly created moves generally have `None` in the `name` field, which is only populated after posting. This fix resolve this by replacing the string shown when the name field is None. opw-4779976 Forward-Port-Of: odoo/enterprise#85345
…tems When using OSS, the user has to put the OSS tag on the product. This test ensures the OSS tag is well propagated from the product to the accounting items representing the invoice line plus the generated tax lines. task_id: 4789153 Forward-Port-Of: odoo/enterprise#85859 Forward-Port-Of: odoo/enterprise#85381
Original PR description
…tems When using OSS, the user has to put the OSS tag on the product. This test ensures the OSS tag is well propagated from the product to the accounting items representing the invoice line plus the generated tax lines. task_id: 4789153 Forward-Port-Of: odoo/enterprise#85859 Forward-Port-Of: odoo/enterprise#85381
Fix qty_delivered when a rental order is processed through the PoS. This commit ensure that the PoS qty_delivered computation is done after the other calculation Steps to reproduce: ------------------- * Make a rental for 1 product * Open the sale order in PoS * Pay for the rental > Observation: The qty_delivered is set to 2 instead of 1 on the rental Why the fix: ------------ When the order is a rental processed through the PoS, we recompute the rental qty and add the PoS quantity
Original PR description
Fix qty_delivered when a rental order is processed through the PoS. This commit ensure that the PoS qty_delivered computation is done after the other calculation Steps to reproduce: ------------------- * Make a rental for 1 product * Open the sale order in PoS * Pay for the rental > Observation: The qty_delivered is set to 2 instead of 1 on the rental Why the fix: ------------ When the order is a rental processed through the PoS, we recompute the rental qty and add the PoS quantity to make sure that the value is correct. The computation is actually just the fusion of the PoS and rental _compute_qty_delivered methods. opw-4582505 Forward-Port-Of: odoo/enterprise#86022 Forward-Port-Of: odoo/enterprise#84768
Currently if you make a mistake in the name of your employee and create a payslip, it's name will never be corrected since there is no direct dependency on the field. Forward-Port-Of: odoo/enterprise#86201
Original PR description
Currently if you make a mistake in the name of your employee and create a payslip, it's name will never be corrected since there is no direct dependency on the field. Forward-Port-Of: odoo/enterprise#86201
Single app require an additional query. Let us fix runbot, and investigate when we have time (aka: haha). Forward-Port-Of: odoo/enterprise#86116
Original PR description
Single app require an additional query. Let us fix runbot, and investigate when we have time (aka: haha). Forward-Port-Of: odoo/enterprise#86116
pain.001.001.09 is a newer version of the ISO20022 format. Before this commit, we only supported it for SEPA Credit Transfer, using the same selection field as the one allowing to choose national variants of SEPA. This fix only intends to solve the issue for existing customers by using a system parameter that needs to be switched from "False" to "True". A cleaner solution will come in the future, after a refactoring of the payment methods. task-4647016 Forward-Port-Of: odoo/enterprise#86094
Original PR description
pain.001.001.09 is a newer version of the ISO20022 format. Before this commit, we only supported it for SEPA Credit Transfer, using the same selection field as the one allowing to choose national variants of SEPA. This fix only intends to solve the issue for existing customers by using a system parameter that needs to be switched from "False" to "True". A cleaner solution will come in the future, after a refactoring of the payment methods. task-4647016 Forward-Port-Of: odoo/enterprise#86094 Forward-Port-Of: odoo/enterprise#85597
Creating a temporary table each time reports are requested can lead to timeouts when there are millions of records inserted. This issue prevents clients from upgrading to 18.0, otherwise the reporting feature would be unusable for them. DBs already in 18.0 for which the issue is not happening at the moment will stop working as soon as enough data is added to the DB. In this patch we propose to switch to a view-based approach. This doesn't create any new data, and it is able to use exiting ind
Original PR description
Creating a temporary table each time reports are requested can lead to timeouts when there are millions of records inserted. This issue prevents clients from upgrading to 18.0, otherwise the…
Creating a temporary table each time reports are requested can lead to timeouts when there are millions of records inserted. This issue prevents clients from upgrading to 18.0, otherwise the reporting feature would be unusable for them. DBs already in 18.0 for which the issue is not happening at the moment will stop working as soon as enough data is added to the DB.
In this patch we propose to switch to a view-based approach. This doesn't create any new data, and it is able to use exiting indexes. The timing goes from minutes to seconds. The frontend is usable again.
Example of the data stored in the temp table:
```
=> select count(*) from analytic_temp_account_move_line
+----------+
| count |
|----------|
| 60669759 |
+----------+
```
The example DB has 31 "plan columns". In other words we are duplicating 31 times 1957089 rows. That's too much data. It's also a waste of space and time. Especially if we later issue more filtering commands as the report is refined in the frontend. This leads to current approach being unusable for some clients. In the example DB the timing is bigger than the standard timeout for frontend requests.
Planning and execution of for the insert in the temporary table:
```
Insert on analytic_temp_account_move_line (cost=0.86..6659742.75 rows=0 width=0) (actual time=209651.484..209651.487 rows=0 loops=1)
-> Subquery Scan on "*SELECT*" (cost=0.86..6659742.75 rows=157594266 width=548) (actual time=644.693..92507.579 rows=60669759 loops=1)
-> Result (cost=0.86..5083800.09 rows=157594266 width=548) (actual time=644.689..85762.552 rows=60669759 loops=1)
-> ProjectSet (cost=0.86..1143943.44 rows=157594266 width=366) (actual time=644.657..72959.699 rows=60669759 loops=1)
-> Merge Left Join (cost=0.86..317844.46 rows=5083686 width=486) (actual time=644.562..22711.962 rows=1957089 loops=1)
Merge Cond: (account_analytic_line.move_line_id = account_move_line.id)
-> Index Scan using account_analytic_line__move_line_id_index on account_analytic_line (cost=0.43..97499.67 rows=1957619 width=150) (actual time=641.529..7738.521 rows=1957089 loops=1)
Filter: (general_account_id IS NOT NULL)
Rows Removed by Filter: 136994
-> Materialize (cost=0.43..144877.29 rows=2272735 width=344) (actual time=3.014..13564.293 rows=3022715 loops=1)
-> Index Scan using account_move_line_pkey on account_move_line (cost=0.43..139195.45 rows=2272735 width=344) (actual time=3.005..11312.577 rows=2274827 loops=1)
Planning Time: 132.775 ms
JIT:
Functions: 78
Options: Inlining true, Optimization true, Expressions true, Deforming true
Timing: Generation 4.236 ms (Deform 2.533 ms), Inlining 64.617 ms, Optimization 351.121 ms, Emission 222.715 ms, Total 642.690 ms
Execution Time: 209672.536 ms
```
Planning and execution of a query based on the new view (note the usage of indexes from the actual tables):
```
Hash Join (cost=72813.40..294958.00 rows=7724 width=4) (actual time=1760.970..3493.933 rows=61 loops=1)
Hash Cond: (account_move_line.account_id = account_move_line__account_id.id)
-> Subquery Scan on account_move_line (cost=72794.39..294349.71 rows=223360 width=8) (actual time=1725.998..3477.187 rows=246 loops=1)
Filter: (account_move_line.analytic_distribution = ANY ('{1703,898,896,890,648,670,673,685,818,899,828,837,846,849,848,891,901,904,905,906,907,942,952,1039,980,985,1049,1050,1051,1093,1107,1114,1233,1126,1129,1133,1151,1152,1153,1222,1272,1218,1230,1243,1282,1249,1369,1271,1286,1328,1371,1396,1432,1403,1404,1406,1409,1430,1431,1437,1449,1473,1498,1515,1516,1517,1524,1525,1527,1528,1543,1549,1588,1592,1604,1605,1784,1641,1650,1652,1676,1677,1678,1679,1680,1702,1751,1759,1760,1767,1964,1796,1826,1832,1838,1926,1866,1883,1916,1922,1923,1954,1963,2144,1977,1974,2005,2011,2013,2015,2016,2032,2035,2037,2038,2064,2142,2097,2106,2110,2111,2112,2115,2121,2122,2130,2131,2141,2157,2311,2251,2252,2263,2269,2270,2271,2272,2274,2275,2279,2280,2287,2300,2307,2312,2316,2330,2339,2720,2370,2372,2423,2439,2462,2494,2477,2478,2480,2483,2491,2492,2493,2537,2533,2534,2535,2536,2546,2550,2551,2573,2574,2575,2576,2587,2598,2658,2691,2710,2721,2763}'::jsonb[]))
Rows Removed by Filter: 2617642
-> Gather (cost=72793.94..290647.16 rows=246807 width=910) (actual time=1720.216..3369.512 rows=2617888 loops=1)
Workers Planned: 1
Workers Launched: 1
-> Result (cost=71793.94..264966.46 rows=4500611 width=910) (actual time=1706.592..2884.302 rows=1308944 loops=2)
-> ProjectSet (cost=71793.94..197457.29 rows=4500611 width=12) (actual time=1706.573..2654.189 rows=1308944 loops=2)
-> Parallel Hash Join (cost=71793.94..173865.38 rows=145181 width=132) (actual time=1706.560..2554.799 rows=42224 loops=2)
Hash Cond: (account_move_line_1.id = account_analytic_line.move_line_id)
-> Parallel Index Scan using account_move_line__journal_id_index on account_move_line account_move_line_1 (cost=0.43..100906.82 rows=149368 width=4) (actual time=2.633..788.321 rows=126675 loops=2)
Index Cond: (journal_id = ANY ('{23,21,17}'::integer[]))
-> Parallel Hash (cost=67363.05..67363.05 rows=354437 width=136) (actual time=1699.502..1699.503 rows=421304 loops=2)
Buckets: 1048576 Batches: 1 Memory Usage: 54880kB
-> Parallel Index Scan using account_analytic_line__date_index on account_analytic_line (cost=0.43..67363.05 rows=354437 width=136) (actual time=9.963..1507.693 rows=421304 loops=2)
Index Cond: ((date <= '2024-12-31'::date) AND (date >= '2024-01-01'::date))
Filter: ((general_account_id IS NOT NULL) AND (company_id = 3))
Rows Removed by Filter: 57954
-> Hash (cost=18.65..18.65 rows=29 width=4) (actual time=16.619..16.620 rows=29 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 10kB
-> Index Scan using account_account__account_type_index on account_account account_move_line__account_id (cost=0.15..18.65 rows=29 width=4) (actual time=16.513..16.592 rows=29 loops=1)
Index Cond: ((account_type)::text = 'income'::text)
Planning Time: 75.050 ms
JIT:
Functions: 51
Options: Inlining false, Optimization false, Expressions true, Deforming true
Timing: Generation 4.433 ms (Deform 2.707 ms), Inlining 0.000 ms, Optimization 2.501 ms, Emission 30.127 ms, Total 37.061 ms
Execution Time: 3496.425 ms
```
OPW-4782916
Forward-Port-Of: odoo/enterprise#85942Because the customer statement buttons took too much space, the breadcrumb becomes invisible. This commit fixes always show the breadcrumb, and the buttons move instead. task-4583817 Forward-Port-Of: odoo/enterprise#81253
Original PR description
Because the customer statement buttons took too much space, the breadcrumb becomes invisible. This commit fixes always show the breadcrumb, and the buttons move instead. task-4583817 Forward-Port-Of: odoo/enterprise#81253
…atch Batch generation currently takes contract templates, which it should not Forward-Port-Of: odoo/enterprise#86120
Original PR description
…atch Batch generation currently takes contract templates, which it should not Forward-Port-Of: odoo/enterprise#86120