Monday, April 28, 2025
40 changes · saas-18.1
Resolved issues and error corrections
Orders in the Point of Sale preparation display no longer appear with the title "false" when a custom floating order name is unavailable. The display now falls back to the order tracking number, making kitchen or preparation workflows clearer for staff.
Original PR description
Steps to reproduce: ------------------- 1. Set up the preparation display for a PoS shop. 2. Open that PoS shop, and make an order. 3. Open the Preparation Display. -> Observed behavior: The order is shown in the preparation display, however, with a title of "false". The reason: ----------- Commit 79948eb8d38c765b2fd8703812ed9da94c197 used `floating_order_name` as the order title for the order card on the preparation display gant view. However, `floating_order_name` is not always defined, like for the case described in the reproduction steps above etc. The fix: -------- We fallback to `tracking_number` as the title of the order card, as it was the case before 79948eb8d38c765b2fd8703812ed9da94c197. opw-4597248
This update fixes errors in internal subscription sales tests that were causing build failures. It helps ensure subscription invoicing checks run reliably, reducing the risk of release delays from broken automated tests.
Original PR description
This commit address keyerror `default_pricelist` which is already defined in superclass but not used in the test case. and This commit fixes a `Field error` in the `test_postpaid_next_invoice_date` test case in the `sale_subscription` module. The error was caused by referencing an invalid field name (`tax_id`) on the `sale.order.line` model during the creation of a sale order. The correct field name, `tax_ids`, has been used instead. build_error-181599
This fixes the model creation setup so the company-specific record option appears only when multiple companies are enabled. It prevents confusion for single-company users while restoring the needed configuration for businesses operating across several companies.
Original PR description
Following 002df5f10d2378bab139ea5d59af7be3d6b40358 which made an error. When creating a new model, the feature that make a record specific to a company (ie: "use_company" -- just adds a field "company_id" on a model) should not be available when in single company mode, but should be available when in multicompany mode opw-4752832
Miscellaneous changes
This commit disable both protection upon neutralizing a db by removing the tokens. Manual forward port of #207020 opw-4734555 upg-2759374 Forward-Port-Of: odoo/odoo#207684
Original PR description
This commit disable both protection upon neutralizing a db by removing the tokens. Manual forward port of #207020 opw-4734555 upg-2759374 Forward-Port-Of: odoo/odoo#207684
Versions -------- - saas-17.4+ Steps ----- 1. Create a SO for non-user client; 2. add a product that isn't published on the website; 3. confirm SO; 4. create downpayment; 5. copy share SO link; 6. open link in private window. Issue ----- > 500: Internal Server Error > Error while render the template > ValueError: Expected singleton: product.product() Cause ----- Commit 9aa52dd6418e removed the creation of a "Down payment" product. Before it, order lines were either of typ
Original PR description
Versions -------- - saas-17.4+ Steps ----- 1. Create a SO for non-user client; 2. add a product that isn't published on the website; 3. confirm SO; 4. create downpayment; 5. copy share SO link; 6.…
Versions -------- - saas-17.4+ Steps ----- 1. Create a SO for non-user client; 2. add a product that isn't published on the website; 3. confirm SO; 4. create downpayment; 5. copy share SO link; 6. open link in private window. Issue ----- > 500: Internal Server Error > Error while render the template > ValueError: Expected singleton: product.product() Cause ----- Commit 9aa52dd6418e removed the creation of a "Down payment" product. Before it, order lines were either of type `display_section` or they had a `product_id` value. After the commit, a third option is for `is_downpayment` to be true. This regressed the fix to this issue added by 34d4ffa01d57d, as instead of ensuring lines have a `product_id` value before checking if reorder is allowed, it decided to check whether they're not of `display_type`. Solution -------- Ensure there's a `product_id` in `sale.order.line` instead of only relying on the caller to filter those out beforehand. opw-4711297 Forward-Port-Of: odoo/odoo#207060 Forward-Port-Of: odoo/odoo#206435
In Romania, when sending multiple invoices to e-Factura, if one invoice is rejected, the Send & Print wizard will raise a UserError at https://github.com/odoo/odoo/blob/9416ca8cb63fc53a862aa8533dfa60ba33506191/addons/account/wizard/account_move_send.py#L461 This causes the transaction to get rolled back, and any successfully-sent invoices to be lost. Solution: Commit after each invoice is sent. opw-4630496 Forward-Port-Of: odoo/odoo#206901 Forward-Port-Of: odoo/odoo#205593
Original PR description
In Romania, when sending multiple invoices to e-Factura, if one invoice is rejected, the Send & Print wizard will raise a UserError at https://github.com/odoo/odoo/blob/9416ca8cb63fc53a862aa8533dfa60ba33506191/addons/account/wizard/account_move_send.py#L461 This causes the transaction to get rolled back, and any successfully-sent invoices to be lost. Solution: Commit after each invoice is sent. opw-4630496 Forward-Port-Of: odoo/odoo#206901 Forward-Port-Of: odoo/odoo#205593
Steps to reproduce [17.1]: - Add a property field to a job application in the backend. - Go to the linked website job application form (in edit mode). - The property field is inaccessible. To be able to access the new property field in the application form, the `job_id` value of the related job record needs to be specified by default. Unfortunately, these values are removed before accessing "edit" mode: Starting from [1], a fix was added to clear default values coming from `data-f
Original PR description
Steps to reproduce [17.1]: - Add a property field to a job application in the backend. - Go to the linked website job application form (in edit mode). - The property field is inaccessible. To be able…
Steps to reproduce [17.1]: - Add a property field to a job application in the backend. - Go to the linked website job application form (in edit mode). - The property field is inaccessible. To be able to access the new property field in the application form, the `job_id` value of the related job record needs to be specified by default. Unfortunately, these values are removed before accessing "edit" mode: Starting from [1], a fix was added to clear default values coming from `data-for` attributes when the form is edited (at `cleanForSave()`) to prevent saving it with changed default values. Since the code from [1] can also remove default values set by the user, a new fix (see [2]) updated this implementation to ensure that only values from auto-fill and data-for fields will be removed (this time, when the form public widget is destroyed [3]). The behaviour from [3] will always unlink the `data-for` values in edit mode, and as a consequence, the related property fields won't be correctly retrieved. The goal of this commit is to fix this behaviour by excluding `data-for` values from the reset in [3]. An extra check will be added to be sure the form won't be saved with updated default values if it already has `data-for` ones [4]. Important: The diff from [5] made the `email_to` field as an exception for the data-for/prefill priority system and only used the `data-for` value if nothing has been configured by the user (it also used the `data-for` value if what was configured by the user is the dummy default email: `info@yourcompany.example.com`). That's why we need to exceptionally allow saving the default value added by the user in the check from [4] to preserve the same behavior. Following [6], The `email_to` value won't be kept in edit mode to prevent breaking its dynamic behavior. [1]: https://github.com/odoo/odoo/commit/b637a5e32f767b62736241042f88fa0cecf9f10b [2]: https://github.com/odoo/odoo/commit/043e1fdf923d2037dd8da128ab99388f0c92e544 [5]: https://github.com/odoo/odoo/commit/a08574a04ff2ce8ea2d6fd2b79f56cc57bba953b [6]: https://github.com/odoo/odoo/commit/6658d61e304c9dfd8e512648c4a001dcaac44bc1 task-3922573 Forward-Port-Of: odoo/odoo#204027 Forward-Port-Of: odoo/odoo#166565
* = pos_restaurant In this commit: === - Ensured that when a popup is open and the screensaver appears, the popup no longer overlays the screensaver. - Fixed an issue in the restaurant module is installed, after the screensaver appears on the login screen, clicking would bring back the login screen, but attempting to open a session would trigger the screensaver again. task-4607035 Forward-Port-Of: odoo/odoo#199528
Original PR description
* = pos_restaurant In this commit: === - Ensured that when a popup is open and the screensaver appears, the popup no longer overlays the screensaver. - Fixed an issue in the restaurant module is installed, after the screensaver appears on the login screen, clicking would bring back the login screen, but attempting to open a session would trigger the screensaver again. task-4607035 Forward-Port-Of: odoo/odoo#199528
Accessing external resources in chrome can increase randomness in execution for multiple reasons: - the external resource may temporary not be available - the external resource may be faster-slower to load - the external server could block some requests because of rate limiting - the network may be unreachable. Moreover, downloading fonts at every execution also slows down the tests A possibility to solve the issue was to block the network on runbot, in the dockers. The main problem
Original PR description
Accessing external resources in chrome can increase randomness in execution for multiple reasons: - the external resource may temporary not be available - the external resource may be faster-slower…
Accessing external resources in chrome can increase randomness in execution for multiple reasons: - the external resource may temporary not be available - the external resource may be faster-slower to load - the external server could block some requests because of rate limiting - the network may be unreachable. Moreover, downloading fonts at every execution also slows down the tests A possibility to solve the issue was to block the network on runbot, in the dockers. The main problem with this solution is that it wouldn't be the same behavior locally. It is also hard to adapt all versions at the same time. This commit introduced another solution, using Fetch.enable in the chrome developers tools. This will allow to have a callback on every external request, allowing to enable/disable/give an alternate answer to the request. All local request are allowed, all external request should be either blocked or an alternative answer given. This could be costly but at first glance it looks like it had no visible negative impact on performances. The first version was blocking all external requests, leading to a lot of failing tests, most of them already seen in nighties. It is hard to say since depending on when it happens it could create different error message, at least a few dozens of error related to this where found, maybe a few hundreds looking at the kind of patterns it can cause. Following this attempts a fix was to vendor all needed sources leading to ~130 cached url, with more than 100 fonts. This list was furthered reduced to have default fonts that would be returned reducing the load. A test was made to return a 404 instead and it was actually enough, and it is the same for most requests (stripe, ayden, ...). Only a few of them needs a answer close to reality. - The gooleapis css can be emty but not a 404 because it may make some of the css computation fail (website.backend_assets_all_wysiwyg.min.css) One of the failling test is TestCustomSnippet.test_01_run_tour This final version returns a 404 for most resources. A version returning 500 also works fine. This pr could impact other cis (odoosh, other runbot) but the impact is expected to be slow wince only two tests needed to be adapted outside tests/common.py. It would be still possible to make Fetch.enable optional using an environment variable. Targeting 18.0 looks reasonable for a start, could be backported to 16.0 later Note that this pr may make some random error more frequent, #207469 was needed to make this pr green. The assumption is that the speedup of the loading of some resources (or possible slowdown of local request) may change the timing of the execution revealing making some error more frequent. Forward-Port-Of: odoo/odoo#207157
Problem --------- SPV requires the CIUS-RO xml. However, when selecting the "sending to SPV" uniquely in the move send wizard, it fails becuase it's missing the XML. Solution --------- When sending to SPV, generate the XML by default instead of doing nothing if it's not present. task-4720583 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207377 Forward-Port-Of: odoo/odoo#206828
Original PR description
Problem --------- SPV requires the CIUS-RO xml. However, when selecting the "sending to SPV" uniquely in the move send wizard, it fails becuase it's missing the XML. Solution --------- When sending to SPV, generate the XML by default instead of doing nothing if it's not present. task-4720583 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207377 Forward-Port-Of: odoo/odoo#206828
https://runbot.odoo.com/odoo/error/163640 Forward-Port-Of: odoo/odoo#207642
Original PR description
https://runbot.odoo.com/odoo/error/163640 Forward-Port-Of: odoo/odoo#207642
In [1], a mechanism was introduced to detect lost notifications when the bus table is cleared during socket disconnection. However, this relies on the "reconnect" event. The "reconnect" event is not triggered when the connection is closed cleanly. In such cases, the next connection is treated as a new one and triggers the "connect" event, which does not check for missed notifications. As a result, any notifications sent while the socket was disconnected can be missed. This commit ensures t
Original PR description
In [1], a mechanism was introduced to detect lost notifications when the bus table is cleared during socket disconnection. However, this relies on the "reconnect" event. The "reconnect" event is not triggered when the connection is closed cleanly. In such cases, the next connection is treated as a new one and triggers the "connect" event, which does not check for missed notifications. As a result, any notifications sent while the socket was disconnected can be missed. This commit ensures that the missed notification check is performed on all connections after the initial one, not only during a "reconnect". [1]: https://github.com/odoo/odoo/pull/206106 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#207392
[FIX] accounting: missing chart line "758 Indemnités et autres produits" was missing Steps to reproduce: ------------------- * French Fiscal Localization * Open the Chart of Accounts * Line 758 missing Why the fix: ------------ Based on French government documentation https://www.anc.gouv.fr/files/anc/files/1_Normes_fran%C3%A7aises/Plans%20comptables/Plan-de-comptes-PCG-2025.pdf opw-4699235 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/
Original PR description
[FIX] accounting: missing chart line "758 Indemnités et autres produits" was missing Steps to reproduce: ------------------- * French Fiscal Localization * Open the Chart of Accounts * Line 758 missing Why the fix: ------------ Based on French government documentation https://www.anc.gouv.fr/files/anc/files/1_Normes_fran%C3%A7aises/Plans%20comptables/Plan-de-comptes-PCG-2025.pdf opw-4699235 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207312 Forward-Port-Of: odoo/odoo#205552
The certificate and keys models were added in 18.0. A few docstrings could help devs using those methods. Furthermore, a few more checks and robustness were added. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#202253
Original PR description
The certificate and keys models were added in 18.0. A few docstrings could help devs using those methods. Furthermore, a few more checks and robustness were added. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#202253
Previously, when using a payment method integrated with the Bank App (QR code), a QR code was shown on the customer display. This functionality was lost during the refactoring of the customer display into a standalone OWL app: https://github.com/odoo/odoo/commit/acf78c27b12cf014cd80d20ea5853e63ab9ca03f It was later removed entirely with the deletion of the point_of_sale.CustomerFacingQR template: https://github.com/odoo/odoo/commit/49116abd0916ac835e0ad1f6ba1714b8e80c4272 This commit
Original PR description
Previously, when using a payment method integrated with the Bank App (QR code), a QR code was shown on the customer display. This functionality was lost during the refactoring of the customer display into a standalone OWL app: https://github.com/odoo/odoo/commit/acf78c27b12cf014cd80d20ea5853e63ab9ca03f It was later removed entirely with the deletion of the point_of_sale.CustomerFacingQR template: https://github.com/odoo/odoo/commit/49116abd0916ac835e0ad1f6ba1714b8e80c4272 This commit reintroduces the QR code on the customer display. Forward-Port-Of: odoo/odoo#207581 Forward-Port-Of: odoo/odoo#206872
It seems it was an error of https://github.com/odoo/odoo/commit/077f6d449a660ee6961cce8174c9c6caaf5bc23f. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207465
Original PR description
It seems it was an error of https://github.com/odoo/odoo/commit/077f6d449a660ee6961cce8174c9c6caaf5bc23f. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207465
There was an issue in the `PropertyDefinition:state.propertyDefinition`, which could sometimes not be updated properly, resulting in a traceback after multiple property definition changes. ### How to reproduce: - Open a CRM Lead form view and add a property of type `tags`. - Save and fully reload the form view. - Change the property type to `separator` - Change the property name to another value. - Click outside the popover to close it. => Traceback ``` Cannot read properties of und
Original PR description
There was an issue in the `PropertyDefinition:state.propertyDefinition`, which could sometimes not be updated properly, resulting in a traceback after multiple property definition changes. ### How to…
There was an issue in the `PropertyDefinition:state.propertyDefinition`, which could sometimes not be updated properly, resulting in a traceback after multiple property definition changes. ### How to reproduce: - Open a CRM Lead form view and add a property of type `tags`. - Save and fully reload the form view. - Change the property type to `separator` - Change the property name to another value. - Click outside the popover to close it. => Traceback ``` Cannot read properties of undefined (reading 'type') at PropertiesField.onPropertyDefinitionChange ``` ### Technical explanation: The `propertyDefinition` argument given to `onChange` props of `PropertyDefinition` component is expected to be modified in place, since it is used as the `propertyDefinition` state value. `pick` function creates a shallow copy, therefore using it on `propertyDefinition` in `PropertiesField:onPropertyDefinitionChange` and applying changes on that copy (i.e. in `_regeneratePropertyName`) will prevent these changes to be registered in the `PropertyDefinition:state.propertyDefinition`, resulting in inconsistent values with `PropertyField:propertyList`, which would manifest at the next definition change, since `_getPropertyIndex` would not be able to find the index of the now obsolete `propertyDefinition`. task-4743860 Forward-Port-Of: odoo/odoo#206977 Forward-Port-Of: odoo/odoo#206871
- SaveLastPreparationChangesTour To fix the error, add the three last steps to ensure floor plan is well rendered before close the browser. runbot-error-id~114344 - FinishResidualOrder Wait the screen floor is completely loaded before clicking on table 5 or the order can sometimes not be well loaded. runbot-error-id~161595 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed th
Original PR description
- SaveLastPreparationChangesTour To fix the error, add the three last steps to ensure floor plan is well rendered before close the browser. runbot-error-id~114344 - FinishResidualOrder Wait the screen floor is completely loaded before clicking on table 5 or the order can sometimes not be well loaded. runbot-error-id~161595 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#207469
Since the widget for non trailing zeros float is used in payroll and payroll does not depend on hr_holidays now, we move the widget to core hr Forward-Port-Of: odoo/odoo#207441
Original PR description
Since the widget for non trailing zeros float is used in payroll and payroll does not depend on hr_holidays now, we move the widget to core hr Forward-Port-Of: odoo/odoo#207441
Steps to reproduce the bug: - Create a service product “S1” - Create a repair order: - In the parts: - Click on the catalog Problem: You can select a service product, whereas the products in the repair parts should be restricted to consumable-type products only: https://github.com/odoo/odoo/blob/f2923dec56b5ba2436bc244337c1e430a85e7e94/addons/stock/models/stock_move.py#L45-L48 opw-4687472 Forward-Port-Of: odoo/odoo#206521 Forward-Port-Of: odoo/odoo#204527
Original PR description
Steps to reproduce the bug:
- Create a service product “S1”
- Create a repair order:
- In the parts: - Click on the catalog
Problem:
You can select a service product, whereas the products in the repair parts should be restricted to consumable-type products only:
https://github.com/odoo/odoo/blob/f2923dec56b5ba2436bc244337c1e430a85e7e94/addons/stock/models/stock_move.py#L45-L48
opw-4687472
Forward-Port-Of: odoo/odoo#206521
Forward-Port-Of: odoo/odoo#204527Similar to: https://github.com/odoo/odoo/pull/184830 We've recently introduced a new operator: “is within” in the domain selector, which can be used to find out whether a date is within a dynamic range (e.g. within a month, within 4 days, within 3 weeks, etc.). To works, this domain needs dynamic elements, such as `context_today`, which is defined in `py_builtin.js` and dynamically retrieves the current date. https://github.com/odoo/odoo/blob/2fed354787b6190ee8bca91dc49746fcd0631dd8/a
Original PR description
Similar to: https://github.com/odoo/odoo/pull/184830 We've recently introduced a new operator: “is within” in the domain selector, which can be used to find out whether a date is within a dynamic…
Similar to: https://github.com/odoo/odoo/pull/184830
We've recently introduced a new operator: “is within” in the domain
selector, which can be used to find out whether a date is within a
dynamic range (e.g. within a month, within 4 days, within 3 weeks, etc.).
To works, this domain needs dynamic elements, such as `context_today`,
which is defined in `py_builtin.js` and dynamically retrieves the
current date.
https://github.com/odoo/odoo/blob/2fed354787b6190ee8bca91dc49746fcd0631dd8/addons/web/static/src/core/py_js/py_builtin.js#L77-L79
However, the problem isn't limited to this operator in the selector
domain, as it's only been available since 18.0, and this pr target is
17.0.s
In fact, it is possible in certain cases to use these fields via debug
mode, and there are several cases where `uid`, `user`, etc. are used.
There is therefore an inconsistency where users see the use of these
variables in these cases and when they try to use them elsewhere with,
for example, a field of this style:
`("date", "=", context_today())`, they get a traceback.
This happens mainly because, in Python, the domain is evaluated via
`literal_eval`, and since it contains variables that are designed for
the web, it causes a traceback because this function expects to receive
only a correctly formatted string, with no context and no variables.
This commit handles:
- website/model_page.py:
-
https://github.com/odoo/odoo/blob/2fed354787b6190ee8bca91dc49746fcd0631dd8/addons/website/controllers/model_page.py#L13-L18
https://github.com/odoo/odoo/blob/2fed354787b6190ee8bca91dc49746fcd0631dd8/addons/website/controllers/model_page.py#L47-L57
The enterprise commit (https://github.com/odoo/enterprise/pull/82564)
handles two other cases:
- web_studio/approval:
Here in this case there are several calls to literal_eval on domains
received from the web, notably to create and check its approval spec.
a function has been used to avoid rewriting the same thing several times
in the file.2
- marketing_automation/activity:
Here too, several calls are made to this file, as in the case of
approval, a function has been created to replace all calls to
`literal_eval`
In all three cases, the problem is the same: the problem is not only
present in `is_within` but in the fact that python has no way of
understanding the domain received from the web, so the same fix has been
applied everywhere:
- First, `to_utc()` is removed from the domain, since it's purely
client-side and this notion doesn't exist in et la the python server
- We replace the `literal_eval` call with `safe_eval`, which will do
more than just transform a string containing only a literal value of
type X into type X (e.g. tuple, string, number, array, etc.)
- `safe_eval` can therefore either evaluate expressions or execute
statements. In our case, what we really want is to evaluate just a
string like literal_eval with just one more context, and to be able to
define local or global values, such as defining `context_today()`
- For the moment, the values we use are the same as those used by
`is_within`, i.e.:
-- context_today()
-- relative_delta()
-- datetime
opw-4551335
opw-4672902
opw-4678894
opw-4669315
opw-4577091
Forward-Port-Of: odoo/odoo#206708
Forward-Port-Of: odoo/odoo#204172Currently the IoT Box are being infested with logs like `2025-04-17 11:30:46,925 13649 WARNING ? odoo.addons.hw_drivers.websocket_client: message type not supported: bundle_changed` This PR removes them as they aren't useful information task-4735615 Forward-Port-Of: odoo/odoo#206503
Original PR description
Currently the IoT Box are being infested with logs like `2025-04-17 11:30:46,925 13649 WARNING ? odoo.addons.hw_drivers.websocket_client: message type not supported: bundle_changed` This PR removes them as they aren't useful information task-4735615 Forward-Port-Of: odoo/odoo#206503
- Since this PR: https://github.com/odoo/enterprise/pull/82531, the "Customer Statement" smart button (inside the customer form) was no longer visible when orders were paid via customer accounts in PoS and the session was closed. This was caused by session-level account.move records lacking partner_id, which caused _compute_has_moves to return false. - This fix overrides `_compute_has_moves` inside the module `pos_settle_due` to set `has_moves` to True when a partner's total_due is non-zero, en
Original PR description
- Since this PR: https://github.com/odoo/enterprise/pull/82531, the "Customer Statement" smart button (inside the customer form) was no longer visible when orders were paid via customer accounts in PoS and the session was closed. This was caused by session-level account.move records lacking partner_id, which caused _compute_has_moves to return false. - This fix overrides `_compute_has_moves` inside the module `pos_settle_due` to set `has_moves` to True when a partner's total_due is non-zero, ensuring the statement button remains visible when relevant. task-id: 4749148 Forward-Port-Of: odoo/enterprise#84003
Partial payments in POS are buggy if there is no pay later POS payment method Steps to reproduce: 1. Navigate to Point of Sale > Configuration > Payment Methods 2. Archive the "Customer Account" payment method (which is of `type == 'pay_later'`) 3. Try to settle a partially paid invoice in POS 4. Selecting the the "Validate" button will close the order without settling and will leave the UI in a buggy state where any further interactions produce a traceback Solution: Block the use
Original PR description
Partial payments in POS are buggy if there is no pay later POS payment method Steps to reproduce: 1. Navigate to Point of Sale > Configuration > Payment Methods 2. Archive the "Customer Account" payment method (which is of `type == 'pay_later'`) 3. Try to settle a partially paid invoice in POS 4. Selecting the the "Validate" button will close the order without settling and will leave the UI in a buggy state where any further interactions produce a traceback Solution: Block the user from settling dues or making deposits when no pay_later payment method is loaded. OPW-4712869 The following error dialog is shown: <img width="163" alt="Screenshot 2025-04-18 at 00 28 41" src="https://github.com/user-attachments/assets/7651c863-bc75-4486-8483-8a8ee2fed5db" /> Forward-Port-Of: odoo/enterprise#83650
### Steps to reproduce: - Accounting dashboard - Click on the three dots of the "Bank" card - Click "import file" - Try importing a CAMT file with the namespace "camt" - Traceback Other issue: - Try importing a CAMT file with a custom Code in `ns:Domn/ns:Cd` (example: "IC1") - Traceback ### Cause: Namespaces can be used in CAMT files but the way Odoo handled them was incorrect. We were creating a dictionary using `root.nsmap`. It only worked when the file didn't have a namespace ke
Original PR description
### Steps to reproduce: - Accounting dashboard - Click on the three dots of the "Bank" card - Click "import file" - Try importing a CAMT file with the namespace "camt" - Traceback Other issue: - Try…
### Steps to reproduce: - Accounting dashboard - Click on the three dots of the "Bank" card - Click "import file" - Try importing a CAMT file with the namespace "camt" - Traceback Other issue: - Try importing a CAMT file with a custom Code in `ns:Domn/ns:Cd` (example: "IC1") - Traceback ### Cause: Namespaces can be used in CAMT files but the way Odoo handled them was incorrect. We were creating a dictionary using `root.nsmap`. It only worked when the file didn't have a namespace key because if the key was different from 'ns' the `findall` didn't work. Second issue: Some banks use their own codes in the CAMT files. The specification has numerous codes which Odoo added in a dictionary, and it reads from this dictionary to get a description. When there is a custom code, Odoo tries to read a key which doesn't exist explaining the traceback. ### Solution: - Change the way namespace is computed using the tag. - If the code is not in the dictionary, we take the custom code. opw-4553152 Forward-Port-Of: odoo/enterprise#82888
Currently, when validating deliveries, if multiples attachments are posted in the same chatter message, the printing jobs do not complete. Steps to reproduce: ------------------- * Install fedex * In operation types, select Delivery Orders then hardware * In print on validation, enable Carrier Labels and Export Documents * In the shipping methods, select fedex international * Change Label format to ZPL11 * Connect the database to an iot box * Set up the shipping labels to be send on z
Original PR description
Currently, when validating deliveries, if multiples attachments are posted in the same chatter message, the printing jobs do not complete. Steps to reproduce: ------------------- * Install fedex * In…
Currently, when validating deliveries, if multiples attachments are posted in the same chatter message, the printing jobs do not complete. Steps to reproduce: ------------------- * Install fedex * In operation types, select Delivery Orders then hardware * In print on validation, enable Carrier Labels and Export Documents * In the shipping methods, select fedex international * Change Label format to ZPL11 * Connect the database to an iot box * Set up the shipping labels to be send on zebra printer * Set up commercial invoice (/invoice) to be sent to another printer * Create a sale order, using fedex international as shipping * Confirm the SO * Select the delivery * Validate the delivery > Observation: Nothing prints, jobs are sent to CUPS bu not printing Why the fix: ------------ https://github.com/odoo/enterprise/blob/8075101192fb81a78f2a984cf2adf67fc77c0194/delivery_fedex_rest/models/delivery_fedex.py#L192-L196 As show, when sending the shipping, if the invoice is generated, it gets added to the attachements. The function `message_post` will post all attachments in the same chatter message. In `delivery_iot` the `message_post` function is overridden to allow sending the printing jobs to the iot. https://github.com/odoo/enterprise/blob/8075101192fb81a78f2a984cf2adf67fc77c0194/delivery_iot/models/stock_picking.py#L33-L46 Here, `attachments_names` will both contain `Label` and `ShippingDoc`. Since we enter the first if condition, the report is related to the shipping labels. Then we send the data related to all attachments to the device linked to the shipping labels, aka the zebra printer. Since the other attachment is of type PDF, the zebraprinter does not know what to do with it and ends up printing nothing. Since we can have multiple different attachment, the if/elseif condition does not make sense. By breaking it in two if, we can send both reports separately, while still keeping all attachments in the same chatter message. opw-4546715 Forward-Port-Of: odoo/enterprise#83481 Forward-Port-Of: odoo/enterprise#82094
With this commit we remove the namespaces that are not used in the cdfi document. Steps: - Create an invoice and send the edi document - Look at the xml -> namespace `xmlns:cce20="http://www.sat.gob.mx/ComercioExterior20"` is included but unused opw-4493568 Forward-Port-Of: odoo/enterprise#83838
Original PR description
With this commit we remove the namespaces that are not used in the cdfi document. Steps: - Create an invoice and send the edi document - Look at the xml -> namespace `xmlns:cce20="http://www.sat.gob.mx/ComercioExterior20"` is included but unused opw-4493568 Forward-Port-Of: odoo/enterprise#83838
The exception for the second trimester for 2024 has been redone for 2025. task-4734827 Forward-Port-Of: odoo/enterprise#84024
Original PR description
The exception for the second trimester for 2024 has been redone for 2025. task-4734827 Forward-Port-Of: odoo/enterprise#84024
Forward-Port-Of: odoo/enterprise#83244
Original PR description
Forward-Port-Of: odoo/enterprise#83244
- Set default `filter_account_type` to 'receivable' in follow-up report view for more relevant results. - Update the selection of default journal types to 'sale', 'bank' and 'cash' for follow-up reports. opw-[4724675](https://www.odoo.com/odoo/project/967/tasks/4724675), [4735031](https://www.odoo.com/odoo/project/967/tasks/4735031) Forward-Port-Of: odoo/enterprise#83513
Original PR description
- Set default `filter_account_type` to 'receivable' in follow-up report view for more relevant results. - Update the selection of default journal types to 'sale', 'bank' and 'cash' for follow-up reports. opw-[4724675](https://www.odoo.com/odoo/project/967/tasks/4724675), [4735031](https://www.odoo.com/odoo/project/967/tasks/4735031) Forward-Port-Of: odoo/enterprise#83513
The pos.order form view removed the refund button for the inherited view. This can cause issues if other modules depend on that button to add to the arch, so making it invisible would still make the element accessible by xpath. ci error https://runbot.odoo.com/runbot/build/78974416 Forward-Port-Of: odoo/enterprise#84118 Forward-Port-Of: odoo/enterprise#84030
Original PR description
The pos.order form view removed the refund button for the inherited view. This can cause issues if other modules depend on that button to add to the arch, so making it invisible would still make the element accessible by xpath. ci error https://runbot.odoo.com/runbot/build/78974416 Forward-Port-Of: odoo/enterprise#84118 Forward-Port-Of: odoo/enterprise#84030
In cc759094a32e413cb1b71cbbe7be9dc85ded819f, the follow-up report generation was moved from `_send_email` to `execute_followup`, which is only called during manual follow-up processing. As a result, the report was missing when follow-ups were triggered by the cron. This commit moves the report generation logic to `_execute_followup_partner`, which is called in both manual and automatic (cron) cases. Also, patched `_run_wkhtmltopdf` in `TestAccountFollowupReports` to prevent tests from han
Original PR description
In cc759094a32e413cb1b71cbbe7be9dc85ded819f, the follow-up report generation was moved from `_send_email` to `execute_followup`, which is only called during manual follow-up processing. As a result, the report was missing when follow-ups were triggered by the cron. This commit moves the report generation logic to `_execute_followup_partner`, which is called in both manual and automatic (cron) cases. Also, patched `_run_wkhtmltopdf` in `TestAccountFollowupReports` to prevent tests from hanging, since PDF generation requires multiple workers and tests run with only one. task-4752110 Forward-Port-Of: odoo/enterprise#84114
### Issue: - In attendance-based contracts, lunch break intervals were automatically deducted from attendances,. - However, this deduction was not reflected in the generated work entries, resulting in inconsistencies between attendance duration and payroll calculations. ### Steps To Repoduce: - Set up an attendance-based contract with lunch break in the schedule. - Log attendance from 08:00 to 20:00 without logging out for lunch. - Observe: - The attendance has the lunch b
Original PR description
### Issue:
- In attendance-based contracts, lunch break intervals were automatically deducted from attendances,.
- However, this deduction was not reflected in the generated work entries, resulting in inconsistencies
between attendance duration and payroll calculations.
### Steps To Repoduce:
- Set up an attendance-based contract with lunch break in the schedule.
- Log attendance from 08:00 to 20:00 without logging out for lunch.
- Observe:
- The attendance has the lunch break interval deducted.
- The work entry does not, and includes the full duration.
### Solution:
- revert the change introduced in https://github.com/odoo/enterprise/pull/71979/commits/0a54ef993da3ef4882acdee1b8f5e378e2e9f2e0 only for contracts without flexible hours.
- Lunch breaks are now deducted from both attendances and work entries only when the contract has flexible_hours = False.
opw-4627247
Forward-Port-Of: odoo/enterprise#83825When submitting message templates to the WhatsApp API, the request could occasionally time out before receiving a response. This resulted in templates being created on Facebook's side, but not registered in Odoo, as the template ID assigned by Facebook was never received. Since template names must be unique, resubmitting the same template fails, leaving the systems out of sync. This commit increases the request timeout to (10s connect, 30s read) to reduce the chance of timeouts. opw-470
Original PR description
When submitting message templates to the WhatsApp API, the request could occasionally time out before receiving a response. This resulted in templates being created on Facebook's side, but not registered in Odoo, as the template ID assigned by Facebook was never received. Since template names must be unique, resubmitting the same template fails, leaving the systems out of sync. This commit increases the request timeout to (10s connect, 30s read) to reduce the chance of timeouts. opw-4706852 opw-4720635 Forward-Port-Of: odoo/enterprise#83581
Forward-Port-Of: odoo/enterprise#83992
Original PR description
Forward-Port-Of: odoo/enterprise#83992
Similar to: https://github.com/odoo/odoo/pull/184830 We've recently introduced a new operator: “is within” in the domain selector, which can be used to find out whether a date is within a dynamic range (e.g. within a month, within 4 days, within 3 weeks, etc.). To works, this domain needs dynamic elements, such as `context_today`, which is defined in `py_builtin.js` and dynamically retrieves the current date. https://github.com/odoo/odoo/blob/17.0/addons/web/static/src/core/py_js/py
Original PR description
Similar to: https://github.com/odoo/odoo/pull/184830 We've recently introduced a new operator: “is within” in the domain selector, which can be used to find out whether a date is within a dynamic…
Similar to: https://github.com/odoo/odoo/pull/184830
We've recently introduced a new operator: “is within” in the domain
selector, which can be used to find out whether a date is within a
dynamic range (e.g. within a month, within 4 days, within 3 weeks, etc.).
To works, this domain needs dynamic elements, such as `context_today`,
which is defined in `py_builtin.js` and dynamically retrieves the
current date.
https://github.com/odoo/odoo/blob/17.0/addons/web/static/src/core/py_js/py_builtin.js#L77-L79
However, the problem isn't limited to this operator in the selector
domain, as it's only been available since 18.0, and this pr target is
17.0.s
In fact, it is possible in certain cases to use these fields via debug
mode, and there are several cases where `uid`, `user`, etc. are used.
There is therefore an inconsistency where users see the use of these
variables in these cases and when they try to use them elsewhere with,
for example, a field of this style:
`("date", "=", context_today())`, they get a traceback.
This happens mainly because, in Python, the domain is evaluated via
`literal_eval`, and since it contains variables that are designed for
the web, it causes a traceback because this function expects to receive
only a correctly formatted string, with no context and no variables.
The community commit (https://github.com/odoo/odoo/pull/204172) handles:
- website/model_page.py:
https://github.com/odoo/odoo/blob/17.0/addons/website/controllers/model_page.py#L13-L18
https://github.com/odoo/odoo/blob/17.0/addons/website/controllers/model_page.py#L47-L50
This commit
handles two other cases:
- web_studio/approval:
Here in this case there are several calls to literal_eval on domains
received from the web, notably to create and check its approval spec.
a function has been used to avoid rewriting the same thing several times
in the file.2
- marketing_automation/activity:
Here too, several calls are made to this file, as in the case of
approval, a function has been created to replace all calls to
`literal_eval`
In all three cases, the problem is the same: the problem is not only
present in `is_within` but in the fact that python has no way of
understanding the domain received from the web, so the same fix has been
applied everywhere:
- First, `to_utc()` is removed from the domain, since it's purely
client-side and this notion doesn't exist in the python server
- We replace the `literal_eval` call with `safe_eval`, which will do
more than just transform a string containing only a literal value of
type X into type X (e.g. tuple, string, number, array, etc.)
- `safe_eval` can therefore either evaluate expressions or execute
statements. In our case, what we really want is to evaluate just a
string like literal_eval with just one more context, and to be able to
define local or global values, such as defining `context_today()`
- For the moment, the values we use are the same as those used by
`is_within`, i.e.:
- context_today()
- relative_delta()
- datetime
- time
opw-4551335
opw-4672902
opw-4678894
opw-4669315
opw-4577091
community: https://github.com/odoo/odoo/pull/204172
Forward-Port-Of: odoo/enterprise#83738
Forward-Port-Of: odoo/enterprise#82564This commit backports a change done in https://github.com/odoo/enterprise/pull/83876. The check on the product vendor was based on the `_select_seller` method, which does not give any result if the quantity does not match any vendor. However, the check should be more permissive and allow the RFQ creation if a vendor exists, no matter the quantity. Part of task-4680780 Backport of https://github.com/odoo/enterprise/pull/83876 Forward-Port-Of: odoo/enterprise#83938
Original PR description
This commit backports a change done in https://github.com/odoo/enterprise/pull/83876. The check on the product vendor was based on the `_select_seller` method, which does not give any result if the quantity does not match any vendor. However, the check should be more permissive and allow the RFQ creation if a vendor exists, no matter the quantity. Part of task-4680780 Backport of https://github.com/odoo/enterprise/pull/83876 Forward-Port-Of: odoo/enterprise#83938
fix wrong formulas in different tables: - in "worst churn" under Value, starting the 7th line, the value used was "recurring_monthly" instead of "amount_signed" - in "worst contraction", the 10th line didn't use the list 4 like the rest of the table - in "top expansion", the 10th line didn't use the list 2 like the rest of the table Task: 4711532 Forward-Port-Of: odoo/enterprise#83019
Original PR description
fix wrong formulas in different tables: - in "worst churn" under Value, starting the 7th line, the value used was "recurring_monthly" instead of "amount_signed" - in "worst contraction", the 10th line didn't use the list 4 like the rest of the table - in "top expansion", the 10th line didn't use the list 2 like the rest of the table Task: 4711532 Forward-Port-Of: odoo/enterprise#83019
Before this commit, the user could have a crash when he tries to create a shift in non-working period because the method to search on the right timezone to use does not take into account the shift could be not linked to a resource. This commit makes sure the timezone is correctly found without any issue when we search on a timezone. Forward-Port-Of: odoo/enterprise#84224
Original PR description
Before this commit, the user could have a crash when he tries to create a shift in non-working period because the method to search on the right timezone to use does not take into account the shift could be not linked to a resource. This commit makes sure the timezone is correctly found without any issue when we search on a timezone. Forward-Port-Of: odoo/enterprise#84224
In this commit: === - Fixed a traceback that occurred during menu synchronization caused by multiple product.template.attribute.value (PTAV) records found, where only one was expected (singleton error). - The issue was due to having both active and inactive PTAV records linked to a product. task-4753173 Forward-Port-Of: odoo/enterprise#84127
Original PR description
In this commit: === - Fixed a traceback that occurred during menu synchronization caused by multiple product.template.attribute.value (PTAV) records found, where only one was expected (singleton error). - The issue was due to having both active and inactive PTAV records linked to a product. task-4753173 Forward-Port-Of: odoo/enterprise#84127