Daily updates from Odoo
Tuesday, August 26, 2025
75 changes
18 changes
Resolved issues and error corrections
Website charts and countdowns now immediately reflect updated theme colors after a theme change. This keeps edited pages visually consistent without requiring users to manually refresh or reapply settings.
Original PR description
Before this commit, if theme colors were applied on charts or on countdowns, they would not be updated right after changing the theme colors. This was due to the fact the interactions were not restarted and the old colors were kept. To fix this issue and solve future ones, the interactions are now restarted after any bundle reload. task-4367641
The file import screen now closes correctly when users click Cancel, returning them to the previous view. This prevents an error message from appearing during a routine cancellation, making the import flow smoother and less confusing.
Original PR description
**Before this commit:** - Clicking the `Cancel` button in the file import resulted in a traceback. **Steps to produce:** - Click the `Cancel` button in the file import action. **After this commit:** - Clicking the `Cancel` button now correctly exits the import action and navigates to the previous view. task-4898326 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The editor now clears the previous file choice before opening the file picker again. This prevents a canceled upload from accidentally re-uploading and inserting the last selected file, making the file command behave as users expect.
Original PR description
Currently, the upload local files service does not reset the file input it uses to handle file uploads. As a result, two consecutive uses of the `/file` command can produce undesirable side effects: Steps to reproduce: 1. Use the `/file` command 2. In the OS file picker, select a file and click on the "open" button. 3. Use the `/file` command 4. In the OS file picker, click on the "cancel" button => The system re-uploads the file loaded at step 2 and inserts a file block for that file in the editor. When clicking on the "cancel" button, we should not insert or upload any attachment. This commit fixes this issue by clearing the file input of the upload local file service before re-prompting the user to select a file. This should guarantee that we do not re-upload the previously selected file. Task-4989809 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222794
Product pages no longer show a delivery truck message when the only available option is in-store pickup. This avoids suggesting home delivery is available when customers can only collect their order in store.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Disable all delivery methods except for "Pick up in store"; 2. go to a product page. Issue ----- A delivery truck is shown with its delivery status, even though delivery is not supported. Cause ----- The `delivery_stock_data` info looks for all published "delivery" carriers, including `in_store` types, which is already covered by `in_store_stock_data`. Solution -------- - Exclude `in_store` delivery types when looking for delivery carriers. - If the `deliveryStockData` object is empty, don't render the truck. opw-5010081 Forward-Port-Of: odoo/odoo#223383
Work entry validation now skips schedule checks when an employee has no fixed working calendar. This prevents errors when creating, updating, or validating work entries for employees with fully flexible schedules.
Original PR description
When we validate/write/create a work entry for an employee with a fully flexible working schedule, we can encounter a traceback when trying to call `_attendance_intervals_batch` on a non-existing calendar. To rectify this issue, we continue in the loop when no calendar is set. opw-4979974 opw-4968312 Forward-Port-Of: odoo/odoo#222752
This fix makes an automated website blog test click a button in a more reliable way so the expected setup window opens. It helps prevent false test failures and supports smoother validation of blog and social media features.
Original PR description
Test failure: TestWebsiteBlogUi.test_blog_context_and_social_media. The tour 'blog_context_and_social_media' did not complete successfully because the `.modal-dialog .o_field_widget[name='blog_id']` selector was not found. Investigation revealed that using the standard `"click"` action failed to trigger the modal, likely due to the button being dynamically rendered or not fully ready when the step executed. Additionally, Odoo UI widgets and custom event handlers may require a direct DOM `.click()` call for proper interaction, as they can be sensitive to how events are dispatched. To address this, we replaced the `"click"` action with `this.anchor.click()`, ensuring the click event is performed in a way that reliably opens the modal and allows the tour to proceed as expected. runbot-226540
This update fixes an error that could occur after merging contacts and then selecting multiple contact records. It ensures Peppol-related contact information is calculated safely for each contact, helping users continue working without unexpected crashes.
Original PR description
**Steps to Reproduce:** 1. Install `account_peppol` and `contacts`. 2. Open the Contacts app (list view). 3. Select any two contacts and click on "Merge" from the "Actions" menu. 4. Open any of the merged contacts in form view. 5. Close the form view and click on "Add a line". 6. Select multiple records. **Error:** ValueError - Expected singleton: res.partner(11, 9) **Cause:** The method `_compute_available_peppol_eas` accesses `self.available_peppol_eas` directly. When multiple `res.partner` records were involved, it will raised a singleton error. **Fix:** Loop over each partner to compute `available_peppol_eas` for each. This prevents the singleton error when multiple records are processed. sentry-6807787390 Forward-Port-Of: odoo/odoo#223547
This fix keeps the skills table contained within the employee resume section, preventing it from covering resume content and action buttons when very wide resume tables are added. Users can now view and manage resume entries normally even with large table content.
Original PR description
Steps to reproduce:
1- Go on employee app
2- Click on resume section
3- Click on Add on resume tab
4- Put on description a big table with at least 20 columns
5- Save
The resume table and the buttons "add", "delete" with be hidden by the skill table.
Reason:
The skill table element is too wide
Solution:
The skill table's width is fixed and is contained in resume section element
task-4881917
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#217926Users who open the import records screen and then choose Cancel are now returned to where they started instead of seeing an error. This prevents a confusing interruption during normal navigation and keeps the import workflow reliable.
Original PR description
Steps to reproduce: ------------------- 1. Install a module(ex: helpdesk/contacts) and open contacts. 2. Select the Cog Menu > import records 3. Click on the Cancel button Error: ----- ```python InvalidDomainError: Invalid domain representation: id,in, ``` Cause: ------ The dc05253 changes the behavior to display the imported records instead of redirecting the user to the action from which the import was launched. However, when the user clicks the Cancel button(resIds = undefined in this case) , it leads to an `InvalidDomainError`. https://github.com/odoo/odoo/blob/2627168eea8562477f600c97c42d443a072ddccc/addons/base_import/static/src/import_action/import_action.js#L100-L113 Solution: --------- Used `historyBack` to fall back to the originating action when the user clicks the Cancel button. opw-4985218 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes the restaurant point-of-sale payment test wait until an order is fully synchronized before ending. It helps prevent false test failures and supports more reliable delivery of point-of-sale updates.
Original PR description
### Issue: - In `test_14_pos_payment_sync`, the tour could end before the order was synced to the server, causing errors in later steps. ### Fix: - Added steps to wait until the sync is done before finishing the tour. Runbot Error: 113594, 181563 Task: 4974068 Forward-Port-Of: odoo/odoo#223983 Forward-Port-Of: odoo/odoo#222581
The contract offer screen now hides the signature request button when the current user cannot access any related signature requests. This prevents users from clicking a button that would lead to an error, while keeping it visible for authorized users such as signature administrators.
Original PR description
Before this PR, when logged in as a different user from the one responsible for counter-signing the contract, the smart button still showed, and clicking on it caused an error. This PR fixes that, by hiding the smart button when there are no accessible signature requests. Note that sign admins will still be able to see the smart button; users with access to the signature request. Task-4966129 Forward-Port-Of: odoo/enterprise#90819
Document email templates no longer fail when displaying the company logo text. The logo description now uses the current user's company information, preventing errors for recipients of document-related emails.
Original PR description
The alt for company logo was based on the object's create_uid, but the documents access model does not have the create_uid field, so this would cause an error whenever trying to render this template. Changed the alt to use the user's company_id instead of create_uid company_id. opw-4969479
Swiss payroll ELM transmissions will now include contact person details only when all required contact fields are completed. This avoids sending partial contact information, helping ensure payroll declarations are accepted and processed cleanly.
Original PR description
Contact person information should only be transmitted if all 3 fields are filled Forward-Port-Of: odoo/enterprise#93084
Invoice OCR now chooses the most relevant company or contact when multiple partners share the same VAT number. This reduces incorrect partner selection on extracted invoices, especially for businesses with multiple addresses under one VAT number.
Original PR description
It's possible that multiple partners are sharing the same VAT number, for example, when multiple addresses are set on it (each address will be a child `res.partner` with the same VAT number). Previously, when the OCR matched such partners from their VAT number, it would select one "at random" (based on the default sort of `res.partner`). Now, it will match the one with the highest supplier/customer rank. opw-[4954057](https://www.odoo.com/odoo/49/tasks/4954057) Forward-Port-Of: odoo/enterprise#92398
This fixes an issue where changing a product variant could briefly apply the subscription plan choice to an outdated selector during automated testing. The change makes the subscription purchase flow more reliable by preventing false failures in the variant selection tour.
Original PR description
The subscription plan selection gets removed and replaced (static template website_sale_subscription.SubscriptionPricingSelect) So the change of value occurs, but on the wrong select. This was happening as when changing the variant we will replace the plan_select in the widget with another template and since this will happen before the RPC set the plan_id that we are choosing as the default one we will actually have the old select option back on the dom to be selected. https://github.com/odoo/enterprise/blob/82593f9932e92800251d18453b0c73e5ce9b5ec0/website_sale_subscription/static/src/js/variant_mixin.js#L35-L41 We are setting the select option to the old one after replacing it. This commit introduces a delay to prevent the test to fail (which happened most of the time) runbot-error-110627 Forward-Port-Of: odoo/enterprise#86639
This fixes an issue in Payroll where users could not delete an employee version from the versions list. Removing the incorrect context prevents misleading “record does not exist” warnings and lets HR teams manage employee history normally.
Original PR description
Issue / Current Behavior: It is not possible to delete a version of an employee. Steps to Reproduce: 1. Create an employee. 2. Create a new version of the employee. 3. Click on the smart button of versions and delete a record from the list view. 4. It gives warning that the record doesn't exist or might be deleted. Solution: Fixed the issue when deleting the version by removing the version context. task - 5002995
This fix ensures Indian GST purchase bills can be matched using their Invoice Reference Number without triggering an error. It improves reliability during bill reconciliation and helps avoid interruptions in tax reporting workflows.
Original PR description
Before this IR: - When a purchase document was matched using the IRN number, the variable `matching_keys` was not defined. - This led to an `UnboundLocalError` during bill matching. After this PR: - `matching_keys` is now set together with the IRN number. - This ensures `matching_keys` is always available and prevents runtime errors when IRN matches bills. opw-5037128 Forward-Port-Of: odoo/enterprise#93051
Users can now export calendar invites for planning shifts even when no employee is assigned. The system falls back to the current user's timezone or UTC, preventing an error and keeping shift invitations accessible.
Original PR description
Currently, an error occurs when a user tries to export a calendar invite (ICS) for a planning shift that has no assigned resource. **Steps to reproduce:** - Install the `planning` module. - Go to `Planning > New`, and click `Publish & Send`. - Enable developer mode and go to `Settings > Technical > Email > Emails`. - Open the latest email record and click `iCal/Outlook`. **Error:** `AttributeError: 'bool' object has no attribute 'upper'` **Root Cause:** At [1], when no employee is assigned to the shift, `slot.employee_id` is `empty`, so `slot.employee_id.tz` is `False`, which leads to an error. This commit ensures a valid timezone is always used by selecting the current user's timezone or 'UTC' when the shift has no assigned employee. [1] https://github.com/odoo/enterprise/blob/13ce65b8ca61f9a825f2876e2727cddfae83f894/planning/controllers/main.py#L355 sentry-6781639319 Forward-Port-Of: odoo/enterprise#92984 Forward-Port-Of: odoo/enterprise#91889
23 changes
Resolved issues and error corrections
This fix makes automated checks for two-factor authentication wait until the web client is fully ready before interacting with it. It reduces false test failures and improves confidence in release validation without changing user-facing behavior.
Original PR description
Code and issue at hand are very similar to odoo/odoo#212102 so implement the same "fix" to synchronise the tour on the web client being ready, though technically the first two calls are just "wait a bit" then "wait a bit more" (wait until DOMContentLoaded, then until next frame, then until next event loop). At which point we wait until the event bus has fully connected to the server before moving on to interact with the client for real. It does seem to reliably wait sufficiently long for the issue to go away so works for me... Backport of #224066 https://runbot.odoo.com/odoo/error/181862 Forward-Port-Of: odoo/odoo#224161
The Point of Sale now reuses an existing empty, unfinished order when staff tap “New order” from the receipt screen. This prevents the system from accumulating unnecessary blank orders, keeping sessions cleaner and reducing clutter.
Original PR description
- When clicking `New order` on the receipt screen, we now want to reuse an empty order (not finalized and no order lines) before creating a new one. This avoids creating many useless empty orders. task-id: 5003010 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222786 Forward-Port-Of: odoo/odoo#222276
This fix prevents errors when creating, updating, or validating work entries for employees with fully flexible schedules. It helps payroll and HR processes continue smoothly when no specific working calendar is assigned.
Original PR description
When we validate/write/create a work entry for an employee with a fully flexible working schedule, we can encounter a traceback when trying to call `_attendance_intervals_batch` on a non-existing calendar. To rectify this issue, we continue in the loop when no calendar is set. opw-4979974 opw-4968312 Forward-Port-Of: odoo/odoo#222752
This fixes an issue where the Threads social media icon could be selected in an email marketing snippet but would not appear after the email was sent. Marketing emails now display the icon correctly, helping campaigns show the intended social links.
Original PR description
Problem: When adding the Threads icon to an email marketing snippet and sending the email, the icon does not appear in the received email. Solution: Add support for the newly added icons from commit 21db1065aee9b403a316389f306c865cc47354ed (same fix as commit 7e9466e27d61fa8ece43d2238e1570dc3e65337a). Steps to reproduce: - Add the Threads icon to an email marketing snippet. - Send a test email. - Observe that the icon is not visible in the received email. opw-5024970 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Point of Sale now handles product searches while offline more gracefully. Instead of showing an unexpected error screen, it reports the connection problem as expected, helping store staff understand that the issue is connectivity-related.
Original PR description
- Fix issue that was causing a traceback when searching for products in offline mode. Now when we search a product in offline mode, we get the `ConnectionLostError` as before instead of a traceback. task-id: 5008058 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222761
This fix adds a short wait before automated Point of Sale menu buttons are clicked during testing. It helps prevent false build failures caused by the test acting before the interface is ready, improving reliability without changing business features.
Original PR description
steps to reproduce: 1. in multi enterprise 2. run the tour `test_02_others` added a wait step for the menu buttons before clicking the menu button in the `chrome_util.js` file. build_error-229618 Forward-Port-Of: odoo/odoo#217939
Fixes an issue that could prevent users from deleting a bank account from a customer or partner record. The duplicate bank account check now ignores empty results, avoiding an error and making account maintenance smoother.
Original PR description
Currently an error occurs when we try to remove bank accounts from a partner. **Steps to reproduce:** - Install `accountant` (with demo), Go to customers and create a new one with random name. -…
Currently an error occurs when we try to remove bank accounts from a partner.
**Steps to reproduce:**
- Install `accountant` (with demo), Go to customers and create a new one with random name.
- Under accounting tab add a new bank account with an acc number, bank and save.
- Now remove the bank account record.
**Error:**
`AttributeError: 'NoneType' object has no attribute 'origin'`
**Cause:**
- The error occurs because of the SQL query [1] returning None values in the `id2duplicates` dict, somewhat like `{1: [None]}`, this caused the browse [2] to assign `None` to the `duplicate_bank_partner_ids`.
- While recording snapshots for diff checking in onchange system the none value will be stored like`None: {display_name:{}}` and when the line [3] tries to access `id_.origin` where `id_` is None and causes the error.
**Solution:**
- Added a condition which makes sure null values are not accounted. (The Join is added to makes sure that the correct `partner_id` is fetched.)
[1]: https://github.com/odoo/odoo/blob/04ba4e4a51843701dd42a3f0243add50b3ac0c79/addons/account/models/res_partner_bank.py#L71-L85
[2]: https://github.com/odoo/odoo/blob/04ba4e4a51843701dd42a3f0243add50b3ac0c79/addons/account/models/res_partner_bank.py#L88
[3]: https://github.com/odoo/odoo/blob/04ba4e4a51843701dd42a3f0243add50b3ac0c79/addons/web/models/models.py#L1173
sentry-6748249363
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#219455Discount lines in Dutch e-invoices now use the required reason text instead of a reason code. This avoids validation warnings under the Dutch NLCIUS rules and helps invoices pass compliance checks more smoothly.
Original PR description
NLCIUS rule BR-NL-32 triggers a warning if the AllowanceChargeReasonCode rather than the AllowanceChargeReason is present on an invoice line AllowanceCharge. We don't handle this correctly at the moment for discounts, because in that case the UBL 2.0 builder adds an reason code but not a reason. This commit ensures that the reason rather than the reason code is specified in NLCIUS in the case of a discount. opw-4997704 Forward-Port-Of: odoo/odoo#223072
The web editor now shows the Bluesky social media icon correctly. This ensures website visitors see the intended social link branding instead of a broken or incorrect icon.
Original PR description
The bluesky icon was not rendering correctly because it is not on the version of fontawesome that we are using. Added a change similar to other social media icons that are not on the version that we are using with the already existing bluesky icon that was in the fonts folder. opw-5024970
This fix ensures Canary Islands withholding taxes in the Spanish localization are classified under the correct withholding category instead of the default taxable category. Businesses get more accurate tax grouping and reporting in Odoo Accounting.
Original PR description
Steps to reproduce: - Install `l10n_es' - Go to accounting -> settings and load any package for the Canary Islands - Go to Accounting → Configuration → Taxes - Group by “Tax Type (Spain)” Observation: - 'Withholding' taxes should have type 'retencion' instead of 'Sujeto' Issue: - After this commit, https://github.com/odoo-dev/odoo/commit/643496b337c2edc9c56c76f72aec12021358f631 withholding taxes brings back but not set a l10n_es_type(Tax Type(Spain)), so it's default type to 'Sujeto' Solution: - Add `l10n_es_type` column in the data file and assign 'retencion' to withholding taxes. opw-5000677 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The editor now clears the previous file selection before opening the file picker again. This prevents a previously chosen file from being uploaded and inserted if the user cancels a later file upload.
Original PR description
Currently, the upload local files service does not reset the file input it uses to handle file uploads. As a result, two consecutive uses of the `/file` command can produce undesirable side effects: Steps to reproduce: 1. Use the `/file` command 2. In the OS file picker, select a file and click on the "open" button. 3. Use the `/file` command 4. In the OS file picker, click on the "cancel" button => The system re-uploads the file loaded at step 2 and inserts a file block for that file in the editor. When clicking on the "cancel" button, we should not insert or upload any attachment. This commit fixes this issue by clearing the file input of the upload local file service before re-prompting the user to select a file. This should guarantee that we do not re-upload the previously selected file. Task-4989809 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222794
Shared project users are now sent back to the correct project when leaving a task edit screen. This prevents confusion and reduces the chance of users working in the wrong project view.
Original PR description
Steps to Reproduce: ------------- 1. Install project and create two projects and tasks. 2. Share both projects with edit access. 3. Edit a task from the portal view (Back to edit mode) then click the (back to tasks) button. 4. Instead of the correct project the page redirects to the another project kanban view. Issue: -------------- - When redirecting to a task from project sharing (edit mode – task form view) it redirects to a different project’s kanban view instead of the actual project. Cause: ------------- - In the portal view the URL is hardcoded with `id=1` instead of dynamically using the correct project ID. Fix: --------------- - pass the correct `project_id` in the URL instead of using a hardcoded value. The issue occurred from this PR-https://github.com/odoo/odoo/pull/174648 task-5031632 Forward-Port-Of: odoo/odoo#224005
This fix prevents errors when users merge contacts and then work with multiple contact records in the Peppol invoicing setup. It ensures each contact is processed separately, making contact management more reliable for businesses using Peppol e-invoicing.
Original PR description
**Steps to Reproduce:** 1. Install `account_peppol` and `contacts`. 2. Open the Contacts app (list view). 3. Select any two contacts and click on "Merge" from the "Actions" menu. 4. Open any of the merged contacts in form view. 5. Close the form view and click on "Add a line". 6. Select multiple records. **Error:** ValueError - Expected singleton: res.partner(11, 9) **Cause:** The method `_compute_available_peppol_eas` accesses `self.available_peppol_eas` directly. When multiple `res.partner` records were involved, it will raised a singleton error. **Fix:** Loop over each partner to compute `available_peppol_eas` for each. This prevents the singleton error when multiple records are processed. sentry-6807787390 Forward-Port-Of: odoo/odoo#223547
This fix restores the intended rule for showing QR codes on Saudi Arabia invoice reports after it was accidentally omitted during a forward-port. Businesses using Saudi localization will see QR codes appear only under the correct conditions, supporting accurate local invoice presentation.
Original PR description
In this commit: https://github.com/odoo/odoo/commit/fdb37c9aa3d2c6002b42e87ebd14afd280ebd03f We changed the condition to display the qr code, but the change was lost in the forward port task-5039596 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224051
Fixed a layout issue in the Employees app where very wide resume content could cause the skills table to cover resume entries and action buttons. Users can now view and manage resume information reliably even when large tables are added to descriptions.
Original PR description
Steps to reproduce:
1- Go on employee app
2- Click on resume section
3- Click on Add on resume tab
4- Put on description a big table with at least 20 columns
5- Save
The resume table and the buttons "add", "delete" with be hidden by the skill table.
Reason:
The skill table element is too wide
Solution:
The skill table's width is fixed and is contained in resume section element
task-4881917
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#217926This fix makes a restaurant point-of-sale payment test wait until an order is fully synced before it finishes. It reduces false test failures and helps keep release validation more stable.
Original PR description
### Issue: - In `test_14_pos_payment_sync`, the tour could end before the order was synced to the server, causing errors in later steps. ### Fix: - Added steps to wait until the sync is done before finishing the tour. Runbot Error: 113594, 181563 Task: 4974068 Forward-Port-Of: odoo/odoo#223983 Forward-Port-Of: odoo/odoo#222581
Appointment events can now correctly receive video call redirection links when several events are processed at the same time. This prevents an error that could interrupt appointment handling and improves reliability for users managing multiple calendar events.
Original PR description
When computing `videocall_redirection`, the method `get_base_url()` was called directly on a recordset containing multiple `calendar.event` records. Since `get_base_url()` expects a singleton, this raised the error: Traceback: --- `ValueError: Expected singleton or no record: calendar.event(4, 6, 1, 5)` This commit ensures the computation is done per record, avoiding the singleton issue and allowing correct videocall redirection values to be set on multiple events. Reference review: https://github.com/odoo/enterprise/pull/53569#discussion_r1543135425 sentry-6819406171 Forward-Port-Of: odoo/enterprise#92717
An automated website sales subscription test was updated to look for the correct page heading after a recent layout change. This helps keep quality checks passing and reduces the risk of delayed releases caused by a false test failure.
Original PR description
Since the div has been changed to h6 the tour is failing as it is unable to find the element in the dom. Changing the trigger in the tour to check h6 instead of div runbot-error-110627
This fix prevents Point of Sale from showing an error when an order is missing or no longer available. It improves reliability for staff handling customer orders and due settlements by avoiding an unnecessary interruption.
Original PR description
Before this commit, accessing the order amount caused an error if the order was not defined. opw-5027426 Forward-Port-Of: odoo/enterprise#92736
The contract salary offer screen now hides the signature request button when the current user cannot access any related signature requests. This prevents users from clicking a button that would lead to an error, while keeping it visible for signature administrators and authorized users.
Original PR description
Before this PR, when logged in as a different user from the one responsible for counter-signing the contract, the smart button still showed, and clicking on it caused an error. This PR fixes that, by hiding the smart button when there are no accessible signature requests. Note that sign admins will still be able to see the smart button; users with access to the signature request. Task-4966129 Forward-Port-Of: odoo/enterprise#90819
Swiss payroll ELM transmissions now include contact person details only when all required contact fields are provided. This prevents incomplete contact information from being sent, reducing the risk of declaration errors or rejected submissions.
Original PR description
Contact person information should only be transmitted if all 3 fields are filled Forward-Port-Of: odoo/enterprise#93084
Invoice OCR now chooses the most relevant customer or supplier when several partner records share the same VAT number. This avoids random matches, helping invoices link to the correct business contact more reliably.
Original PR description
It's possible that multiple partners are sharing the same VAT number, for example, when multiple addresses are set on it (each address will be a child `res.partner` with the same VAT number). Previously, when the OCR matched such partners from their VAT number, it would select one "at random" (based on the default sort of `res.partner`). Now, it will match the one with the highest supplier/customer rank. opw-[4954057](https://www.odoo.com/odoo/49/tasks/4954057) Forward-Port-Of: odoo/enterprise#92398
A new automated test verifies that analytic rules are applied correctly when reconciling bank payments with early payment discounts. This helps ensure discount-related accounting lines receive the right analytic allocation, matching the behavior of manually registered payments.
Original PR description
This commit adds a test for the following issue: - Configure an early discount payment term (e.g., 2/7 Net 30). - Configure the analytic distribution model with the account used when a discount is granted (e.g., 657000 on the BE fiscal position). - Create an invoice using the early discount payment term. - On bank reconciliation, register the transaction taking into account the early payment discount (e.g., 98% of the invoice amount_total). On the third line with account 657000, corresponding to the early discount payment, the analytic distribution model does not apply. In contrast, when manually registering a payment for the invoice, the analytic is correctly applied. community pr: https://github.com/odoo/odoo/pull/217933 opw-4868986 Forward-Port-Of: odoo/enterprise#90641
14 changes
Resolved issues and error corrections
Planning calendar invites can now be exported even when a shift has no employee assigned. The system uses a safe fallback timezone, preventing an error and ensuring managers can still send or download calendar invites.
Original PR description
Currently, an error occurs when a user tries to export a calendar invite (ICS) for a planning shift that has no assigned resource. **Steps to reproduce:** - Install the `planning` module. - Go to `Planning > New`, and click `Publish & Send`. - Enable developer mode and go to `Settings > Technical > Email > Emails`. - Open the latest email record and click `iCal/Outlook`. **Error:** `AttributeError: 'bool' object has no attribute 'upper'` **Root Cause:** At [1], when no employee is assigned to the shift, `slot.employee_id` is `empty`, so `slot.employee_id.tz` is `False`, which leads to an error. This commit ensures a valid timezone is always used by selecting the current user's timezone or 'UTC' when the shift has no assigned employee. [1] https://github.com/odoo/enterprise/blob/13ce65b8ca61f9a825f2876e2727cddfae83f894/planning/controllers/main.py#L355 sentry-6781639319 Forward-Port-Of: odoo/enterprise#92984 Forward-Port-Of: odoo/enterprise#91889
Cancelling selection or numeric filter setup no longer leaves an extra side panel open. This keeps spreadsheet filter configuration cleaner and avoids confusing stacked panels for users.
Original PR description
…numeric filter Steps to reproduce: - Open the global filter side panel - Click on selection filter or numeric filter - Click on cancel => Two side panels are stacked. Commit 51f2d18f5952a63ced1ed8e1b252650cffc50c2a already fix this issue, but selection and numeric filter were forgotten. Task: 5042490
This fixes an issue in Indian GST reports where matching purchase bills by IRN could fail unexpectedly. The required matching information is now always set, helping bill matching complete reliably and avoiding runtime errors.
Original PR description
Before this IR: - When a purchase document was matched using the IRN number, the variable `matching_keys` was not defined. - This led to an `UnboundLocalError` during bill matching. After this PR: - `matching_keys` is now set together with the IRN number. - This ensures `matching_keys` is always available and prevents runtime errors when IRN matches bills. opw-5037128 Forward-Port-Of: odoo/enterprise#93051
The payroll setup now prevents saving group insurance rates that are zero, negative, or 100% and above. This helps avoid incorrect contract payroll data and reduces the chance of downstream payroll calculation issues.
Original PR description
Prevent users from entering invalid percentages in the `l10n_be_group_insurance_rate` field by adding a `constraint` that warns the user if the input is less than or equal to 0 or greater than or equal to 100. task-4982158
When invoice OCR finds several contacts with the same VAT number, it now chooses the contact with the strongest customer or supplier relationship instead of an arbitrary match. This helps invoices link to the correct partner when companies have multiple addresses or related contact records.
Original PR description
It's possible that multiple partners are sharing the same VAT number, for example, when multiple addresses are set on it (each address will be a child `res.partner` with the same VAT number). Previously, when the OCR matched such partners from their VAT number, it would select one "at random" (based on the default sort of `res.partner`). Now, it will match the one with the highest supplier/customer rank. opw-[4954057](https://www.odoo.com/odoo/49/tasks/4954057) Forward-Port-Of: odoo/enterprise#92398
Swiss payroll declarations now include contact person details only when all required contact fields are filled in. This helps prevent incomplete information from being sent during ELM transmissions, reducing submission errors and follow-up work.
Original PR description
Contact person information should only be transmitted if all 3 fields are filled Forward-Port-Of: odoo/enterprise#93084
This update makes the AI live chat handling more reliable by separating how the system finds different types of AI chat channels. It also cleans up internal access to AI chat actions, reducing the chance of incorrect chat matching while keeping the user experience unchanged.
Original PR description
- In bc4929a0, controller methods were added to call 'post_error_message' , 'close_ai_chat' and 'generate_response' and all orm.call usages that referenced these methods were turned into rpc calls.…
- In bc4929a0, controller methods were added to call 'post_error_message' , 'close_ai_chat' and 'generate_response' and all orm.call usages that referenced these methods were turned into rpc calls. Hence, the visiblity of these methods can be changed to private. Note: 'generate_response' was also renamed because there is already a private '_generate_response' method. - The `_get_or_create_ai_chat` method was changed to receive channel_id parameter to be used for retrieving the ai chat channel if exists. However, this caused a bug because the more than one chat channel could be retrieved by the channel while all the flows that depend on`_get_or_create_ai_chat` expect only one. To fix this, retrieving an ai chat channel was separated into two methods. - `_get_ai_chat_channel` which retrieves channels of type `ai_chat`. All the flows ensure that there will only be one `ai_chat` channel. - `_get_ai_channel_from_id` which receives channel_id parameter and retrieves the ai channels of any type, namely `ai_chat` or `livechat`.
Belgian payroll users now see a clear error when trying to change an employee's working schedule without a contract start date. This prevents an unexpected system crash and guides users to correct the missing employee contract information first.
Original PR description
Prevent the apparition of a traceback when changing the schedule through the wizard Forward-Port-Of: odoo/enterprise#91880
The contract offer screen now hides the signature request button for users who cannot access the related request. This prevents users from clicking a button that would lead to an error, while keeping it visible for authorized users such as signature administrators.
Original PR description
Before this PR, when logged in as a different user from the one responsible for counter-signing the contract, the smart button still showed, and clicking on it caused an error. This PR fixes that, by hiding the smart button when there are no accessible signature requests. Note that sign admins will still be able to see the smart button; users with access to the signature request. Task-4966129 Forward-Port-Of: odoo/enterprise#90819
A missing setting was added to Point of Sale Enterprise tests so they run correctly during automated builds. This helps prevent false build failures and keeps quality checks reliable without changing customer-facing behavior.
Original PR description
steps to reproduce: 1. install pos_enterprise 2. run the test `test_should_not_affect_other_pos_config` or `test_is_header_or_footer_to_false` this commit adds the missing_field `account_tax_return_journal_id` to the test build_error-230301 Forward-Port-Of: odoo/enterprise#90995
The Swiss payroll accounting test setup now gives the test user the needed payroll permissions. This prevents a known automated test failure caused by missing access rights, helping keep payroll-related releases stable.
Original PR description
steps to reproduce: 1. install l10n_ch_hr_payroll_account 2. run test_ema_declaration_2021_11 test added payroll user and manager groups to the test user to avoid missing access rights error build_error-230682
Fixed an issue where opening return links from the dashboard showed the audit-style view instead of the tax return view. This ensures users land on the expected screen and can continue their tax return work without confusion.
Original PR description
When users click on the return links on the dashboard, the audit-style view is opened instead of the tax returns one. task-id: 5016400
The automated accounting walkthrough was adjusted so it opens the correct menu during nightly testing. This helps keep quality checks stable and reduces false build failures for the accounting area.
Original PR description
The nightly build were failing due to the wrong menu being opened, the solution is to use a more generic filter for the Add button, this is not a perfect solution as it will also select add button on other views that we dont want. task-4822215
A small issue in the Documents app was corrected to ensure document-related database queries run as intended. This helps prevent errors in affected document operations and improves reliability without changing the user experience.
Original PR description
odoo/odoo#219105
20 changes
Resolved issues and error corrections
Expanding a meeting creation dialog now keeps the original information, such as the meeting name linked to a task. This prevents users from losing prefilled details when switching to the full form, reducing rework and confusion.
Original PR description
### Steps to reproduce: - Go to any task in project module - Create a new meeting activity - Open Calendar and drag to create a slot - Notice the name of the meeting in the pop-up is the same as the…
### Steps to reproduce: - Go to any task in project module - Create a new meeting activity - Open Calendar and drag to create a slot - Notice the name of the meeting in the pop-up is the same as the task - Click on the expand button top-right of the dialog - Notice the calendar.event form opened but without a name ### Cause: When expanding the view using 'More options' button we are keeping the context in the new request. https://github.com/odoo/odoo/blob/d9c63a85955c2321bae1a705cc09b2554155f826/addons/calendar/static/src/views/attendee_calendar/attendee_calendar_controller.js#L45-L49 But when doing the same through the expand button we don't pass the current context so it will be lost. https://github.com/odoo/odoo/blob/3dde420665257c63885e891f1ec366568df5007b/addons/web/static/src/views/view_dialogs/form_view_dialog.js#L106-L116 ### Fix: Backporting the commit https://github.com/odoo/odoo/commit/4f71fbbd26b428e57943d974e8441bef295cdef1 to pass the context while expanding the form view opw-4966486
Users can now duplicate multiple appointment bookings at the same time without triggering an error. This removes a blocker in calendar appointment workflows and makes bulk booking management more reliable.
Original PR description
This error occurs when users attempt to duplicate multiple bookings within an appointment. Steps to reproduce: --- - Install `appointment` module - Select an appointment (ie. Dental Care) - Click on New and make 2 new bookings - Go to list view > Select both records > Duplicate Traceback: --- `ValueError: Expected singleton: calendar.event(5, 8)` This occurred because we called `default_get` with a non-empty recordset at the beginning of the `create` method. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change fixes an internal automated test for employee time-off accruals by making it use a fixed date. It helps prevent future date-related test failures, improving reliability of the HR time-off module without changing user-facing behavior.
Original PR description
The test is failing when run one year in the future as it depends on the date but we don't freeze the time. runbot-error-230721
This change reverts an earlier adjustment that hid unit information on point-of-sale order lines. The reverted change is no longer needed because the related certification work moved to a separate module, and it also caused a language-specific display bug.
Original PR description
This commit reverts commit ffdedf9, as the change is no longer required due to the LNE certification being implemented in a separate module. It also had a bug where the hiding of 'Units' only worked in English. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A privacy lookup test was updated so it no longer fails when extra optional country-specific modules add more partner references. This improves test reliability without changing how the product works for users.
Original PR description
The test `test_wizard_indirect_reference` failed when modules like `l10n_gt_edi` were installed. This was due to additional Many2one fields (e.g., `l10n_gt_edi_consignatory_partner` on `account.move`) referencing `res.partner`, which were picked up by the privacy lookup wizard. This commit updates the test to avoid assuming a fixed number of reference lines and instead asserts the presence of the expected ones (the partner and the company). No change in functional behavior. RB-[230449](https://runbot.odoo.com/odoo/error/230449) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue in the website editor where pasting multiple content blocks inside inline text could cause an error. It also prevents extra invisible spacing from being inserted in certain edited text areas, making editing more reliable for users.
Original PR description
Problem: When pasting two blocks inside an inline element, a traceback occurs. Cause: During `insert`, when `insertBefore` is `true` and `isEmptyBlock(right)` after `splitElement`, `currentNode` is set to `right`. But `right` may already have been deleted, leading to an invalid reference. Solution: Delete `right` if empty, but do not set `currentNode` to `right` in that case. Steps to reproduce: It is tricky to reproduce manually (you must copy two blocks and paste them in an inline element). A test has been added to cover the case. opw-4972695 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223229
This fix prevents mobile visitors from scrolling sideways when animated content briefly extends beyond the page during scroll effects. It keeps website pages visually contained and avoids showing off-page content, improving the mobile browsing experience.
Original PR description
Scenario: - add a 2 columns content widget - set the right column text to "On Scroll" animation with "Slide" effect and "From Right" direction so the content may be out of the page - save and reload…
Scenario: - add a 2 columns content widget - set the right column text to "On Scroll" animation with "Slide" effect and "From Right" direction so the content may be out of the page - save and reload the page on mobile - scroll down get in middle of animation with some content out of page - try to scroll to the right Result: we can scroll to the right and see the overflowing animated content outside of the expected page limit. History: During an animation, a fix prevent the horizontal scrollbar by setting "overflow-x: hidden" (or crop depending on version) on a given element: - in odoo/design-themes@51abb093c77993363b170b12be134c95b3009895 (14.0: 2021) it was added to $().getScrollingElement() - in 189a7c96e6e26825dc05c0c6466576fe63aa091e (18.0: 2022) the main page scroll was moved from #wrapwrap to html - in fece9cb85761e6cb3fe3642f947661464402363b (18.0: 2024) the "overflow-x: hidden" was moved to the body element Cause: the "overflow-x: hidden" is ignored by mobile browser on html and body tags ([example of report]), so in 18.0 and over the possible horizontal scrollbar caused by an animation is not hidden. Fix: apply the "overflow-x: clip/hidden" on #wrapwrap element. [example of report]: https://stackoverflow.com/questions/14270084 opw-4575726
The website editor now hides the image quality slider for WebP images on Safari and iOS webviews when compression is not supported. This prevents users from seeing a control that has no effect and keeps image editing options accurate when switching between image formats.
Original PR description
Scenario: - select a WebP image in the editor - change the quality with the slider Result: - the size and the image quality doesn't change Cause: Safari doesn't support HTMLCanvasElement.toDataURL() with WebP, so the image is exported in PNG instead which is lossless and doesn't support compression. Other issue: If we select in formats a WebP, then a PNG, we still see the quality option that are meant for the WebP, and inversely if we start with a PNG the quality option is hidden. Fix: Disable the quality for WebP images if this is not supported (in safari + iOS webview), and move the code to ImageTools._computeWidgetVisibility so it is updated when we change image type from/to WebP. opw-4979378 Forward-Port-Of: odoo/odoo#223268
The Unsplash image picker now handles cases where Unsplash returns the same image more than once in a search result. This prevents users from seeing a crash when browsing images, making image selection more reliable.
Original PR description
This commit fixes an OwlError when we try to render the images received from Unsplash after a search. The issue is that Unsplash can send duplicate images in the same batch of images. When we render those in a `t-foreach` and use the image `id`s as the keys, we get a duplicate key error. This is fixed by expanding on the previous filtering code, which ignored duplicates over multiple batches. We now ignore duplicates within batches as well. At the time of writing, Unsplash is sending us duplicate images on a search for "Inventory". opw-5027032 Forward-Port-Of: odoo/odoo#223789
Dutch UBL e-invoices now use the required discount reason text instead of a reason code on invoice line discounts. This prevents NLCIUS validation warnings and helps businesses send compliant invoices in the Netherlands.
Original PR description
NLCIUS rule BR-NL-32 triggers a warning if the AllowanceChargeReasonCode rather than the AllowanceChargeReason is present on an invoice line AllowanceCharge. We don't handle this correctly at the moment for discounts, because in that case the UBL 2.0 builder adds an reason code but not a reason. This commit ensures that the reason rather than the reason code is specified in NLCIUS in the case of a discount. opw-4997704 Forward-Port-Of: odoo/odoo#223072
Duplicated journal entries no longer keep the original partner at the entry level when users change partners on the copied journal items. This prevents misleading partner names in list views and keeps accounting records consistent after duplication.
Original PR description
When changing `partner_id` on the `account.move.line`s of a duplicated journal entry if this journal entry already had a partner_id, it will stay the same (possible to see from list view) but the…
When changing `partner_id` on the `account.move.line`s of a duplicated journal entry if this journal entry already had a partner_id, it will stay the same (possible to see from list view) but the move line will be correctly changed. Step to reproduce: - Select a journal entry of type PBNK - Duplicate the journal entry - Change the partner on the journal items and save - Go back to the list view, the partner name displayed is from the original journal entry When clicking on duplicate it will call the function copy and super.copy() will call copy_data from account_move; This line allow to copy the partner_id (which is needed since invoices revert goes through copy) Since there is no condition on the type of entry, it will also copy the partner_id in our case: https://github.com/odoo/odoo/blob/22c333d0ed7eba1165f6462e668998d37fcabb73/addons/account/models/account_move.py#L2424-L2426 The introduction of this change introduced our issue, It allow for all duplication to copy the partner_id. Original fix : https://github.com/odoo/odoo/commit/e1d18960b57b36b8bf69bc787ef6078dcba8c855 opw-4907648 Forward-Port-Of: odoo/odoo#217755
The Time Off allocation Kanban view now shows the New button on mobile, allowing managers to create allocations from the standard mobile view. This removes a confusing gap in the workflow and aligns the behavior with newer Odoo versions.
Original PR description
On mobile the "new" button in the time off allocation is not present Steps to reproduce: ------------------- * Open Time_off app * Select Management>Allocations * Open Kanban view (If you are on phone it's the standard view) * Issue : "New" button is missing Observation: The create "0" don't allow to create on kanban view https://github.com/odoo/odoo/blob/2b109261bc6e7550b23a0d444a4e7c63496e4c55/addons/hr_holidays/views/hr_leave_allocation_views.xml#L371 Why the fix: ------------ - It's misleading on phone. - Align with the change on 18.3. https://github.com/odoo/odoo/commit/944c11e61abead4f5157a7a7cb7b1f536bc14411 opw-4898359
This fixes an issue where standard Employee and Department view options could disappear after enabling a new view through Studio. Users can now customize these HR screens without losing access to existing views such as activity, kanban, calendar, or pivot.
Original PR description
**Steps to reproduce:** - Install `hr` and `web_studio`. - Go to Employees → click Studio icon. - Views → activate Calendar view. **Observation:** - Existing views (activity, kanban, pivot, etc.) disappear from the view types. **Issue:** - After commit https://github.com/odoo/odoo/pull/160280/commits/e67ed24320c555c0cc63d59aa4921267e10a472d, view_mode in actions was removed, so only default (list, form) and Studio-added views remain. **Solution:** - Add view_mode to the action to preserve standard views after customisation. opw-4967654 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adjusts a website shop test related to zero-priced products. It helps keep automated checks aligned with expected shopping behavior, reducing the risk of unnoticed issues reaching customers.
Original PR description
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
When invoice OCR finds several contacts with the same VAT number, it now chooses the most relevant customer or supplier based on their business activity ranking. This prevents invoices from being linked to the wrong address or related contact, improving accuracy in automated invoice processing.
Original PR description
It's possible that multiple partners are sharing the same VAT number, for example, when multiple addresses are set on it (each address will be a child `res.partner` with the same VAT number). Previously, when the OCR matched such partners from their VAT number, it would select one "at random" (based on the default sort of `res.partner`). Now, it will match the one with the highest supplier/customer rank. opw-[4954057](https://www.odoo.com/odoo/49/tasks/4954057) Forward-Port-Of: odoo/enterprise#92398
This update prevents an error when several appointment calendar events are processed at the same time. It ensures each event gets the correct video call redirection link, improving reliability for appointment scheduling.
Original PR description
When computing `videocall_redirection`, the method `get_base_url()` was called directly on a recordset containing multiple `calendar.event` records. Since `get_base_url()` expects a singleton, this raised the error: Traceback: --- `ValueError: Expected singleton or no record: calendar.event(4, 6, 1, 5)` This commit ensures the computation is done per record, avoiding the singleton issue and allowing correct videocall redirection values to be set on multiple events. Reference review: https://github.com/odoo/enterprise/pull/53569#discussion_r1543135425 sentry-6819406171
Fixed an issue where projects that exceeded an expense budget could still show the budget status in green instead of red. This helps users quickly identify budget overruns from the project dashboard and avoid misleading financial signals.
Original PR description
**Step to reproduce:** - install "project_account_budget" - go to accounting > accounting > Analytic Budget - create a budget of type expense,say test budget - select analytic account `Asustek - Wood…
**Step to reproduce:**
- install "project_account_budget"
- go to accounting > accounting > Analytic Budget
- create a budget of type expense,say test budget
- select analytic account `Asustek - Wood Corner`
- set budget amount => 500. open the budget
- create a new project 'test project"> open setting > Analytic Page
- add `Asustek - Wood Corner` analytic account in project field
- create a PO with amount > 500
- in analytic distribution column, add `Asustek - Wood Corner` in project column
- confirm PO and create Bill
- Go to `test project` settings > Dashboard smart button
**Observation:**
- For exceeding expense budget, we have green color in budget section
- It should be red
**Cause:**
The conditional class for budget progress was incorrectly evaluated due to missing parentheses around the `and` condition.
In expressions like:
`(true and (1 == 1 ? 'a' : 'c')) or (1 == 1 ? 'b' : 'd') → 'a'` ✅
`true and 1 == 1 ? 'a' : 'c' or 1 == 1 ? 'b' : 'd' → 'b'` ❌
Without parenthesis, the `or` clause is evaluated unexpectedly, even when the `and` branch is intended to take precedence.
This commit wraps the `and` condition in parentheses to ensure the correct evaluation order and consistent class assignment.
Budget:
<img width="1203" height="291" alt="budget 4968162" src="https://github.com/user-attachments/assets/2d8223d5-0344-4ad0-b33c-2598ea167f2d" />
Before fix:
<img width="623" height="195" alt="before fix 4968162" src="https://github.com/user-attachments/assets/4ac749bf-fa93-4835-963a-5dfbdd05559d" />
After fix:
<img width="643" height="225" alt="after fix 4968162 " src="https://github.com/user-attachments/assets/4fd228f9-e32f-48d9-b6ef-55251b21d601" />
opw-4968162Swiss payroll ELM transmissions now include contact person details only when all required contact fields are filled in. This helps avoid sending incomplete contact information and reduces the risk of rejected or unclear declarations.
Original PR description
Contact person information should only be transmitted if all 3 fields are filled Forward-Port-Of: odoo/enterprise#93084
The field service report guided tour was adjusted so it waits for the correct action button instead of matching a condition that was always true. This makes the tour more reliable and helps prevent interruptions during guided workflows or automated checks.
Original PR description
In this commit, we fix the tour industry_fsm_tour by removing "body:not(.modal-open) nav.o_main_navbar" (this trigger is always true) from trigger to let only button[name="action_generate_new_template"].
A failing rental point-of-sale test is fixed by ensuring a needed price list is available during the test setup. This helps keep automated checks reliable without changing customer-facing behavior.
Original PR description
The test was failing because available_pricelist_ids was empty although it was not since it is filled in the setup
but this line `self.env['res.config.settings'].create({'group_rental_stock_picking': False}).execute()`,
empty it and the test expected at least one pricelist to be available for the POS configuration.
This caused the test to fail when it tried to access the first element of an empty list.
This change adds a check, and if no pricelist exists, it creates one and links it to the POS config.
build_error-223356