Wednesday, July 8, 2026
50 changes · saas-19.4
New functionality added to Odoo
This update adds missing translations for various user-facing messages within the Odoo Point of Sale (POS) modules. This ensures that the POS system is accessible and understandable for users in different languages, improving the overall customer experience. The changes cover dialogs, error messages, and other UI elements across multiple POS applications.
Original PR description
pos* = All POS module In this commit: -------------------------------- Add missing translations for user-visible strings across POS modules. - Translated dialogs, errors, alerts, and other UI-visible messages - Updated Python-side UserError, ValidationError, and warning messages Task-5406947 Related PR-https://github.com/odoo/enterprise/pull/102094 Forward-Port-Of: odoo/odoo#273421 Forward-Port-Of: odoo/odoo#239972
Enhancements to existing features
This update adds missing translations for customer- and staff-facing messages across Point of Sale modules. It makes dialogs, errors, alerts, and warnings easier to understand for users working in supported languages.
Original PR description
pos* = All POS module In this commit: -------------------------------- Add missing translations for user-visible strings across POS modules. - Translated dialogs, errors, alerts, and other UI-visible messages - Updated Python-side UserError, ValidationError, and warning messages Task-5406947 Related PR-https://github.com/odoo/odoo/pull/239972 Forward-Port-Of: odoo/enterprise#122511 Forward-Port-Of: odoo/enterprise#102094
Resolved issues and error corrections
Odoo now saves the reply count returned by Twitter/X for social stream posts. This lets users see comment activity alongside other engagement metrics, giving a more complete view of post performance.
Original PR description
Twitter/X tweet metrics returned by the API include the number of replies in the `public_metrics.reply_count` field. This commit stores that value on social stream posts so the comments count can be displayed alongside other engagement metrics. API Documentation: https://docs.x.com/x-api/fundamentals/metrics#post-metrics Task-6251172 Forward-Port-Of: odoo/enterprise#120182
Features or functions removed from Odoo
We've removed support for Paymob payments in Pakistan due to Paymob's unexpected withdrawal from that market. This change ensures our system continues to function correctly and avoids any disruptions for users who no longer require this payment option. This is a technical fix to align with Paymob's operational status.
Original PR description
Paymob stopped their operations in Pakistan unexpectedly. Domain was dropped so none of the APIs work for Pakistan. Therefore we are removing the support of Pakistan in the Paymob provider. See Also: https://github.com/odoo/documentation/pull/18768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274603 Forward-Port-Of: odoo/odoo#273935
The printer settings now only show the oBox IP field when it is relevant for ePOS printers. The interface also hides technical service details from the oBox view, making setup cleaner and easier for users.
Original PR description
This PR adapts the view to only allow the user to set obox ip if the type of printer used is epos as it doesnt matter otherwise It also hides the services installed on the obox as it's not useful for the user task-6330864
The Azerbaijani Manat currency symbol has been updated to its official Unicode character, ₼. This improves consistency and makes currency display more accurate for users working with AZN.
Original PR description
This commit updates the base currency symbol for the Azerbaijani Manat (AZN) to its official Unicode character '₼'. Related Upgrade PR: https://github.com/odoo/upgrade/pull/10107 task-6112867 Forward-Port-Of: odoo/odoo#262471
This update brings back automated tests for the French POS payment and invoicing flow that were temporarily removed during a previous merge. It helps ensure the process keeps working correctly and reduces the risk of regressions in future changes.
Original PR description
During the merge of l10n_fr_pdp e-reporting and e-invoicing, some tests had to be removed. Task-6296356 Forward-Port-Of: odoo/odoo#273913 Forward-Port-Of: odoo/odoo#271294
The task Gantt view now loads correctly when grouped by Sale Order Item. This prevents an error caused by an outdated hours field name, allowing teams to review project work and sales-linked tasks without interruption.
Original PR description
### Steps to reproduce - Install `sale_timesheet_enterprise`. - Go to **Tasks → All Tasks**. - Switch to the **Gantt** view. - Group by **Sale Order Item** (`sale_line_id`). ### Issue A traceback is…
### Steps to reproduce - Install `sale_timesheet_enterprise`. - Go to **Tasks → All Tasks**. - Switch to the **Gantt** view. - Group by **Sale Order Item** (`sale_line_id`). ### Issue A traceback is raised when loading the Gantt view with group by `sale_line_id`: ```text ValueError: Invalid field 'planned_hours' on model 'project.task' for 'planned_hours:sum' ``` ### Root cause The Gantt progress bar computation for the `sale_line_id` grouping performs a `_read_group()` aggregation on the `planned_hours` field of `project.task`. However, `planned_hours` was renamed to `allocated_hours` during the saas-16.5 migration, so the former field no longer exists on `project.task`. As a result, the aggregation raises a `ValueError`. Migration reference: https://github.com/odoo/upgrade/blob/e638c6ce00d9d8936d034ad7130fef51565b9195/migrations/project/saas~16.5.1.2/pre-migrate.py#L10 Issued PR: https://github.com/odoo/enterprise/pull/49685 ### Fix Use `allocated_hours`, the renamed equivalent of `planned_hours`, when computing the Gantt progress bar. This restores the Gantt view when grouping tasks by **Sale Order Item** and prevents the traceback. Forward-Port-Of: odoo/enterprise#122994 Forward-Port-Of: odoo/enterprise#122297
The timesheet assistant no longer shows an empty Unmatched section when all items in that group are filtered out as away-from-keyboard events. This avoids confusing users with a section header that has no visible content.
Original PR description
The Unmatched group's header renders even when its only entries are afk events, since those are filtered out at display time but still counted when checking if the group has content. With this PR, we first check if a group has visible content before displaying the header Task-6348666 Forward-Port-Of: odoo/enterprise#122900 Forward-Port-Of: odoo/enterprise#122858
The point-of-sale Urban Piper test data now includes the required product category so order preparation checks can run correctly. This prevents a known automated test failure and helps keep future releases stable without changing customer-facing behavior.
Original PR description
This commit fixes a failing `pos.prep.order` test assertion by assigns a PoS category to the products used in the test orders. The failure occurs because the products used in the order lines do not have a PoS category assigned. As a result, the preparation order generation process fails when creating the corresponding `pos.prep.order`. Runbot Error-[242023](https://runbot.odoo.com/odoo/runbot.build.error/242023)
Employees without a fixed or average working schedule will no longer see misleading expected hours in the Timesheet Assistant or systray. Total hours remain visible, reducing confusion for teams using variable or no scheduled working hours.
Original PR description
**Steps to reproduce:** 1. Create an employee without a fixed working schedule. 2. Configure the employee with variable hours per day, per week, or no working hours at all. 3. Open the Timesheet Assistant or the Timesheet systray. 4. Observe that expected hours are displayed (over 0h 00m or over 24h 00m). **Cause:** Expected working hours were always computed and displayed, even for resources without a fixed schedule. **Fix:** Only compute expected working hours when the employee has a fixed or average schedule, and rely on the computed working hours to control the display of expected hours while keeping total hours always visible. task-6321760 Forward-Port-Of: odoo/enterprise#122859 Forward-Port-Of: odoo/enterprise#122232
Pasting document links into an empty message no longer adds an unnecessary blank line at the start. Existing message text still stays separated from pasted links, keeping messages neat and readable.
Original PR description
Before this commit, adding document links always prepended a line break before the generated links. When the composer was empty, this resulted in messages starting with an unnecessary blank line. This commit only inserts a line break when the composer already contains text, avoiding the extra spacing while preserving the separation between existing content and pasted links. task-[5947683](https://www.odoo.com/odoo/project/1519/tasks/5947683) Forward-Port-Of: odoo/enterprise#120952
The Timesheet Assistant now checks whether timesheets are allowed on a matched project before offering to add time. This prevents users from starting timesheet entries for projects where timesheet tracking has been disabled, reducing confusion and invalid actions.
Original PR description
Before this commit, the Timesheet Assistant would display the "Add" button and attempt to prefill timesheet forms for activities matched to projects where the `allow_timesheets` setting was set to `False`. This commit updates the Timesheet Assistant logic to evaluate the project's configuration. When an activity is matched to a project that has `allow_timesheets=False`: - The "Add" button is hidden from the suggestion list. - The system prevents prefilling the timesheet creation form. Task: 6306203 Forward-Port-Of: odoo/enterprise#123071 Forward-Port-Of: odoo/enterprise#120890
New planning shifts now default to 8 AM to 4 PM in the user's own timezone instead of being shifted by UTC conversion. This prevents schedules from appearing at the wrong hours for employees in locations such as Belgium.
Original PR description
Before: When creating a new shift, we set 8 AM - 4 PM as the default hours in UTC. With the timezone in Belgium, this becomes 10 AM - 6 PM. After: Change the timezone of the new shift to match the user's timezone. This will make the hours always be from 8 to 4 (working hours) --- task-6285596 Forward-Port-Of: odoo/enterprise#120062
This fix prevents delivery tracking from failing when EasyPost sends an empty tracker value. Users can continue working without seeing an error when opening or processing shipments affected by this carrier response.
Original PR description
The PR https://github.com/odoo/enterprise/pull/111833 handled the specific case when the tracker data is missing from the EasyPost response, however in certain cases `tracker` key exists, but it has a `None` value, which leads to a traceback when trying to access the stock move:
```
File "/home/odoo/src/enterprise/18.0/delivery_easypost/models/easypost_request.py", line 392, in get_tracking_link
public_url = shipment.get('tracker', {}).get('public_url')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
```
This commit provides a fallback to avoid getting the error from the side of the user.
opw-6270242
Forward-Port-Of: odoo/enterprise#119400Popovers in dark mode now display secondary buttons and embedded forms with clearer, consistent styling. This makes actions easier to recognize and keeps screens such as event slot creation visually aligned with the rest of the interface.
Original PR description
Before this commit, content like form & secondary button rendered inside popovers had inconsistent styling in dark mode: - secondary buttons did not stand out properly from the popover background, making them look like plain text blocks rather than actionable buttons; - forms rendered inside popovers (such as the multi-create popover) kept their default background, which visually clashed with the popover background. This commit fixes these issues by: - adding dedicated secondary button background colors for popovers, including hover state; - aligning form backgrounds inside popovers with the popover background. task-6249985 Forward-Port-Of: odoo/enterprise#121631
This fix prevents Hong Kong payroll payslips from crashing when a user clears the start or end date. The system now safely skips date-based wage and year-end pay calculations until the required dates are present, improving reliability during payroll editing.
Original PR description
Currently, an error occurs when a user removes the payslip date. **Steps to Reproduce:** - Install `l10n_hk_hr_payroll` with demo data. - Switch to the `Hong Kong` company. - Go to `Payroll` >…
Currently, an error occurs when a user removes the payslip date. **Steps to Reproduce:** - Install `l10n_hk_hr_payroll` with demo data. - Switch to the `Hong Kong` company. - Go to `Payroll` > `Payslips` > `Payslips`. - Create a `payslip` and remove the `start` or `end` period. **Error 1:** `TypeError: unsupported operand type(s) for +: 'bool' and 'relativedelta'` **Error2:** `AttributeError: 'bool' object has no attribute 'month'` When a user removes the start or end date of a payslip, the system computes the Average Daily Wage. Based on the payslip dates, it finds the previous year's payslips [1]. If the start or end date is not set, it raises an error [2]. For the second error, when computing whether to include EOY pay, it compares the company's EOY pay date with the end date's month. If the end date is not set, accessing its month raises an error [3]. This commit ensures that when retrieving previous-year payslips, if the start or end date is not set, it returns an empty payslip recordset. It also ensures that when computing whether to include EOY pay, if the end date is not set, `include_eoy_pay` is set to `False`. [1]: https://github.com/odoo/enterprise/blob/ec8a009794863090351d91650aff727e6fbeab7e/l10n_hk_hr_payroll/models/hr_payslip.py#L124 [2]- https://github.com/odoo/enterprise/blob/ec8a009794863090351d91650aff727e6fbeab7e/l10n_hk_hr_payroll/models/hr_payslip.py#L209-L215 [3]- https://github.com/odoo/enterprise/blob/ec8a009794863090351d91650aff727e6fbeab7e/l10n_hk_hr_payroll/models/hr_payslip.py#L141 Forward-Port-Of: odoo/enterprise#123135 Forward-Port-Of: odoo/enterprise#120586
Marketing Automation now shows the correct reason when a campaign participant is removed because they no longer match the campaign filter. This prevents users from seeing a misleading "Record deleted" message when the related record still exists, improving clarity during campaign follow-up.
Original PR description
`sync_participants` calls `action_set_unlink` on every participant whose record is no longer in the campaign domain, and `action_set_unlink` writes "Record deleted" on each scheduled trace. The…
`sync_participants` calls `action_set_unlink` on every participant whose record is no longer in the campaign domain, and `action_set_unlink` writes "Record deleted" on each scheduled trace. The removed bucket also contains records that still exist but no longer match the campaign filter, so the cancelled trace dialog shows "Record deleted" even when the record was only filtered out. In `sync_participants`, the to_remove participants are split between those whose record still exists in the database (filtered out by the campaign domain) and those whose record was actually deleted. `action_set_unlink` accepts an optional `trace_message` argument, defaulting to "Record deleted", and the filtered-out batch passes "Record no longer matches campaign filter" so the cancelled trace dialog reflects the real cause. Steps to reproduce: 1. Install Marketing Automation and CRM. 2. Open Marketing Automation, create a campaign on Lead with filter Stage = New. 3. Add a begin activity to the workflow. 4. Open CRM, create a Lead in the New stage. 5. Back in the campaign, click Generate Participants. 6. In the CRM pipeline, drag the Lead from New to Qualified. 7. Back in the campaign, click Generate Participants again. 8. Open the Participants smart button, click the participant for the moved Lead. 9. Click the cancelled activity in the workflow timeline. => The activity dialog shows "Error message: Record deleted" although the Lead still exists. Ticket [link](https://www.odoo.com/odoo/project/49/tasks/6251264) opw-6251264 Forward-Port-Of: odoo/enterprise#118692
Payroll processing now checks only the warnings that apply to the payslips being computed. This avoids unnecessary work during payroll runs and helps keep payslip calculations more efficient without changing the payroll results.
Original PR description
Ensure that we do not evaluate unnecessary warnings by only evaluating the warnings relevant to the payslips being computed; instead of evaluating all of them. task-6371828
This fix keeps Knowledge file navigation working consistently after a Chrome browser change. It preserves the previous behavior so users do not experience unexpected issues when scrolling to file content or related elements.
Original PR description
Since Chrome 150, scrolling methods like `scrollIntoView()` return a Promise instead of `undefined`. This commit adds block braces to ensure the action returns `undefined` and keeps the same behavior as before. Reference: - https://chromestatus.com/feature/5082138340491264 - https://chromium.googlesource.com/chromium/src/+/50f3e3d0a9bc02aad8b8161dbdd59046991dd2c7 runbot-941309 Forward-Port-Of: odoo/enterprise#123231 Forward-Port-Of: odoo/enterprise#123031
Grid view list titles now show the user-friendly label for grouped selection fields instead of internal technical values. This makes drill-down results easier to understand when users click the magnifier on grouped grid cells.
Original PR description
When grouping a grid view by a selection field and clicking on the cell magnifier, the list title showed the technical name (e.g. non_billable) instead of the display name (e.g. "Non Billable"). This commit adds a condition specifically for selection fields, ensuring that their display names are used. task-5980035 Forward-Port-Of: odoo/enterprise#122303 Forward-Port-Of: odoo/enterprise#120894
Fixed a problem that caused the appointment slot form to crash when users clicked the fields for limiting a slot to specific users or resources. This keeps appointment configuration usable and removes a broken filter that was not providing any benefit.
Original PR description
Clicking the "Restrict to User" or "Restrict to Resources" field on a slot crashed with:
invalid input syntax for type integer: "appointment_type_id.staff_user_ids"
The field domain was a quoted string instead of a list, so it was passed through as a literal value. Remove the domain: it never filtered anything and only broke the form.
opw-6349497
Forward-Port-Of: odoo/enterprise#122651The French Intrastat export wizard now opens only the journal entries that are actually missing required Intrastat information. This helps users resolve export warnings faster and avoids confusion from seeing unrelated entries.
Original PR description
Steps to reproduce: 1. Have a French company with intrastat report module installed 2. Create and validate a bill to another EU country, without filling out at least one of the required intrastat fields 3. Go to the intrastat report, and export it as XML DEBWEB2 4. In the export wizard, click on the internal links on the warning messages Issues: 1. In the Intrastat report in French localization, when there are missing values detected in the export, the Export Wizard shows internal links that lead to every journal entries - instead of showing only the relevant entries. The warning banner on the report uses the action action_invalid_code_moves which has a domain to limit what is shown on the view form. However in the method _fill_value_errors there was no domain. opw-6215339 Forward-Port-Of: odoo/enterprise#117997
This fix aligns the call debrief player tests with updated playback behavior, removing outdated timing workarounds. It helps ensure segment navigation in AI call debriefs remains reliable and reduces the chance of regressions in audio playback.
Original PR description
BACKPORT OF https://github.com/odoo/enterprise/pull/121951 The corresponding community commit has refactored the deferred seek synchronization in the CallDebrief component removing the reliance on the 'loadeddata' media event. Because of this, we don't need to manually trigger the event or wait for extra animation frames in this test anymore. This commit cleans them up to match the new behavior. task-6321435 Community counterpart https://github.com/odoo/odoo/pull/273733
Users can now close the installer and web watcher warning banners in the Timesheets Assistant without triggering an error. This keeps the interface responsive and prevents dismissed messages from staying visible unexpectedly.
Original PR description
Issue: - Closing the installer banner or the web watcher warning banner in the Timesheets Assistant raises an Owl error and leaves the banner visible. Cause: - Both buttons bind their handler with a bare method name, e.g. `t-on-click="onDismissConnectionWarning"`. Bare identifiers are resolved against the template rendering context, which no longer exposes component methods. Fix: - Reference the handlers through `this`. task-6373382
This change updates a payment-related test to use a smaller, more targeted XML sample instead of generating a full XML file. It helps make the test more reliable and easier to maintain, reducing the chance of false failures in invoice import checks.
Original PR description
Move the partner retrieval bank account number test to the `test_ubl_import_bis3_invoice_be_retrieve_partner.py` file and use a partial XML instead of a generated XML. Forward-Port-Of: odoo/odoo#274591 Forward-Port-Of: odoo/odoo#269995
The display of the Pakistan Rupee (PKR) has been updated so the currency symbol appears before the amount, matching local market practice. This helps make invoices and financial documents look more familiar and accurate for users in Pakistan.
Original PR description
This commit updates the symbol position of Pakistan's currency (PKR) to `before amount`, as previously it was displayed `after amount`, which is not the market practice; as shown over [here](https://drive.google.com/file/d/14pcqXTZSR0BygBXGvgQ6oCLRW0-4dYUh/view?usp=drive_link). This is a backport of [PR](https://github.com/odoo/odoo/pull/269204) task-6236452 Forward-Port-Of: odoo/odoo#271499
The print button on customer invoices is being restored to its primary position. This removes a confusing change and keeps the button prominent unless the invoice has already been sent, where the secondary style still makes sense.
Original PR description
In task-6269645, the print button on customer invoices was set to secondary instead of primary. This is a mistake and it's confusing, so it's being reverted in this commit because it only needs to be secondary if the move is sent. task-6357618 Forward-Port-Of: odoo/odoo#273953
The website title form now uses a style that can be edited in the visual editor, instead of a fixed alignment setting. This makes it easier for users to change how the title is displayed directly from the website editor.
Original PR description
`s_title_form` comes with the `text-center` utility class which forbids edition through the web_editor, it needs to use inline-style instead. task-6149380 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263334
This update adjusts a system setting so it points to the demo environment instead of a test one. It helps ensure the account EDI proxy uses the intended setup for the current users and avoids misconfiguration.
Original PR description
The system parameter is already brought to demo in account_peppol module. But the current users are not for pdp. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#272462
This update fixes a test related to Italian electronic withholding documents. It does not change the business behavior, but helps ensure the existing functionality is validated correctly and reduces the risk of false test failures.
Original PR description
This commit just want to correct a test of a PR already merged. Original commit: 78ffb5a2e63401123e4506056493e52cf3e69953 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274262 Forward-Port-Of: odoo/odoo#274062
This update ensures that refund lines in sale reports are accurately represented with positive amounts and taxes, aligning with how localizations like the 'l10n_be_pos_blackbox' handle refunds. Previously, refunds were displayed with negative values, creating confusion. This change provides a more consistent and accurate view of sales transactions, including refunds.
Original PR description
Amounts and taxes now consistently follow the order line sign, allowing localizations (e.g. l10n_be_pos_blackbox) to report negative lines of regular orders as refunds with positive amounts. enterprise PR: https://github.com/odoo/enterprise/pull/122411 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273994
This update resolves an issue preventing users from successfully uploading attachments or using drag-and-drop functionality when scheduling messages. The fix ensures proper attachment handling and enables the drag-and-drop feature, improving the scheduling workflow.
Original PR description
Steps to reproduce: 1. Create a log note or send a message on any record and open the full composer. 2. Set a date in the future to schedule the message for later and click schedule. 3. Click on the…
Steps to reproduce: 1. Create a log note or send a message on any record and open the full composer. 2. Set a date in the future to schedule the message for later and click schedule. 3. Click on the "Edit" button of the newly scheduled message. 4. Try dragging and dropping an image into the body, or add a file as an attachment using the button. Issue: - Dragging and dropping an image into the form does nothing. - Trying to add a file as an attachment using the button triggers a traceback: `TypeError: Cannot read properties of undefined (reading 'resId')` Why this happens: - The failure when adding explicit file attachments occurs because the `model` and `res_id` fields were omitted from the `mail.scheduled.message` form view layout in the commit 3b985d2. Without these field declarations, the `mail_composer_attachment_selector` widget cannot determine the record metadata parameters, causing the upload to crash. - The failure of the drag-and-drop mechanism occurs because the scheduled message edit view uses the default `FormController` class instead of `MailComposerFormController` which is used in the `mail_compose_message` view. Consequently, the underlying `useCustomDropzone` is never instantiated on the view, leaving drop events unhandled. Fix: 1. Specify `js_class="mail_composer_form"` to the scheduled message form view definition tag to handle drag and drop, as well as adding the missing fields 2. Assign the `resIds` variable based on the message type since it is defined as `res_id` instead of `res_ids` in `mail.scheduled.message`. opw-6273260 Forward-Port-Of: odoo/odoo#268515
This update resolves a validation error that occurred when installing the `l10n_uy` module on demo databases in version 19.3 and later. The issue stemmed from redundant data being written to journals, now corrected by removing the unnecessary setting from the module's account journal configuration.
Original PR description
**Issue:** Installing `l10n_uy` on a demo database raises a ValidationError from the `check_use_document` constraint since 19.3+. The error occurs because `ir_module.py:write()` re-applies…
**Issue:** Installing `l10n_uy` on a demo database raises a ValidationError from the `check_use_document` constraint since 19.3+. The error occurs because `ir_module.py:write()` re-applies module-specific template data to all companies with a matching chart template after installation. At that point, `demo_company_uy` already exists with `chart_template='uy'` and posted demo invoices, so `_load_data` ends up writing `l10n_latam_use_documents=True` to a journal that has validated entries. This write was previously suppressed by `_pre_reload_data`, which unconditionally removed journals from the data when found by xmlid. Commit 056b8e38ff84 (saas-19.3) narrowed that protection to only apply when `'type' in journal_data`. Since the module-filtered data never includes `type` (that field comes from `_get_account_journal` in the base `account` module, excluded by the module filter), the journal is no longer protected and the write triggers the constraint. **Versions:** 19.3+ **Fix:** remove `l10n_latam_use_documents=True` from `_get_uy_account_journal`. `l10n_latam_invoice_document` already sets this field for all LATAM companies via `_get_latam_document_account_journal`; l10n_uy was setting it redundantly. Task id: [6354499](https://www.odoo.com/odoo/project/49/tasks/6354499) Forward-Port-Of: odoo/odoo#273930
This update corrects a display issue in the journal entry preview. Previously, if a user didn't specify a currency, the credit amount incorrectly mirrored the debit amount. This change ensures the credit column accurately reflects the credit value, providing a more reliable preview for users.
Original PR description
In _move_dict_to_preview_vals(), when no currency is provided, the credit column falls back to the line's debit value, so any caller omitting currency_id would show the debit amount in both columns of the journal entry preview. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274594 Forward-Port-Of: odoo/odoo#269335
This update prevents Odoo from automatically re-pinning meetings when a call ends. Previously, this could create confusion and duplicate meeting entries. Now, meetings are only pinned when a new meeting is started, streamlining the meeting management process.
Original PR description
task-6373532 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
This update resolves an issue where website visitors couldn't see payment method images. The change restores necessary access permissions to retrieve these images, ensuring the 'Supported Payment Methods' snippet displays correctly for all users. This improves the user experience and functionality of the website payment process.
Original PR description
Steps to reproduce: - Add the "Supported Payment Methods" snippet on a website page - Open the page as a public (non-logged-in) visitor => An AccessError is raised: "You are not allowed to access…
Steps to reproduce: - Add the "Supported Payment Methods" snippet on a website page - Open the page as a public (non-logged-in) visitor => An AccessError is raised: "You are not allowed to access 'Payment Method' (payment.method) records". `get_supported_payment_methods` searched `payment.method` without `sudo()`, and its JSON response embeds `image` URLs that are fetched by the browser through the public `/web/image` controller, which requires either full read access on the record so a `_can_return_content` override granting content-level access. The root cause was introduced in [1]: that commit removed the blanket `base.group_public`/`base.group_portal`/`base.group_user` read grants on `payment.method`, replacing them with a `base.group_system`-only ACL plus a provider-scoped rule, as part of making payment methods provider-specific. It didn't account for the `website_payment` snippet controller, which relies on public read access to list the available payment methods and their logos. Fix by: - Using `sudo()` when searching `payment.method` in `get_supported_payment_methods` - Overriding `_can_return_content` on `payment.method` to allow public access to the `image` field only. [1]: bcfeed4b24f5155c111c3866e779bb2f119b9da8
This update resolves a technical issue where the call debrief player's segment seeking could be disrupted, leading to playback problems. The fix replaces an outdated callback system with a more reliable method that ensures the player correctly handles media loading and seeking, regardless of timing.
Original PR description
Backport of community PR https://github.com/odoo/odoo/pull/271300 `onMediaLoadedCallback` was a single shared hook consumed by whichever element fired `loadeddata` first. It could be mid-fetch at the moment the user clicked: it would fire `loadeddata` while still mounted (before OWL rendered), steal the callback intended for the incoming segment, and leave the new element at currentTime=0 Fixed by replacing the callback pattern with `useEffect` realizing `_pendingSeek` if any. The effect tracks the `mediaPlayer` signal and fires whenever OWL mounts a new media element, regardless of whether the file has loaded. Note: setting `currentTime` on the media element before `loadeddata` is valid. Browser stores the target and keeps `seeking=true` until data arrives, which naturally guards `onTimeUpdate` during the loading window. task-6321435 Enterprise counterpart https://github.com/odoo/enterprise/pull/122655
This update resolves an issue where the chatter displayed a misleading message ('This entry has been duplicated from') when reversing journal entries. The fix restores the previous behavior, ensuring accurate and consistent chatter messages for reversal moves. This improves clarity for users managing financial transactions.
Original PR description
This is a just a back-port of this commit https://github.com/odoo/odoo/commit/57b2a678ab0cc8a10d72825b1272fc0d1e0962cc --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a technical issue where the self-order POS system was experiencing errors due to tours prematurely ending before asynchronous processes completed. The fix ensures the system waits longer for these processes, preventing interruptions and improving stability.
Original PR description
Doesn't use setTimeout to wait for the rpc to finish, but await it instead even if it takes to long. The error was happening because the rpc was awaited for a maximum of 150 ms, sometimes in tours, the tour finish before the rpc is finished, which was causing the error.
This update resolves a bug that caused the activity counter in the avatar card tour to fail due to incorrect time zone handling. By scheduling activities with a deadline one week in the past, the counter now accurately reflects activity states regardless of user or system time zones, ensuring consistent reporting.
Original PR description
The avatar card tour asserts the systray activity counter, which only counts activities whose state is today or overdue. The test scheduled its activities without an explicit deadline, so…
The avatar card tour asserts the systray activity counter, which only counts activities whose state is today or overdue. The test scheduled its activities without an explicit deadline, so activity_schedule fell back to context_today on the class environment, whose superuser has tz Europe/Brussels with demo data. When the test runs between 22:00 and 00:00 UTC, that deadline is tomorrow from a UTC point of view. The state of an activity is however computed in the timezone of its assigned user, and hr_user is created without one, falling back to the server date (UTC). Its activities were therefore planned instead of today, the counter stayed empty and the tour timed out. The admin iteration kept passing because demo data gives admin the same Brussels timezone as the environment that computed the deadline, which is why only half the runs failed (both occurrences at 23:56 and 23:31 UTC). Schedule the activities with a deadline one week in the past instead: an old deadline is overdue in every timezone, whatever timezone the scheduling environment or the assigned user has, making the counter deterministic at any time of the day. https://runbot.odoo.com/odoo/error/941407 Forward-Port-Of: odoo/odoo#274679
This update resolves an issue where the counted inventory quantity in the Physical Inventory module was incorrectly resetting to zero after manual adjustments. The previous code automatically cleared the count when a user moved to a different line, regardless of input. Now, the quantity only resets to zero after the user has manually entered a value.
Original PR description
Versions -------- - 19.0+ Steps ----- 1. Open Physical Inventory; 2. click on a line; 3. click on a different line. Issue ----- Counted quantity automatically gets set to 0. Cause ----- Commit 3187030 changed the counted quantity widget to enable mutli-line edit. Part of this was done by ignoring the `onInput` hook, and always updating the counted quantity `onBlur`, making it so that the value is set to zero when clicking away, regardless of manual input. Solution -------- Use a `hasInput` state which gets set to `true` on user input. If not `true`, don't update the counted quantity on blur. opw-6365084 Forward-Port-Of: odoo/odoo#274987 Forward-Port-Of: odoo/odoo#274364
The 'View Meeting' button on the attendee calendar was broken, preventing users from opening meeting popups. This update corrects a technical error where the system incorrectly processed the meeting event ID, now correctly retrieving the event record and opening the meeting popover.
Original PR description
The "View Meeting" button of an activity in the attendee calendar popover did nothing when clicked. Its `onViewMeeting` callback is passed the activity's `calendar_event_id`, which is a record, but the handler treated it as an event id: it interpolated the record into the `.fc-event[data-event-id=...]` selector and used it to index `model.records`. Both lookups therefore missed, the `el && record` guard was never satisfied, and no meeting popover opened. Read the numeric id off the record (`calendarEvent.id`) so the event element and its record are found and the meeting popover opens. Forward-Port-Of: odoo/odoo#273438
This update fixes a bug where email bounces from mailing campaigns weren't accurately recorded for contacts. Now, the system correctly updates bounce counts when emails fail to deliver, ensuring more reliable tracking of email campaign performance and contact engagement. This improves the accuracy of mailing campaign analysis.
Original PR description
Previously, when a mailing campaign sent out an email to a mailing.contact, and that email bounced, the bounce would not increment the contact's bounce count. This commit makes it so that the bounce count is correctly updated when a mailing campaign sends an email that bounces. task-4893615 Forward-Port-Of: odoo/odoo#272648 Forward-Port-Of: odoo/odoo#226362
This update fixes an issue where manufacturing orders were incorrectly created when a product lacked a Bill of Materials. The change skips MO creation when a BoM isn't found, ensuring that replenishment rules are triggered instead. This prevents unnecessary manufacturing steps and improves order processing efficiency.
Original PR description
Steps to reproduce: - unarchive the MTO route - Create a storable product "P1" with the MTO + Manufacture routes but set no Bill of Materials on it - Create a sales order with one unit of P1 and confirm it Problem: An empty draft MO is created even though no Bill of Materials exists. When no BoM is available, manufacturing orders should not be created, only replenishment rules are expected to handle this case. Fix: Added an early `continue` in `_run_manufacture` to skip MO creation when no BoM is found. opw-6174886 Forward-Port-Of: odoo/odoo#272064 Forward-Port-Of: odoo/odoo#263108
This update resolves an issue where local development URLs (like `http://localhost:8069`) were sometimes incorrectly ignored by the system. By removing the requirement for a Top-Level Domain, this change ensures that local development environments can reliably connect to the email system. This improves the development experience for Odoo users.
Original PR description
Before this commit, url like `http://localhost:8069` were ignored by the `urlRegexp` because it requires a Top-Level Domain. This commit makes the Top-Level Domain optional. Forward-Port-Of: odoo/odoo#274379
This update fixes a recurring issue with the Odoo system's cache, specifically related to employee contract dates. By automatically updating a version number with the last write date, the system now ensures the cache is refreshed whenever an employee record is changed, preventing data inconsistencies. This improves the reliability of employee information displayed within Odoo.
Original PR description
There was yet another issue with the cache but related to the contract_date_start field. To prevent any issues like this to arise again, the version_revision will have the write_date to invalidate cache everytime the model has been written to. task-6326052 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#273932 Forward-Port-Of: odoo/odoo#272855
This update fixes an issue where purchase order receipt deadlines weren't updating correctly after quantities were set to zero. The fix ensures that cancelled stock moves no longer incorrectly influence the calculated deadline, resulting in more accurate and reliable receipt timelines. This improves the accuracy of delivery scheduling.
Original PR description
Steps to reproduce the bug:
- Create a Purchase Order with 2 products and confirm it
- Note the receipt's deadline (= date_planned of both lines)
- Set the quantity of one PO line to 0
- Update the scheduled date (date_planned) of the purchase order
Problem:
the receipt deadline does not update.
The receipt kept the old deadline from the cancelled move. When a PO line qty is set to 0, `_merge_moves` cancels the corresponding stock move via `_action_cancel`. Then `_update_move_date_deadline` correctly skips cancelled moves (filtered by `state not in ('done', 'cancel')`), so the cancelled move retains its original `date_deadline`. However, `_compute_date_deadline` on `stock.picking` used
`move_ids.filtered('date_deadline')`, which not checks move state, so the stale deadline of the cancelled move was included in the min/max computation.
opw-6292600
Forward-Port-Of: odoo/odoo#271890
Forward-Port-Of: odoo/odoo#270985This update optimizes how Odoo forms respond to changes. Previously, opening a form triggered onchange methods multiple times for each field that changed, leading to slower performance. This fix reduces redundant calls within a single change event, resulting in a smoother and faster user experience.
Original PR description
When an onchange method depends on several fields that all change at once (for example two fields that both have a default value), opening the form triggers that method once per field, even though a single call would suffice. This adds a per-pass set of already-applied onchange methods so that, within the same batch of changed fields, each method is invoked only once. Note this does not guarantee a method is called exactly once overall: it may still run again in later onchange passes; we only remove the redundant calls within a single pass. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273843 Forward-Port-Of: odoo/odoo#251813
This update fixes a minor typo in the Odoo email system's code that affected how the interface displays on different screen sizes. This ensures a consistent and professional user experience across all devices, improving usability for our customers. The change was made to maintain code quality and prevent potential display issues.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274630 Forward-Port-Of: odoo/odoo#274343