Tuesday, March 11, 2025
36 changes · saas-18.2
Resolved issues and error corrections
Portal address updates now avoid overwriting the company name when the address is a child contact rather than the customer's main commercial entity. This prevents backend customer records from showing the wrong company information after a portal user edits an address.
Original PR description
Despite being already readonly on child addresses, the company name was still being submitted and set on the partner address when updated through the portal. Steps to reproduce: * Create company for Joel Willis * Update their address through the portal (logged in as portal user) * The created company isn't shown on Joel Willis form view (backend) The res partner form view is configured to show the company name if set, instead of the parent company. To avoid this issue, we simply pop the company name when the updated address isn't the address commercial entity of the current customer. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Accounting tests no longer depend on demo data being installed when loading chart templates. This prevents test failures in environments without demo data while keeping normal demo-data installations unchanged.
Original PR description
`install_demo=True` should not be used when loading account chart templates during tests as they rely on demo data which is not guaranteed to be installed. Runbot Error 134673
Duplicating an appraisal goal no longer fails when the original goal has no deadline set. This prevents interruptions for HR users managing appraisal goals and keeps the duplication workflow reliable.
Original PR description
Handle the case where goal.deadline is False when the goal is duplicated.
Payslip report line titles now have more space, reducing the chance that longer labels appear cramped or unclear. This makes payroll documents easier to read for employees and payroll teams.
Original PR description
task-4610498
Miscellaneous changes
Forward-Port-Of: odoo/odoo#199458
Original PR description
Forward-Port-Of: odoo/odoo#199458
in this commit, we improve the method to look for indeterminisms in the tours. The method waits a certain amount of time once the trigger has been found and then checks if the element is still visible, if it has changed or if it has undergone mutations. We take advantage of this commit to also improve the method to find the trigger in the DOM (we check that body does not have the class o_is_blocked and that the frame is is-ready=true if the element is in an iframe) Forward-Port-Of: odoo/
Original PR description
in this commit, we improve the method to look for indeterminisms in the tours. The method waits a certain amount of time once the trigger has been found and then checks if the element is still visible, if it has changed or if it has undergone mutations. We take advantage of this commit to also improve the method to find the trigger in the DOM (we check that body does not have the class o_is_blocked and that the frame is is-ready=true if the element is in an iframe) Forward-Port-Of: odoo/odoo#198596
This commit orders the stock valuation layer of multiple stock moves by product to make sure the assert targets the right layer index in the loop. runbot: 99086 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#199552
Original PR description
This commit orders the stock valuation layer of multiple stock moves by product to make sure the assert targets the right layer index in the loop. runbot: 99086 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#199552
Since test-file are now used as test-tags, module part of a test-tags needs to support dots in the path. Forward-Port-Of: odoo/odoo#201064
Original PR description
Since test-file are now used as test-tags, module part of a test-tags needs to support dots in the path. Forward-Port-Of: odoo/odoo#201064
…ot used and give warning on the log Description of the issue/feature this PR addresses: it not an issue but unnecessary overridden 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#200819 Forward-Port-Of: odoo/odoo#200060
Original PR description
…ot used and give warning on the log Description of the issue/feature this PR addresses: it not an issue but unnecessary overridden 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#200819 Forward-Port-Of: odoo/odoo#200060
#### Description of the issue/feature this PR addresses: When updating an allocation's number_of_days, a validation check is performed to ensure that we do not reduce the `number_of_days` to be less than the number of leaves that are taken by the employee. However this logic also takes into consideration any virtual leaves (leaves that are in the `confirm` or `validate1` state, ie. leaves that are awaiting an approval) that may have been requested by an employee. These virtual leaves that ar
Original PR description
#### Description of the issue/feature this PR addresses: When updating an allocation's number_of_days, a validation check is performed to ensure that we do not reduce the `number_of_days` to be less…
#### Description of the issue/feature this PR addresses: When updating an allocation's number_of_days, a validation check is performed to ensure that we do not reduce the `number_of_days` to be less than the number of leaves that are taken by the employee. However this logic also takes into consideration any virtual leaves (leaves that are in the `confirm` or `validate1` state, ie. leaves that are awaiting an approval) that may have been requested by an employee. These virtual leaves that are not yet approved should not count towards the calculation since it could be possible that the employer could refuse them or the employee's accrual plan could grant sufficient leaves if it is requested for a future date. #### Current behavior before PR: 1. Setup a timeoff type that requires approval from the manager 2. Set up an accrual plan where an employee accrues '_N_' days of leave at the start of each year with **no carryover** (NOTE: the no carryover is the most crucial step because this is what writes the number_of_days on the leave allocation to zero) 3. Request a leave by an employee for any date after the carryover period. What should have happened: The accrual should reset the leaves based on no carryover policy back to _N_ days However, it throws a validation error: Now the issue happens because when we see that the carryover is none because of which: 1. The allocated leaves are set to 0 when calling this CRON (for no carryover): https://github.com/odoo/odoo/blob/cf18c4ac88919513a9f2b922d625fa5dc113cb39/addons/hr_holidays/models/hr_leave_allocation.py#L527 2. The leave that was requested by the employee but not yet approved causes the validation to fail. It is best explained in the below screen recording which uses the test case mentioned in the commit: https://github.com/user-attachments/assets/f8914bac-815d-48c9-b4b2-c132a2fccbdb   #### Desired behavior after PR is merged: Virtual Leaves that are not yet approved would not block us from updating the allocation's `number_of_days` opw-4442471 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#200404 Forward-Port-Of: odoo/odoo#198382
Steps to reproduce: - Let's consider an internal user U with acces rights to Survey - Let's consider a survey S with access mode set to 'Invited People only' - Try to print survey S with U Bug: U is redirected to a blank page When a survey is set to 'Invited People only', internal users could not print the survey. opw:4576125 Forward-Port-Of: odoo/odoo#199625
Original PR description
Steps to reproduce: - Let's consider an internal user U with acces rights to Survey - Let's consider a survey S with access mode set to 'Invited People only' - Try to print survey S with U Bug: U is redirected to a blank page When a survey is set to 'Invited People only', internal users could not print the survey. opw:4576125 Forward-Port-Of: odoo/odoo#199625
Before this commit a captcha would always be required upon submitting to /web/login. This makes sense to prevent brute force attacks against passwords. However this does not make sense in the context of webauthn. Therefore we make sure captcha is only verified when using the password credential type. Forward-Port-Of: odoo/odoo#199627
Original PR description
Before this commit a captcha would always be required upon submitting to /web/login. This makes sense to prevent brute force attacks against passwords. However this does not make sense in the context of webauthn. Therefore we make sure captcha is only verified when using the password credential type. Forward-Port-Of: odoo/odoo#199627
Currently, when you make a os order, close the session an then re-open it without going through the backend, the starting tracking number is related to the previous session. Steps to reproduce: ------------------- * Open pos shop * Make an order and pay it * Select **New order** * Close the session, do not go in the backend * Re-open the session > Observation: The tracking number is like `X03`. If we make an order, the tracking number will then be `(X+1)01`. Why the fix: ---------
Original PR description
Currently, when you make a os order, close the session an then re-open it without going through the backend, the starting tracking number is related to the previous session. Steps to reproduce: ------------------- * Open pos shop * Make an order and pay it * Select **New order** * Close the session, do not go in the backend * Re-open the session > Observation: The tracking number is like `X03`. If we make an order, the tracking number will then be `(X+1)01`. Why the fix: ------------ When closing the register the current order is marked as cancelled and a reloading of the page is done. When reloading, the `onMounted` of the product screen is triggered which creates a new order. We will condition the effect of the `onMounted` in a `useEffect` so that we don't create new orders when we are closing the session. opw-4435140 Forward-Port-Of: odoo/odoo#200589 Forward-Port-Of: odoo/odoo#194666
Previously: - Zero-priced combo products could always be sold on eCommerce. However, this shouldn't be allowed if `prevent_zero_price_sale` is enabled. - Zero-priced combo items couldn't be sold on eCommerce if `prevent_zero_price_sale` was enabled. However, this should always be allowed since only the price of the combo product matters (not its items). Forward-Port-Of: odoo/odoo#199755
Original PR description
Previously: - Zero-priced combo products could always be sold on eCommerce. However, this shouldn't be allowed if `prevent_zero_price_sale` is enabled. - Zero-priced combo items couldn't be sold on eCommerce if `prevent_zero_price_sale` was enabled. However, this should always be allowed since only the price of the combo product matters (not its items). Forward-Port-Of: odoo/odoo#199755
Normally a `date` and a `datetime` compare `False`. For some reason however a `datetime` and a `freezegun.api.FakeDate` compare equal as long as the datetime's date part matches the fakedate's... until Python 3.13, when it stop working. I've no idea why it ever worked, but it's completely unnecessary, we can just get the reference datetime's `date()` part and compare that to the date. upstream issue: spulec/freezegun#568 Forward-Port-Of: odoo/odoo#200978
Original PR description
Normally a `date` and a `datetime` compare `False`. For some reason however a `datetime` and a `freezegun.api.FakeDate` compare equal as long as the datetime's date part matches the fakedate's... until Python 3.13, when it stop working. I've no idea why it ever worked, but it's completely unnecessary, we can just get the reference datetime's `date()` part and compare that to the date. upstream issue: spulec/freezegun#568 Forward-Port-Of: odoo/odoo#200978
maxmind decided to remove support for `raw_response` and chhange the API of Country/City to take all the raw_response components by keywords instead (maxmind/GeoIP2-python@4518919151e1b39bd544df653b41cd155dc2f708). This leads to location mocking not working anymore, which leads to the failure of `:TestWebsiteSaleCart.test_cart_new_fpos_from_geoip` when using geoip2 5.0. When mocking the request with a country code set, just try the new API then fallback on the old one (note: the commit also
Original PR description
maxmind decided to remove support for `raw_response` and chhange the API of Country/City to take all the raw_response components by keywords instead (maxmind/GeoIP2-python@4518919151e1b39bd544df653b41cd155dc2f708). This leads to location mocking not working anymore, which leads to the failure of `:TestWebsiteSaleCart.test_cart_new_fpos_from_geoip` when using geoip2 5.0. When mocking the request with a country code set, just try the new API then fallback on the old one (note: the commit also removes the `locales` default fallback, so make that explicit). Forward-Port-Of: odoo/odoo#200980
New purchases/sales ledger tax report for Bulgaria. In additional, we add few fields on account_journal and account_move, to deal with the 2 new reports. task-4280578 linked:https://github.com/odoo/enterprise/pull/74258 Forward-Port-Of: odoo/odoo#187779
Original PR description
New purchases/sales ledger tax report for Bulgaria. In additional, we add few fields on account_journal and account_move, to deal with the 2 new reports. task-4280578 linked:https://github.com/odoo/enterprise/pull/74258 Forward-Port-Of: odoo/odoo#187779
Description of the issue/feature this PR addresses: Spurious log entries Current behavior before PR: Odoo [logs](https://github.com/odoo/odoo/blob/17.0/odoo/modules/registry.py#L653-L654) indexes created by [_sync_plan_column](https://github.com/odoo/odoo/blob/17.0/addons/analytic/models/analytic_plan.py#L281) as unexpected Desired behavior after PR is merged: No log entry for expected index Steps to reproduce: - create a new analytic plan, ie 'Test plan' - go to technical/database
Original PR description
Description of the issue/feature this PR addresses: Spurious log entries Current behavior before PR: Odoo [logs](https://github.com/odoo/odoo/blob/17.0/odoo/modules/registry.py#L653-L654) indexes…
Description of the issue/feature this PR addresses: Spurious log entries
Current behavior before PR: Odoo [logs](https://github.com/odoo/odoo/blob/17.0/odoo/modules/registry.py#L653-L654) indexes created by [_sync_plan_column](https://github.com/odoo/odoo/blob/17.0/addons/analytic/models/analytic_plan.py#L281) as unexpected
Desired behavior after PR is merged: No log entry for expected index
Steps to reproduce:
- create a new analytic plan, ie 'Test plan'
- go to technical/database structure/fields, search for the custom field created on model account.analytic.line, named `x_plan{the id of the plan you created in step 1}_id`
- observe the field is not marked as indexed, even though the code creates an index
- update the analytic module, observe there will be an entry of the form `Keep unexpected index account_analytic_line__x_plan{the id of the plan you created in step 1}_id_index on table account_analytic_line`
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#200764
Forward-Port-Of: odoo/odoo#189240Merging orders of two tables in POS restaurant only applies the product tax on the order lines of the destination table. How to reproduce the issue: - In pos select table 1 and order a product. - Select table 2 and order another product. - Merge table 1 into table 2. In Orders/Orders the pos order corresponding to the merged time does not have the tax displayed for the lines of table 1. In pos_store of pos_restaurant in mergeOrders the tax_ids in serializedLine for formated for ORM
Original PR description
Merging orders of two tables in POS restaurant only applies the product tax on the order lines of the destination table. How to reproduce the issue: - In pos select table 1 and order a product. - Select table 2 and order another product. - Merge table 1 into table 2. In Orders/Orders the pos order corresponding to the merged time does not have the tax displayed for the lines of table 1. In pos_store of pos_restaurant in mergeOrders the tax_ids in serializedLine for formated for ORM commands instead of storing the tax ID directly. Merging only the test for the fw port since the issue is resolved by https://github.com/odoo/odoo/commit/f4d78deb034e61402ffe3ac41392a37cbabbf840 opw-4563168 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#199089
### Steps to reproduce: - create a new quotation with configured quotation template - the descriptions are added by default (thanks to the template) - confirm the SO - the task is created, but it shows the description in the title (instead of the name of the product) and the description tab is empty ### Cause: In 'Quotation Templates' the description of each line is being stored under the name of 'name' so when using this quotation template in an SO the SO line name will be the templ
Original PR description
### Steps to reproduce: - create a new quotation with configured quotation template - the descriptions are added by default (thanks to the template) - confirm the SO - the task is created, but it…
### Steps to reproduce: - create a new quotation with configured quotation template - the descriptions are added by default (thanks to the template) - confirm the SO - the task is created, but it shows the description in the title (instead of the name of the product) and the description tab is empty ### Cause: In 'Quotation Templates' the description of each line is being stored under the name of 'name' so when using this quotation template in an SO the SO line name will be the template line name not the product name + the description and so when creating the task we use the name of the SO line which in that case will be the description. ### Fix: We are checking if we have a quotation template or not and if we don't we use the name of the SO line to get the name and the description of the task if we have a quotation template we use the product name for the name of the task and the name of the template line as a description. opw-4482867 Forward-Port-Of: odoo/odoo#195649
- disable duplicate for interviewer_ids - add `(copy)` to the name Task: 4606811 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#199935
Original PR description
- disable duplicate for interviewer_ids - add `(copy)` to the name Task: 4606811 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#199935
Currently, an exception is raised when the user clicks on the catalog in a quotation if a product has no assigned category. Steps to Reproduce: 1. Install the sale_management module. 2. Navigate to Sales -> Configuration -> Settings. 3. Enable the Pricelists. 4. Open a new Pricelists -> Add a Price Rules with Apply To `Category`, select a category, and save. 5. Go to Products -> Products. 6. Open an existing product and remove its product category. 7. Go to Sales -> Orders -> New Quo
Original PR description
Currently, an exception is raised when the user clicks on the catalog in a quotation if a product has no assigned category. Steps to Reproduce: 1. Install the sale_management module. 2. Navigate to…
Currently, an exception is raised when the user clicks on the catalog in a quotation if a product has no assigned category. Steps to Reproduce: 1. Install the sale_management module. 2. Navigate to Sales -> Configuration -> Settings. 3. Enable the Pricelists. 4. Open a new Pricelists -> Add a Price Rules with Apply To `Category`, select a category, and save. 5. Go to Products -> Products. 6. Open an existing product and remove its product category. 7. Go to Sales -> Orders -> New Quotation. 8. Select the created Pricelists, and click on Catalog. 9. An error occurs. Error: `AttributeError 'bool' object has no attribute 'startswith' ` This issue [1] occurs because when the user tries to access product category, the product category is not provided, as it is not a required field. [1] - https://github.com/odoo/odoo/blob/4bf8fc4c43ab7d8fd923aaaea8c6423c9a16e428/addons/product/models/product_pricelist_item.py#L481 This fix resolves the issue by ensuring that the product category exists before trying to access it. sentry-6320016916 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#200306
Currently, an error occurs when while adding a private/public key in the certificate and key has no 'content' (Key file). Step to produce: - Install the ```certificate``` module. - Go to Settings, Click on 'certificates' which is in the Certificates and Keys section - Create a new certificate, add a name and valid certificate file. - Create a ```Private Key``` or ```Public Key``` from the certificate form view and try to save the record. ```TypeError: argument should be a bytes-like
Original PR description
Currently, an error occurs when while adding a private/public key in the certificate and key has no 'content' (Key file). Step to produce: - Install the ```certificate``` module. - Go to Settings,…
Currently, an error occurs when while adding a private/public key in the certificate and key has no 'content' (Key file). Step to produce: - Install the ```certificate``` module. - Go to Settings, Click on 'certificates' which is in the Certificates and Keys section - Create a new certificate, add a name and valid certificate file. - Create a ```Private Key``` or ```Public Key``` from the certificate form view and try to save the record. ```TypeError: argument should be a bytes-like object or ASCII string, not 'bool'``` An error occurs because a user can directly create a certificate's private/public key from the certificate form view without adding any content that is required true in ```certificate.key``` model, so an error occurs when the system tries to decode the content of private/public key at [1], but it is not available. Link [1]: https://github.com/odoo/odoo/blob/2be7f413493a6ad43980eb031b8383deb3a706c0/addons/certificate/models/key.py#L157-L160 To resolve this issue, remove the 'create' option for private/public keys from certificate form view Sentry-5993525387 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#183870
Before this commit, when the user creates a custom filter in SO model to select the SO in which there is at least one task linked to a specific project, he got an error saying the domain is invalid. This commit fixes the issue by improving the search method implementing for the `task_ids` field to make sure the search view supports a query contained inside `value` parameter. Steps to reproduce the issue: ---------------------------- 0. Install `sale_timesheet` module with demo data
Original PR description
Before this commit, when the user creates a custom filter in SO model to select the SO in which there is at least one task linked to a specific project, he got an error saying the domain is invalid.…
Before this commit, when the user creates a custom filter in SO model to select the SO in which there is at least one task linked to a specific project, he got an error saying the domain is invalid. This commit fixes the issue by improving the search method implementing for the `task_ids` field to make sure the search view supports a query contained inside `value` parameter. Steps to reproduce the issue: ---------------------------- 0. Install `sale_timesheet` module with demo data 1. Go to Sales app 2. Creates a custom filter and select `Tasks associated to this sale > Project` as left part, `=` as operator (second field in the custom filter) and `After sales-service` as project (right part, last field in the custom filter). 3. Apply the custom filter Expected behavior: ----------------- The custom filter should be applied without any issue. Current behavior: ---------------- The user has an error saying the domain is invalid when he tries to save/apply his custom filter. Forward-Port-Of: odoo/odoo#200975 Forward-Port-Of: odoo/odoo#200130
Currently, when `marketing_automation_whatsapp` is installed, marketing automation campaign statistics are not computed correctly. ### Steps to Reproduce 1. Install `marketing_automation_whatsapp`. 2. Create a marketing automation campaign with an email activity. 3. Ensure one or more traces are rejected (e.g., by using invalid email addresses). 4. View the activity statistics. Expected Result: The rejected count on the right correctly displays the number of rejected traces. Actu
Original PR description
Currently, when `marketing_automation_whatsapp` is installed, marketing automation campaign statistics are not computed correctly. ### Steps to Reproduce 1. Install `marketing_automation_whatsapp`.…
Currently, when `marketing_automation_whatsapp` is installed, marketing automation campaign statistics are not computed correctly. ### Steps to Reproduce 1. Install `marketing_automation_whatsapp`. 2. Create a marketing automation campaign with an email activity. 3. Ensure one or more traces are rejected (e.g., by using invalid email addresses). 4. View the activity statistics. Expected Result: The rejected count on the right correctly displays the number of rejected traces. Actual Result: The rejected count on the right always displays `0`, even when rejected traces exist. ### Cause The `marketing_automation_whatsapp` module overrides `_get_full_statistics` to include WhatsApp-related statistics in addition to the marketing data. However, the override currently concatenates the results from the base `_get_full_statistics` and the WhatsApp-specific statistics. And because `MarketingActivity._compute_statistics` doesn't expect `_get_full_statistics` to return multiple entries for a given `activity_id`, the values from the WhatsApp-specific results end up overwriting the base values. opw-4292488 opw-4523885 opw-4585705 opw-4585779 Forward-Port-Of: odoo/enterprise#79348
This commit add a new xml export (DES) for intrastat report. Regarding the legal specifications at: https://www.douane.gouv.fr/sites/default/files/uploads/files/2020-10/ManuelDesXML.pdf task-4402569 Forward-Port-Of: odoo/enterprise#77866
Original PR description
This commit add a new xml export (DES) for intrastat report. Regarding the legal specifications at: https://www.douane.gouv.fr/sites/default/files/uploads/files/2020-10/ManuelDesXML.pdf task-4402569 Forward-Port-Of: odoo/enterprise#77866
When users attempt to send a template with 10 body variables, the sample values for `Free Text 1` and `Free Text 10` are swapped. Steps to Produce: - Create a template with 10 body variables - Give sample value for `Body - {{1}}` as 1 and `Body - {{10}}` as 10 - Open the WhatsApp composer using the created template - `Free text 1` will have a value of 10 instead of 1 - `Free text 10` will have a value of 1 instead of 10 Problem: The variables are sorted by name, causing `{{10}}`
Original PR description
When users attempt to send a template with 10 body variables, the sample values for `Free Text 1` and `Free Text 10` are swapped.
Steps to Produce:
- Create a template with 10 body variables
- Give sample value for `Body - {{1}}` as 1 and `Body - {{10}}` as 10
- Open the WhatsApp composer using the created template
- `Free text 1` will have a value of 10 instead of 1
- `Free text 10` will have a value of 1 instead of 10
Problem:
The variables are sorted by name, causing `{{10}}` to appear before `{{1}}`, which leads to the values being swapped.
Solution:
Sort the variables by extracting the index from the variable name, so they are ordered numerically rather than alphabetically.
Task-4212923
Forward-Port-Of: odoo/enterprise#71307This commit fixes the style of the pin counter on the map view. The counter didn't display the number correctly. task-4544732 Forward-Port-Of: odoo/enterprise#80352
Original PR description
This commit fixes the style of the pin counter on the map view. The counter didn't display the number correctly. task-4544732 Forward-Port-Of: odoo/enterprise#80352
This commit restores the position of the working schedule dropdown to be just below the label in the salary configurator, like in previous versions.  The cause of the issue is that the SelectMenuWrapper component is attached just after the invisible select element: https://github.com/odoo/enterprise/blob/9f6a4f0697edcc9330ad7976c6602d892e7b6ef9/hr_contract_salary/static/src/js/hr_contract_salary.js#L69-L71
Original PR description
This commit restores the position of the working schedule dropdown to be just below the label in the salary configurator, like in previous versions.…
This commit restores the position of the working schedule dropdown to be just below the label in the salary configurator, like in previous versions.  The cause of the issue is that the SelectMenuWrapper component is attached just after the invisible select element: https://github.com/odoo/enterprise/blob/9f6a4f0697edcc9330ad7976c6602d892e7b6ef9/hr_contract_salary/static/src/js/hr_contract_salary.js#L69-L71 But before other elements are placed in the DOM between them. A solution is to add a wrapper div around the selection, ensuring the `SelectMenuWrapper` component is attached inside that div, and further elements placed in the DOM after the wrapper div. **Steps to reproduce** - Install hr_contract_salary_payroll - Select any employee contract > Generate offer > Salary configurator - Add `part?=80` (any value != 100) at the end of URL opw-4496279 Forward-Port-Of: odoo/enterprise#79966
This commit improves the tool tip and the presentation of the quality control random view. When you set a quality point to "random" with a percentage of 20% and process a transfer of 100 units, it does not mean that exactly 20% of the transfer will be inspected. Instead, each unit has a 20% probability of being checked. For example, if you process ten transfers of 100 units each, you might get 18 quality checks in one transfer, 10 in another, 25 in the next, and so on. The key point is tha
Original PR description
This commit improves the tool tip and the presentation of the quality control random view. When you set a quality point to "random" with a percentage of 20% and process a transfer of 100 units, it does not mean that exactly 20% of the transfer will be inspected. Instead, each unit has a 20% probability of being checked. For example, if you process ten transfers of 100 units each, you might get 18 quality checks in one transfer, 10 in another, 25 in the next, and so on. The key point is that, statistically, approximately 20% of your total quantities will be inspected over multiple transfers. opw-4527413 Forward-Port-Of: odoo/enterprise#80884 Forward-Port-Of: odoo/enterprise#80482
Purpose ======= In the Facebook settings, a user can ask an application (eg Social) to remove his data. If the deletion is not implemented, it should be done manually for each user, and so we want to automate that process. Technical ========= The deletion process is done in that order: 1. The user go to his settings and ask Odoo to remove the data we have 2. Facebook will hit an endpoint in IAP, with a signature, and the Facebook user id 3. IAP will reach the database, (with a shar
Original PR description
Purpose ======= In the Facebook settings, a user can ask an application (eg Social) to remove his data. If the deletion is not implemented, it should be done manually for each user, and so we want to…
Purpose
=======
In the Facebook settings, a user can ask an application (eg Social) to remove his data.
If the deletion is not implemented, it should be done manually for each user, and so we want to automate that process.
Technical
=========
The deletion process is done in that order:
1. The user go to his settings and ask Odoo to remove the data we have
2. Facebook will hit an endpoint in IAP, with a signature, and the Facebook user id
3. IAP will reach the database, (with a shared secret to authenticate itself) and that endpoint will remove the social accounts, and also the social posts / templates if the account is selected
We do it that way, instead of having a CRON on the client database, because we are able to know if the user uninstalled social, or if he already removed the account.
If the database is not reachable from the internet, we will have it's dbuuid, and so, we will be able to take an action.
Authentication
==============
IAP needs to authenticate to the Odoo database,
so both need to share a secret.
That secret can not be the extended token,
because we don't store it on the Odoo side.
That secret is derived from the database secret, and sent when we ask the Facebook URL (in python, without a browser redirection), so the social user can not see it (otherwise, he will be able to bypass company access rules, and delete the social accounts of different company).
Setup
=====
1. Start Odoo and IAP instances
2. Start ngrok on the IAP port
3. In the Facebook settings ("Facebook Login For Business" -> Settings)
- Add <ngrok_url>/api/social/facebook/1/callback in the Facebook settings
- Add <ngrok_url>/api/social_facebook/1/deletion_callback in the Facebook settings
4. Add the Facebook credentials in the IAP settings
5. In the Odoo db, add the system parameter `social.social_iap_endpoint` with the ngrok url
6. In the IAP db, change the system parameter `web.base.url` with the ngrok url
7. In the IAP code, in `facebook_controller.py`, comment the dbuid check `_check_has_access`
8. Add your accounts
9. Go to `https://www.facebook.com/settings/?tab=business_tools`, and remove the app
10. Go to the "Removed" tab, then "View Details" and click on "Send Request"
Task-4350697
Forward-Port-Of: odoo/enterprise#79992
Forward-Port-Of: odoo/enterprise#74865New purchases/sales ledger tax report for Bulgaria. In additional, we add few fields on account_journal and account_move, to deal with the 2 new reports. task-4280578 linked:https://github.com/odoo/odoo/pull/187779 Forward-Port-Of: odoo/enterprise#74258
Original PR description
New purchases/sales ledger tax report for Bulgaria. In additional, we add few fields on account_journal and account_move, to deal with the 2 new reports. task-4280578 linked:https://github.com/odoo/odoo/pull/187779 Forward-Port-Of: odoo/enterprise#74258
Overrides xml and xlsx export for Estonia intrastat because the current columns of the default intrastat report don't match with estonian government requirements. More information can be found at those addresses: - Arrivals: https://www.stat.ee/en/questionnaires/intrastat-arrivals-2024-month - Dispatches: https://www.stat.ee/en/questionnaires/intrastat-dispatches-2024-month task-3989930 Forward-Port-Of: odoo/enterprise#80990 Forward-Port-Of: odoo/enterprise#71114
Original PR description
Overrides xml and xlsx export for Estonia intrastat because the current columns of the default intrastat report don't match with estonian government requirements. More information can be found at those addresses: - Arrivals: https://www.stat.ee/en/questionnaires/intrastat-arrivals-2024-month - Dispatches: https://www.stat.ee/en/questionnaires/intrastat-dispatches-2024-month task-3989930 Forward-Port-Of: odoo/enterprise#80990 Forward-Port-Of: odoo/enterprise#71114
Versions: ----------- - 17.0 Steps to reproduce: ------------------------- - go to timesheet module - click on grid cell Issue: ------- The action helper in web grid was resulting in only the web content being displayed in the timesheet grid and so helper was missing Cause: --------- The action helper was being called from web_grid, causing a lack of content in the timesheet_grid. Solution: ----------- Create a dedicated function to retrieve the no-content helper, enhanc
Original PR description
Versions: ----------- - 17.0 Steps to reproduce: ------------------------- - go to timesheet module - click on grid cell Issue: ------- The action helper in web grid was resulting in only the web content being displayed in the timesheet grid and so helper was missing Cause: --------- The action helper was being called from web_grid, causing a lack of content in the timesheet_grid. Solution: ----------- Create a dedicated function to retrieve the no-content helper, enhancing portability for easy customization. task-3429403 Forward-Port-Of: odoo/enterprise#80784 Forward-Port-Of: odoo/enterprise#56158
Before this commit, the map view removed the routes after reordering the items. Now, the routes are kept and the path recalculated. task-4493063 Forward-Port-Of: odoo/enterprise#80359
Original PR description
Before this commit, the map view removed the routes after reordering the items. Now, the routes are kept and the path recalculated. task-4493063 Forward-Port-Of: odoo/enterprise#80359
Since 18.0, the name field of draft invoice is false instead of "/", this causes an issue in the name replace as we try to use the replace() method on a False boolean. Forward-Port-Of: odoo/enterprise#80922
Original PR description
Since 18.0, the name field of draft invoice is false instead of "/", this causes an issue in the name replace as we try to use the replace() method on a False boolean. Forward-Port-Of: odoo/enterprise#80922