Daily updates from Odoo
Friday, August 1, 2025
85 changes
24 changes
Enhancements to existing features
Users are now notified when an IoT-connected device is disconnected instead of actions simply failing silently. This makes device issues clearer and helps users understand why an operation could not be completed.
Original PR description
If a device is disconnected, we had no way of telling the user, we only didn't perform the action. Now we notify the user that the device is disconnected. Enterprise PR: odoo/enterprise#91419 Task: 4978644
Point of Sale users in Belgium now see a clearer disconnection message when the fiscal blackbox cannot be reached through the IoT Box. The dialog includes a retry option, helping staff continue order validation or clock in/out once the connection is restored.
Original PR description
We improved the dialog telling the user its blackbox is disconnected from the IoT Box. We added a retry button to allow retrying validation of an order and clocking in/out. Community PR: odoo/odoo#221345 Task: 4978644
Resolved issues and error corrections
Payments through Authorize.Net and AsiaPay no longer crash when a payment provider has no currency configured. This helps customers complete payment flows more reliably and avoids an error during payment link checkout.
Original PR description
The system crashes when an `authorize.net` payment provider has no currency configured and user try to make payment. **Steps to reproduce:-** - Install `Sales` module. - Install the `Authorize.net` as a `payment provider`. - Set the mode as `Test mode` > set credentials > click on `Generate Client Key`. - `Configuration page > remove the currency and save`. - Now, go to any sale order > click on the gear icon > click `generate payment link` > and try to pay on that link using a card. **Error:-** `IndexError: tuple index out of range` **Solution:-** - In this commit, we checked that if currency is present then we will call `_validate_amount_and_currency` otherwise we skip it. **sentry-6757453610** I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Timesheet administrators who do not have Project app access can now open timesheet lists and related forms without being blocked by permission errors. This keeps timesheet review workflows available while respecting existing project access restrictions.
Original PR description
Steps to Reproduce: - Ensure the `sale_timesheet` module is installed. - Log in as a user with Timesheet Administrator permissions but without access to the Project module. - Attempt to open the…
Steps to Reproduce: - Ensure the `sale_timesheet` module is installed. - Log in as a user with Timesheet Administrator permissions but without access to the Project module. - Attempt to open the Timesheets list view results in an `AccessError` due to missing read rights on `project.task`. - Create a task in a private project linked to a timesheet and open its form view results in an `AccessError` due to missing read rights on `project.project`. Cause: - When a user has Timesheet Administrator access but lacks project access, they can view all timesheets, including those linked to tasks with private privacy visibility. However, these users do not have read access to the private tasks themselves. - The `_compute_commercial_partner` method reads `task_id.partner_id.commercial_partner_id` and `project_id.partner_id.commercial_partner_id`. When a user without read access to `project.task` or `project.project` tries to compute this field, an `AccessError` occurs because the code tries to access these related records without bypassing access rights. Solution: - Use `sudo()` on `task_id` and `project_id` when accessing their `partner_id` fields inside the compute method to bypass access rights checks, preventing ` AccessError` for users lacking read permissions. task-4798066 Forward-Port-Of: odoo/odoo#221247 Forward-Port-Of: odoo/odoo#210826
The Point of Sale now waits briefly before checking connectivity after an internet interruption, avoiding a false offline state. Once the connection is restored, it automatically triggers order synchronization so sales data is sent to the backend without manual intervention.
Original PR description
Steps to reproduce: - open a pos on a runbot from saas-18.2 - turn off the wifi on your device until you see the disconnected sign - turn back on the wifi - the pos stays in "offline" mode Issue: The ping rpc call is made before the connection is really reestablished. The rpc call fails and the network.offline attribute stays true. This prevent the data from being sent to the backend. Fix: Set a timeout to perform the ping rpc call and sent an envent to notify the pos_store to syncAllOrders when back online. Task-id: 4978122 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#220954
This fix ensures activities already marked as done are not counted as overdue or due soon in activity searches and menus. It improves accuracy for teams that keep completed activities for reporting, preventing misleading follow-up counts while preserving access to archived CRM leads where needed.
Original PR description
The search for "my_activity_date_deadline" is used to find activities due before some set date. When keeping done activities for reporting purposes, we should never consider "done" activities for this search. Issue is introduced in CRM in [1] but it could happen anywhere task-4951716 [1]: https://github.com/odoo/odoo/commit/f9f0529c93614bb9f9deec1a5aaa1daccfe8b58c Forward-Port-Of: odoo/odoo#220600 Forward-Port-Of: odoo/odoo#219426
Creating vendor bills from multiple purchase orders no longer crashes when the selected orders belong to different vendors. The system now only pre-fills a vendor when all selected purchase orders use the same vendor, allowing users to continue billing safely from the list view.
Original PR description
Bug introduced by: https://github.com/odoo/odoo/commit/b75394102bec3e25b23c75fd82ca0d8dec2726c5#diff-1281da5f4d0a3daaf162a2e6456469537d1b74b8034437783c9c717307aa8fcdR859 Steps to reproduce: - Create…
Bug introduced by: https://github.com/odoo/odoo/commit/b75394102bec3e25b23c75fd82ca0d8dec2726c5#diff-1281da5f4d0a3daaf162a2e6456469537d1b74b8034437783c9c717307aa8fcdR859 Steps to reproduce: - Create two purchase orders with different vendors - Add any product and confirm both orders - From the purchase order list view, select both orders - Click on "Create Bill" Problem: A traceback occurs when selecting multiple purchase orders with different vendors and clicking Create Bill from the list view. This is due to default_partner_id being forcibly set in the context, which assumes a single vendor. This bug was introduced by commit b753941, where default_partner_id is always injected into the context, even when multiple vendors are involved: https://github.com/odoo/odoo/commit/b75394102bec3e25b23c75fd82ca0d8dec2726c5#diff-1281da5f4d0a3daaf162a2e6456469537d1b74b8034437783c9c717307aa8fcdR714 Why it breaks: When creating a bill, action_view_invoice() is called without verifying that only one vendor is selected. Setting a default_partner_id in such cases leads to invalid assumptions and crashes. Difference with attachments case: When uploading bills from attachments, a check does ensure a single vendor is selected before calling action_view_invoice() (see b753941#R714). Fix: Only inject default_partner_id into the context if all selected purchase orders share the same vendor. opw-4948142
Turkish Nilvera e-invoices now include clearer currency exchange-rate information when issued outside TRY and correctly show total discounts. The XML format was adjusted to match Nilvera requirements, helping invoices be accepted and preserving the correct payable amount.
Original PR description
This commit does following fixes for e-invoice XML generated for Nilvera. - adds currency exchange rate as note in XML if invoice currency is other than TRY. - adds total discount amount at the Invoice document level. - creates a new XML template for TR e-invoice inherited from the UBL Invoice Template. - removes the `<cac:PrepaidAmount>` node as it is not a valid node in Nilvera and adds the node value to `<cac:PayableAmount>` so that actual invoice amount is preserved while sending e-invoice. TaskID:4815875 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220815 Forward-Port-Of: odoo/odoo#216594
This fix brings back the Position option for images in website grid layouts, so users can again control how images fit inside grid blocks. It also prevents an error when switching grid items back to normal mode, improving reliability in the website builder.
Original PR description
Since commit [1], the "Position" grid image option is not appearing anymore, making it impossible to change the `object-fit` property of the grid item images, making them forced to always be in…
Since commit [1], the "Position" grid image option is not appearing anymore, making it impossible to change the `object-fit` property of the grid item images, making them forced to always be in `cover`. The fix of commit [1] was made to avoid a traceback when toggling back to normal mode, because the `isApplied` was run after the grid mode was disabled but before the option noticed that it was not supposed to be there anymore. However, this was not the right fix, as it made the option not appear at all. This commit removes this previous fix and fixes the issue by simply checking if the `o_grid_item_image` element is well present in `isApplied`(as it was done before the refactoring). This commit also cleans the code a bit and renames the files/component/plugin/action so they are called `grid_image_` instead of `image_grid_`, to be more correct and to make the link with the old code. [1]: https://github.com/odoo/odoo/commit/82882b7e3e24951aa7224a3a266e57cc4773e546 task-4367641
This change restores the previous handling of subcontracted product moves to avoid breaking backorders when a delivery contains both regular and subcontracted products. It prioritizes keeping barcode operations workable, while any remaining backend issue can still be corrected manually by users.
Original PR description
This commit reverts db8b33e (and the wrong follow-up fix of 2755c09) because it breaks backorders for pickings that mix regular and subcontrcted products. We'd rather the flow has problems in back end where the user can manually uncheck the picked box rather than in barcode where there is no work around. We keep the enterprise test introduced in [792c968](https://github.com/odoo/enterprise/commit/792c968) to protect the barcode flow. Forward-Port-Of: odoo/odoo#220318
Free self-service POS orders are now processed the same way as paid orders for fulfillment purposes. This ensures stock picking and preparation records are created even when the customer owes nothing, preventing missed order handling.
Original PR description
Steps to reproduce: ------------------- 1. Create a free product 2. Add it to self_order 3. Make a self order with only that product -> Free order Sicne it's a free order, you will not be asked to…
Steps to reproduce: ------------------- 1. Create a free product 2. Add it to self_order 3. Make a self order with only that product -> Free order Sicne it's a free order, you will not be asked to pay, which is normal. However, the issue is, no picking is created for that order!! Why the issue? -------------- For a non free self order, we create a picking for it by calling `_process_saved_order` [1] with `draft` argument set to `True`, either after paying using the online payment method [2], or after paying it from the payment wizard [3]. However, since for free orders, we're not asked at any point to pay, and hence, we're not calling `_process_saved_order` with `draft=True` at any point, and as consequence, we're also not calling `_create_order_picking`, no picking will be created for it. The fix ------- After, marking the free order as 'paid', we manually call `_process_saved_order(True)`. We only do it for the free orders, since the flow is working as expected for non-free order. [1]: https://github.com/odoo/odoo/blob/a7a29ed691db4f1607c0d12929c56845681164fa/addons/point_of_sale/models/pos_order.py#L153C19-L153C31 [2]: https://github.com/odoo/odoo/blob/a7a29ed691db4f1607c0d12929c56845681164fa/addons/pos_online_payment/models/payment_transaction.py#L64 [3]: https://github.com/odoo/odoo/blob/a7a29ed691db4f1607c0d12929c56845681164fa/addons/point_of_sale/wizard/pos_payment.py#L70 opw-4739523 Forward-Port-Of: odoo/odoo#221434 Forward-Port-Of: odoo/odoo#218118
Point of Sale now calculates lot availability using only stock from the configured PoS source location and its internal child locations. This prevents cashiers from seeing or selling quantities that exist elsewhere but are not actually available to that PoS location.
Original PR description
The get_existing_lots function previously returned product_qty based on stock.lot's computed field, which sums quantities from all locations. This led to incorrect available quantities in the PoS, as it should only consider stock in the configured PoS source location and its child internal locations. opw-4865777 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219444 Forward-Port-Of: odoo/odoo#215227
Dates shown in website content can no longer be edited directly from the builder. This prevents users from accidentally breaking date displays while editing pages such as blog listings.
This fix ensures that when a sales order is settled in Point of Sale, the latest order line quantities are used instead of outdated cached values. This prevents cashiers from charging based on old quantities after a sales order was changed elsewhere.
Original PR description
Steps to reproduce ------------------ 1. Create a Sales Order, add a product with QTY = X 2. Open PoS 3. Load this same Sales order (by clicking "Settle the order"-> QTX is X as expected 4. Return to…
Steps to reproduce ------------------ 1. Create a Sales Order, add a product with QTY = X 2. Open PoS 3. Load this same Sales order (by clicking "Settle the order"-> QTX is X as expected 4. Return to Sales order (in the sales app) 5. Edit QTY from X to Y and save 6. Go back to PoS 7. Delete the laoded Sales Order and load it again -> Notice that QTY is still X and not the updated Y!! Other Flow in frontend ---------------------- 1. Create a Sales Order, add a product with QTY = X 2. Open PoS 3. Load this same Sales order (by clicking "Settle the order"-> QTY is X as expected 4. Change the quantity manually, to pay for X - 1 5. Validate and pay for the order 6. Load the same Sales order again with "Settle the order" -> The quantity is still X and the price is the unit price times X!! Why the issue ------------- When settling the order, we get its value using _getSaleOrder which basically reads it from the cache. So it will read the old order lines having the old qty, and not the updated one. The fix ------- Instead of reading the lines from the cache, we read them direcly from the backend, to accomodate for cases where the data might have been changed on another device or has not been updated in the cache. opw-4819708 opw-4913397 Co-authored-by: Arthur Nanson <artn@odoo.com> Forward-Port-Of: odoo/odoo#220813 Forward-Port-Of: odoo/odoo#218331
This fixes a problem that could prevent users from printing PDF documents from Android mobile browsers. The change gives Android print previews enough time to finish preparing the document, reducing failed or incomplete print attempts.
Original PR description
Currently, pdf.js does not support printing from mobile browsers, and the pdf.js team will not fix this issue [1]. I investigated and found that sometimes `window.print()` is asynchronous [2]. On Android, the print preview dialog re-renders the entire PDF within the preview, which can obviously take some time and the abort method is call before the preview rendering is complete. opw-4190135 [1]: https://github.com/mozilla/pdf.js/issues/12020 [2]: https://github.com/mozilla/pdf.js/blob/2d0ba7db08fb6bb597ba718635314d8e8998a7d0/web/pdf_print_service.js#L226 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221172 Forward-Port-Of: odoo/odoo#217526
Chat call windows now keep video streams large enough to view clearly when no participant is selected as the main card. This makes video calls easier to follow by prioritizing visible video content over small avatar-sized tiles.
Original PR description
Before this commit, when in a discuss call in a chat window with at least 1 video, clicking on no main card had all cards sized for avatar, including the video stream. This is a problem because the…
Before this commit, when in a discuss call in a chat window with at least 1 video, clicking on no main card had all cards sized for avatar, including the video stream. This is a problem because the video stream are very small, barely visible, which is unfortunate because when there are video streams they are usually the most important thing that call participants want to see. This commit fixes by adding a new CSS rule in chat window with call: when user in a call with at least 1 video stream, the size of call view matches the size of a 16:9 video stream when focused. Part of task-4967123 Before / After <img width="381" height="634" alt="Screenshot 2025-07-28 at 17 57 37" src="https://github.com/user-attachments/assets/878bae9f-01e5-4f81-9d61-b43180d4f809" /> <img width="385" height="637" alt="Screenshot 2025-07-28 at 17 57 17" src="https://github.com/user-attachments/assets/0261d716-e52c-4a72-ad6a-007c8d01a362" /> Forward-Port-Of: odoo/odoo#221124 Forward-Port-Of: odoo/odoo#220873
Manufacturing orders with very small work center costs could fail during validation because totals were rounded inconsistently. The fix ensures costs are rounded before being added, preventing accounting imbalance errors and showing the correct value in the manufacturing overview.
Original PR description
Steps to reproduce:
- Create two work centers with different expense accounts:
- First: hourly cost of 0.01
- Second: hourly cost of 0.01
- Create an MO for a product with real-time valuation and 2 work orders
(one per work center).
- Each work order has an expected duration of 30:02
- Attempt to click on "Produce All" button.
This leads to an unbalanced move error.
This fix rounds the values before summing them to prevent rounding issues
and unbalanced moves. It also corrects the displayed value in the
Manufacturing Order overview.
opw-4631409
Forward-Port-Of: odoo/odoo#221083
Forward-Port-Of: odoo/odoo#211128Users who manage timesheets but do not have Project app access can now open Timesheet list and kanban views without being blocked by an access error. This keeps time tracking workflows available for administrators while respecting project permissions.
Original PR description
Steps to Reproduce: - Ensure the `timesheet_grid_holidays` module is installed. - Log in as a user with Timesheets Administrator access but no access to the Project module. - Navigate to the Timesheets > List or Kanban view. - An `AccessError` occurs due to missing read rights on the `project.task` model. Cause: - In the `timesheet_grid_holidays` module, the `_should_not_display_timer` method accesses `self.task_id.is_timeoff_task` without checking access rights, causing an `AccessError` when users who can view timesheets but lack read access to `project.task` try to access tasks linked to projects with private privacy visibility. Solution: - Use `sudo()` when accessing `self.task_id` in `_should_not_display_timer()` to avoid access errors. task-4798066 Forward-Port-Of: odoo/enterprise#91361 Forward-Port-Of: odoo/enterprise#86302
Changing the date of a recurring planning shift linked to sales no longer causes an error. The system now ignores shifts that were removed during the update, allowing users to safely edit all recurring shifts without disruption.
Original PR description
Version: 17.0 Steps to reproduce: - Install sale_planning - Create a recurrence shift. - Change the date of second shift which is created by recurrence. - Give the edit value as All shifts. - save record, missing error occured. Issue: When a user changes the date of a shift created by recurrence, the system crash with the message, "Record does not exist or has been deleted." Cause: There was an issue between "Planning" and "Sale Planning". When a user moves a shift, "Planning" removes the old shift from the system except the first one, But 'sale planning' was still trying to work with that removed shift. Fix: Now, after 'Planning' does its work, 'Sale Planning' checks again to see that shifts are still there. It only works with shifts that actually exist. So crash no longer happens. Users can now safely change the date of recurring shifts without errors. task-4859892 Forward-Port-Of: odoo/enterprise#91236 Forward-Port-Of: odoo/enterprise#88234
Users with timesheet access can now start and stop timers on tasks they are allowed to access, even when the related project is private. This prevents access errors during timesheet confirmation and keeps field service time tracking working as expected.
Original PR description
Before this commit, when the project is private and the user can only access to some tasks inside that project, he can create timesheets but cannot stop timer in one of those tasks when…
Before this commit, when the project is private and the user can only access to some tasks inside that project, he can create timesheets but cannot stop timer in one of those tasks when `industry_fsm` module is installed. This commit makes sure the user can start/stop a timer on task for which he has access to even if the project is private and he does not have access to it. Steps to reproduce the issue: ---------------------------- 0. install industry_fsm module 1. Create a project A with "followers" as privacy visibility 2. Create a task A and assign it to a project user with lowest timesheet access right. 3. log in as that user 4. Start a timer on Task A 5. Stop the timer and confirm the wizard Expected Behavior: ----------------- The timesheet should be created without any issue Current Behavior: ---------------- An Access error is raised because the user has no access to the project. task-4680412 Forward-Port-Of: odoo/enterprise#91308 Forward-Port-Of: odoo/enterprise#84807
This fix corrects how absence-related days are calculated in Swiss payroll reporting. It helps ensure payroll figures and related submissions are more accurate, reducing the risk of incorrect employee or compliance data.
Original PR description
Forward-Port-Of: odoo/enterprise#91391 Forward-Port-Of: odoo/enterprise#91358
Vendor batch payments now use the correct payable account when matched with bank statement lines. This prevents reconciliation from posting to the wrong partner account and helps keep supplier balances accurate.
Original PR description
**Steps to reproduce:** - Install accountant - Go to "Accounting / Vendors / Payments" - Create a payment: * Payment Type: Send * Vendor: [any] * Amount: 1000 - Confirm the payment - From payments list, select the payment and create a batch - Validate the batch payment - From Accounting dashboard, go to Bank journal - Create a statement: * Partner: [None] * Amount: -1000 * Memo: [anything] - Reconcile the statement with the batch payment **Issue:** The receivable account of the partner is used for the batch line instead of his payable account. **Solution:** Select the type of the account to use depending on the type of the payment. opw-4952786 Forward-Port-Of: odoo/enterprise#91354 Forward-Port-Of: odoo/enterprise#91206
When sending a document for signature, users who are also listed as signers are now taken directly to their signing page instead of seeing a confusing prompt to send the document again. This makes the signing flow clearer and avoids repeated signer entry.
Original PR description
**Version:** - saas-18.3 **Steps to reproduce:** - Open a sign template. - Click "Send". - Add signers (include yourself). - Click "Send" to confirm. - The template is shown in preview mode. - Click "Sign Now". - A new "Send" dialog appears. - You have to add signers again. - Click "Send" again. **Issue:** - When the logged-in user is one of the signers, clicking the "Send" button shows a notification and not allows the user to sign. But clicking "Sign Now" again after that is confusing. **Solution:** - If the current user is a signer, clicking the "Send" button should directly open the sign view for that user to sign. task-4933608 Forward-Port-Of: odoo/enterprise#89943
Fixed an issue where all-day calendar events could incorrectly make valid evening appointment slots appear unavailable in some time zones. This improves booking accuracy for users scheduling appointments near midnight UTC.
Original PR description
All-day calendar events were incorrectly causing unavailability for appointment slots scheduled on the previous evening, due to mismatches between local time and UTC. Previously, all-day events…
All-day calendar events were incorrectly causing unavailability for appointment slots scheduled on the previous evening, due to mismatches between local time and UTC. Previously, all-day events scheduled for Tuesday were stored with a start time of 00:00 UTC. In timezones like America/Chicago, this corresponds to 7:00 PM Monday. As a result, a valid appointment booked from 6:30 PM to 8:00 PM local time on Monday would partially fall into Tuesday in UTC (ending at 01:00 UTC), causing a false conflict with Tuesday’s all-day event. The `calendar_verify_availability` method now calls the newly added `_get_date_boundaries` which than computes naive datetime boundaries based on the user's local timezone by taking the end of the previous local day and the start of the next local day. This change resolves those edge cases where evening slots crossing the UTC boundary were falsely marked as unavailable due to timezone misalignment. opw-4614544 Forward-Port-Of: odoo/enterprise#90680 Forward-Port-Of: odoo/enterprise#85654
18 changes
Enhancements to existing features
Restaurant self-ordering users can now access a "Get QR Codes" button directly from the floor plan view. The button opens a prefilled Odoo.com form, making it easier to order engraved QR codes for tables and speed up self-order setup.
Original PR description
Add a `Get QR Codes` button on the floor plan view TaskID: 4814164 Forward-Port-Of: odoo/odoo#221489 Forward-Port-Of: odoo/odoo#218164
Kiosk and self-order screens now automatically refresh when product availability changes, so customers see current stock status without a manual reload. This prevents unavailable items from being selected or paid for, reducing failed orders and improving the customer experience.
Original PR description
Before this commit: --------------------------- - Product availability changes were not reflected in the kiosk or self-order screens. - Users could select and proceed to payment for products that were already out of stock. - No automatic UI update; a manual page reload was required to reflect stock changes. After this commit: ------------------------------------ - Product availability changes now automatically refresh the kiosk and self-order interfaces. - Unavailable products are blocked from being selected or paid for. - The UI reflects real-time stock status, ensuring a consistent and reliable experience. Task-4830424
The point-of-sale settlement flow no longer loads all accounting move records upfront when they are not immediately needed. This reduces memory use and speeds up loading, especially for businesses with large accounting histories.
Original PR description
Before this commit, all account.move records were loaded into the PoS interface, even though they were not used immediately. This caused significant performance issues, increasing memory usage and loading times. opw-4986727
Resolved issues and error corrections
Corrects how future time off balances are calculated when unused days can carry over for a limited period. Employees and HR teams will now see the correct available leave after carryover days expire, avoiding misleading zero or partial balances in future balance checks.
Original PR description
### Steps to reproduce: - Create an accrual plan with the following rule: — The employee has 20 days off in the first year. Total 20. — The employee has 21 days off in the second year and an…
### Steps to reproduce: - Create an accrual plan with the following rule: — The employee has 20 days off in the first year. Total 20. — The employee has 21 days off in the second year and an additional 5 days off if available from the previous year, which can be taken until 6 months. Total 21 + 5 = 26 — The employee has 22 days off in the third year and an additional 5 days off if available from the previous year, which can be taken until 6 months. Total 22 + 5 = 27 — The employee has 23 days off in the fourth year and an additional 5 days off if available from the previous year, which can be taken until 6 months. Total 23 + 5 = 28 - Create an accrual allocation with the created plan - Check future allocation data using 'Balance at the' - Notice the following behaviour: — until 31/12/2025 it CORRECTLY shows 20 days available. — from 01/01/2026 to 30/06/2026 it CORRECTLY shows 26 days (21 days for renewal and 5 days not used in 2025) — from 01/07/2026 it INCORRECTLY shows no days available. — from 01/01/2027 to 30/06/2027 it CORRECTLY shows 27 days (22 days for renewal and 5 days not used in 2026) — from 01/07/2027 it INCORRECTLY shows 5 days. — from 01/01/2028 to 30/06/2028 it CORRECTLY shows 28 days (23 days for renewal and 5 days not used in 2027) — from 01/07/2028 it INCORRECTLY shows no days available. — from 01/01/2029 it CORRECTLY shows 28 days again. — In the following years, after 6 months, one year shows 5 days and the next shows nothing. ### Cause: The first cause here is that when we have validity for the carryover then we will have two calls in each year one at the start of the year and another at the expiration date of the carryover. So, when we add the days to the allocation we don't consider the second call in the condition and we only check if the allocation.actual_lastcall is equal to one of the start dates for each year https://github.com/odoo/odoo/blob/3fb37cbc59adc2caace8efcdae418d2466a9b750/addons/hr_holidays/models/hr_leave_allocation.py#L588 The second cause where each two years one of them shows the number of carryover days from the previous year, this is happening because when we remove the expiring days for the first year we set the number of days to 0 https://github.com/odoo/odoo/blob/3fb37cbc59adc2caace8efcdae418d2466a9b750/addons/hr_holidays/models/hr_leave_allocation.py#L516-L517 And it will be 0 until we loop again and add the days to allocation https://github.com/odoo/odoo/blob/3fb37cbc59adc2caace8efcdae418d2466a9b750/addons/hr_holidays/models/hr_leave_allocation.py#L521-L522 and since this is happening after we already set the expiring days which in this year will be 0 we won't remove those expiring days from the year's allocation data ### Fix: We add a condition to check if the actual_lastcall is either a date in the start of the allocation or one of the expiration dates for the carryover. Also, before we set the value of the expiring_carryover_days we call _add_days_to_allocation to calculate on the correct number of days for the plan level we are checking. opw-4606886 Forward-Port-Of: odoo/odoo#221248 Forward-Port-Of: odoo/odoo#209669
Invoice line rounding differences are now spread evenly across lines instead of being applied to one large line. This helps electronic invoices meet PEPPOL/BIS3 validation rules and reduces the risk of rejected invoices due to rounding discrepancies.
Original PR description
Before this commit, the behaviour of `_round_base_lines_tax_details` was to assign all the base line delta to the largest base line. However, when generating the UBL, the delta would then get included in the LineExtensionAmount, but BIS3 rule PEPPOL-EN16931-R120 enforces that the LineExtensionAmount must be at most 2 cents away from `(quantity * net price) + sum(charges) - sum(allowances)`. Effectively this means that we can put at most 2 cents base delta on each invoice line. After this commit, `_round_base_lines_tax_details` redistributes the base delta evenly over all the base lines. task-none Forward-Port-Of: odoo/odoo#220701 Forward-Port-Of: odoo/odoo#219244
Confirming a sales order for a service that creates a project now correctly assigns the customer's company when the project template has no company set. This prevents an unexpected error and lets businesses create project-based work from sales orders without manual data cleanup.
Original PR description
Currently, a user error occurs when confirming a Sales Order (SO). **Steps to reproduce:** 1) Install sale_project 2) Create a service product that generates a project and a task. 3) Add a project…
Currently, a user error occurs when confirming a Sales Order (SO). **Steps to reproduce:** 1) Install sale_project 2) Create a service product that generates a project and a task. 3) Add a project template by creating one from the product form view. 4) Create an SO by creating a customer with a company 5) Add the above-created service product and confirm the SO. **Error:** A user exception will be triggered ``` The project and the associated partner must be linked to the same company. ``` **Cause:** - When a project template is created from the product view, both the customer and the company_id default to empty. - Later, when confirming a SO with a customer that belongs to a company, the new project's company_id is taken from the project template, which is empty. https://github.com/odoo/odoo/blob/876e9d5e9ba87fa69188b2da098eec78f77040f5/addons/sale_project/models/sale_order.py#L140-L141 - However, the project’s partner_id (the customer) does have a company_id, (since the customer value for the project will be set through SO's customer). - This leads to a mismatch between the project’s company_id(which is empty) and its partner’s company_id. So a user exception will be triggered from the below lines https://github.com/odoo/odoo/blob/876e9d5e9ba87fa69188b2da098eec78f77040f5/addons/project/models/project_project.py#L257-L258 **Solution:** - If the project template has no company_id, and the customer of the project has one, set the project’s company_id to match that of the customer. opw-4900741,4880495 Forward-Port-Of: odoo/odoo#216582
This fixes a Spanish accounting setup issue where two domestic fiscal positions existed after an upgrade. The duplicate Mainland Spain entry is merged into ES Domestic, reducing confusion and helping ensure taxes are applied consistently.
Original PR description
Before this commit: - In version 18.3, due to changes and migrations in fiscal positions, the domestic fiscal position for Spain was duplicated (ES Domestic and Mainland Spain). After this commit: - Merged the duplicated fiscal position 'Mainland Spain' into 'ES Domestic'. task-4972464
Opening an invoice could fail when related credit notes and statement lines existed for the same partner. The accounting calculation was adjusted so the outstanding credits and debits information is computed independently, preventing the error and keeping invoice payment information available.
Original PR description
To reproduce: - Install account_accountant (not reproducible on runbot with all modules installed) - Create an invoice for partner_a - Create a credit note for same partner - Create a statement line for same partner - Open the invoice => Traceback The issue is that invoice_outstanding_credits_debits_widget is first put to False, then protected. So the real value is not put, while invoice_has_outstanding is changed. So in the override of the compute, it does not contain 'content' (=False), and so fails. The issue is not easy to solve. Problem of cache protection etc,... The situation does not seem problematic per se. We separate the 2 fields in 2 compute, so invoice_outstanding_credits_debits_widget is not protected by the computation of invoice_has_outstanding --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Timesheet administrators who do not have Project app access can now open timesheet lists and related forms without being blocked by access errors. This keeps timesheet review workflows working while preserving normal project record permissions.
Original PR description
Steps to Reproduce: - Ensure the `sale_timesheet` module is installed. - Log in as a user with Timesheet Administrator permissions but without access to the Project module. - Attempt to open the…
Steps to Reproduce: - Ensure the `sale_timesheet` module is installed. - Log in as a user with Timesheet Administrator permissions but without access to the Project module. - Attempt to open the Timesheets list view results in an `AccessError` due to missing read rights on `project.task`. - Create a task in a private project linked to a timesheet and open its form view results in an `AccessError` due to missing read rights on `project.project`. Cause: - When a user has Timesheet Administrator access but lacks project access, they can view all timesheets, including those linked to tasks with private privacy visibility. However, these users do not have read access to the private tasks themselves. - The `_compute_commercial_partner` method reads `task_id.partner_id.commercial_partner_id` and `project_id.partner_id.commercial_partner_id`. When a user without read access to `project.task` or `project.project` tries to compute this field, an `AccessError` occurs because the code tries to access these related records without bypassing access rights. Solution: - Use `sudo()` on `task_id` and `project_id` when accessing their `partner_id` fields inside the compute method to bypass access rights checks, preventing ` AccessError` for users lacking read permissions. task-4798066 Forward-Port-Of: odoo/odoo#221247 Forward-Port-Of: odoo/odoo#210826
Point of Sale now correctly accepts multiple existing serial numbers on the same order line when creating new serial numbers is disabled. This prevents valid sales from being blocked when cashiers add several serialized units of the same product.
Original PR description
**Steps to reproduce:** - Install `point_of_sale`. - Go to POS -> configuration -> settings - Search 'Operation type' -> open picking type -> Disable `Create new` - Create a storable product 'test'…
**Steps to reproduce:** - Install `point_of_sale`. - Go to POS -> configuration -> settings - Search 'Operation type' -> open picking type -> Disable `Create new` - Create a storable product 'test' with serial tracking. - Add on-hand quantity with serial numbers. - In POS, select the product and choose one SN, - Select it again and choose another SN. **Observation:** - The order line should have 2 quantities with a list of Serial numbers chosen by the user. For one quantity, it's working fine, but for multiple quantities, an issue occurs. **Issue:** - While confirming edit serial numbers popup for multiple quantities, it checks whether each selected SN is valid or not. - The condition is that the entered SN is in the existing available SNs option. But the already chosen SN is not in the existing SN option, - Also, creating a new SN is disabled, so it's considered an invalid input. https://github.com/odoo/odoo/blob/876b7337eb689e0682ab48e9e833f9f0dc6bb8d2/addons/point_of_sale/static/src/app/store/select_lot_popup/select_lot_popup.js#L190-L193 **Solution:** - Added a condition to allow SNs that are already selected (matched by name and ID) to be considered valid inputs. opw-4865902 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220932 Forward-Port-Of: odoo/odoo#219205
This fix helps Point of Sale recover correctly after a temporary internet outage. When the connection comes back, the system now waits briefly before checking connectivity and then triggers order synchronization, reducing the risk of sales data staying unsent.
Original PR description
Steps to reproduce: - open a pos on a runbot from saas-18.2 - turn off the wifi on your device until you see the disconnected sign - turn back on the wifi - the pos stays in "offline" mode Issue: The ping rpc call is made before the connection is really reestablished. The rpc call fails and the network.offline attribute stays true. This prevent the data from being sent to the backend. Fix: Set a timeout to perform the ping rpc call and sent an envent to notify the pos_store to syncAllOrders when back online. Task-id: 4978122 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#220954
This change restores correct backorder handling when a delivery includes both regular and subcontracted products. It avoids blocking barcode users in a situation where they had no practical workaround, while keeping test coverage for the barcode flow.
Original PR description
This commit reverts db8b33e (and the wrong follow-up fix of 2755c09) because it breaks backorders for pickings that mix regular and subcontrcted products. We'd rather the flow has problems in back end where the user can manually uncheck the picked box rather than in barcode where there is no work around. We keep the enterprise test introduced in [792c968](https://github.com/odoo/enterprise/commit/792c968) to protect the barcode flow. Forward-Port-Of: odoo/odoo#220318
This fix prevents PDF print jobs on Android devices from being stopped too early while the print preview is still loading. It improves reliability for users printing documents from mobile browsers, reducing failed or incomplete print attempts.
Original PR description
Currently, pdf.js does not support printing from mobile browsers, and the pdf.js team will not fix this issue [1]. I investigated and found that sometimes `window.print()` is asynchronous [2]. On Android, the print preview dialog re-renders the entire PDF within the preview, which can obviously take some time and the abort method is call before the preview rendering is complete. opw-4190135 [1]: https://github.com/mozilla/pdf.js/issues/12020 [2]: https://github.com/mozilla/pdf.js/blob/2d0ba7db08fb6bb597ba718635314d8e8998a7d0/web/pdf_print_service.js#L226 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221172 Forward-Port-Of: odoo/odoo#217526
Users can now change dates for recurring shifts in Sale Planning without hitting a missing record error. The fix ensures Sale Planning only updates shifts that still exist after Planning processes the recurrence change, preventing disruptions when editing all shifts.
Original PR description
Version: 17.0 Steps to reproduce: - Install sale_planning - Create a recurrence shift. - Change the date of second shift which is created by recurrence. - Give the edit value as All shifts. - save record, missing error occured. Issue: When a user changes the date of a shift created by recurrence, the system crash with the message, "Record does not exist or has been deleted." Cause: There was an issue between "Planning" and "Sale Planning". When a user moves a shift, "Planning" removes the old shift from the system except the first one, But 'sale planning' was still trying to work with that removed shift. Fix: Now, after 'Planning' does its work, 'Sale Planning' checks again to see that shifts are still there. It only works with shifts that actually exist. So crash no longer happens. Users can now safely change the date of recurring shifts without errors. task-4859892 Forward-Port-Of: odoo/enterprise#91236 Forward-Port-Of: odoo/enterprise#88234
Timesheet administrators who do not have Project access can now open the Timesheets list and kanban views without hitting an access error. This prevents a blocking issue for managers who need to review timesheets but should not have broader project permissions.
Original PR description
Steps to Reproduce: - Ensure the `timesheet_grid_holidays` module is installed. - Log in as a user with Timesheets Administrator access but no access to the Project module. - Navigate to the Timesheets > List or Kanban view. - An `AccessError` occurs due to missing read rights on the `project.task` model. Cause: - In the `timesheet_grid_holidays` module, the `_should_not_display_timer` method accesses `self.task_id.is_timeoff_task` without checking access rights, causing an `AccessError` when users who can view timesheets but lack read access to `project.task` try to access tasks linked to projects with private privacy visibility. Solution: - Use `sudo()` when accessing `self.task_id` in `_should_not_display_timer()` to avoid access errors. task-4798066 Forward-Port-Of: odoo/enterprise#91361 Forward-Port-Of: odoo/enterprise#86302
Manufacturing users who are not HR users can now open the Shop Floor app without an access rights error. Employee barcode lookup is handled only when needed, avoiding restricted HR data access while preserving barcode identification on the shop floor.
Original PR description
**PROBLEM** If a user is in the mrp.group_mrp_user group, but does not belong to hr.group_hr_user, he can't access the shop floor app. **STEP TO REPRODUCE** 1. connect with a user which is a user of manufactring, but not a user of hr. 2. try to go on the shop floor app and notice there is an access right error. **CAUSE** When connecting to the shop floor app, we are trying to get the barcode field on all employee (because we need them if we want to identify an employee on the shop floor app using their barcode). This was added in this commit: https://github.com/odoo/enterprise/commit/b3fb0073a15adcc799a5681284f0cfd2308764b8 The barcode field is only accessible to member of hr.group_hr_user. **FIX** Instead of getting the barcode of all employee using `get_all_employee()`, we do a rpc call to query the employee the barcode belong to. opw-4905206
This fixes how absence-related days are calculated in Swiss payroll reporting. It helps ensure payroll and statutory declarations use accurate day counts, reducing the risk of incorrect employee records or reporting adjustments.
Original PR description
Forward-Port-Of: odoo/enterprise#91391 Forward-Port-Of: odoo/enterprise#91358
Payslip PDFs now correctly follow the salary structure setting that hides the basic wage. This prevents confidential wage details from appearing when the option is enabled, matching the expected payroll configuration.
Original PR description
After this commit: odoo/enterprise@9dceed0896ce5089bccbc9cc2ce1e8c4b13f0048…
After this commit: odoo/enterprise@9dceed0896ce5089bccbc9cc2ce1e8c4b13f0048 [diff](https://github.com/odoo/enterprise/commit/9dceed0896ce5089bccbc9cc2ce1e8c4b13f0048#diff-de4a628e7837c273b67d71f93efab85b6a9ee957ea702f502066ebcc632a76cbL64) The condition that handles hiding the basic wage on the payslip was not added —possibly it was missed. That’s why the "Hide basic on PDF" feature doesn’t work, regardless of whether it’s enabled, as the necessary condition is missing in the template. Steps to reproduce (on runbot): - In a v18 runbot, open any payslip and go to the salary structure. Enable the "Hide basic on PDF" option. - Return to the payslip and print it. - You’ll see that the basic wage is still printed on the payslip. **Before Fix:** <img width="669" height="238" alt="payslipbefore" src="https://github.com/user-attachments/assets/2fce67a2-19d8-45d8-88fa-4fc6a1767e68" /> **After Fix:** <img width="683" height="289" alt="payslipafter" src="https://github.com/user-attachments/assets/adcb0104-9c4e-4a35-ba78-b3f278f6bfda" /> opw-4953831 Forward-Port-Of: odoo/enterprise#90798
20 changes
Enhancements to existing features
Point of Sale now shows whether the connected IoT Box is available locally, online, or offline. This helps store staff quickly understand device connectivity and react faster when printers, payment terminals, or other IoT-connected hardware may be unavailable.
Original PR description
We now show local/online/offline IoT Box status in pos. Community PR: https://github.com/odoo/odoo/pull/221255 Task: 4978644 Forward-Port-Of: odoo/enterprise#91356
When a user has missed or ignored VoIP calls, the softphone now automatically opens the recent calls tab. This helps users quickly see who called and follow up without first navigating away from the dialer.
Original PR description
Purpose: To open recent calls tab in softphone interface when there are missed calls. Specification: This commit updates the VoIP systray item behavior to ensure that, when a user has missed calls, the softphone interface will automatically switch to the "recent" calls tab. Incase of an ignored incoming call, the softphone will now switch to the "recent" tab instead of the "dialer". Task-4917354
The signing request email templates have been adjusted to display better across different screen sizes, especially on mobile devices. This makes signing communications easier to read and use, improving the recipient experience with minor visual refinements.
Original PR description
This commit introduces modifications to the `sign` email templates to make them more responsive. It also adds some minor style changes to the content of templates task-id: 4423436
Knowledge conversations now open through a shared process instead of only in one specific action. This improves reliability across different user paths and helps ensure users reach the right discussion view wherever they start from.
Original PR description
Rather than patching the action specific method, patch thread open to work in all flows. Part of task-4681025 Part of task-4095268 https://github.com/odoo/odoo/pull/221069
Discuss actions such as message, thread, and composer options are now presented through a shared component, making them more consistent across the interface. This reduces duplicated presentation logic and gives users a cleaner, more familiar experience in areas like the Discuss sidebar and header.
Original PR description
Before this commit, discuss actions such as thread actions and message actions were defined differently from their own registries. The style of the actions are defined by component that make use of…
Before this commit, discuss actions such as thread actions and message actions were defined differently from their own registries. The style of the actions are defined by component that make use of these actions, so lots of code differ in style and use and have to use same pattern to present these actions nicely. Main problems are: - each component using these actions have to define complex code for presentation of the actions - style inconsistency This commit improves by introducing a DiscussActions component, which accepts formatted lists of actions from thread, message, composer registries. This gives the benefit of easing the showing of these actions in UI by just mounting the `DiscussActions` component and provide list of actions to display. Consequently to this improvement, style of discuss sidebar actions and discuss header actions have been changed to more closely look like usual odoo dropdown items and odoo control panel switch buttons. Task-4982792 Before / After (white theme) <img width="1106" height="906" alt="Screenshot 2025-07-30 at 16 24 09" src="https://github.com/user-attachments/assets/d0572f23-feca-4630-a651-9e779b6f1eb8" /> <img width="1107" height="898" alt="Screenshot 2025-07-30 at 16 23 35" src="https://github.com/user-attachments/assets/4326a902-51a2-4d60-86a3-6b010c5971e3" /> Before / After (dark theme) <img width="1107" height="906" alt="Screenshot 2025-07-30 at 16 18 41" src="https://github.com/user-attachments/assets/600fae4e-20c4-4be7-8bbd-4d2890e930bf" /> <img width="1107" height="902" alt="Screenshot 2025-07-30 at 16 01 32" src="https://github.com/user-attachments/assets/5712a98d-6eac-4e2c-bed5-422e26960b1c" />
Mobile users now access message actions through the same dropdown pattern used in Discuss. This makes message handling more consistent and easier to use on smaller screens.
The spreadsheet global filter dialog now shows all available filters immediately, removing the need to click an extra "Add filter" button. This makes filter setup and editing faster and more straightforward for users working with documents spreadsheets.
Original PR description
This commit make it so the global filter dialog always displays all of the filters, instead of having to click on the "Add filter" button. It also changes the `Edit Filter` button, so a tour had to be adapted. Task: [4948791](https://www.odoo.com/odoo/2328/tasks/4948791)
WhatsApp sidebar channels now show unread message counters, making it easier for users to spot conversations that need attention. The counters respect each user's notification preferences, so only relevant unread activity is highlighted.
Original PR description
community PR: https://github.com/odoo/odoo/pull/218977 This commit will add an unread counter badge to sidebar channels. This will follow the channel notification settings set by the user. task-2731882
Resolved issues and error corrections
When a logged-in user is included as a signer, the signing workflow now takes them straight to their signing page instead of showing a confusing send dialog or notification. This reduces duplicate steps and makes it easier for employees or customers to complete documents promptly.
Original PR description
**Version:** - saas-18.3 **Steps to reproduce:** - Open a sign template. - Click "Send". - Add signers (include yourself). - Click "Send" to confirm. - The template is shown in preview mode. - Click "Sign Now". - A new "Send" dialog appears. - You have to add signers again. - Click "Send" again. **Issue:** - When the logged-in user is one of the signers, clicking the "Send" button shows a notification and not allows the user to sign. But clicking "Sign Now" again after that is confusing. **Solution:** - If the current user is a signer, clicking the "Send" button should directly open the sign view for that user to sign. task-4933608 Forward-Port-Of: odoo/enterprise#89943
Point of Sale kitchen printers connected through IoT now receive the full device information needed to print through the backup websocket connection. This prevents kitchen tickets from failing while regular receipts continue working, and helps avoid checkout screen errors when IoT devices were not recently updated.
Original PR description
Due to a missing `iot_id` field when the `DeviceController` for kitchen printers is instantiated, the websocket fallback does not work. This results in kitchen tickets failing to print even when regular receipts are working correctly. The fix is to provide the full IoT device model to the `DeviceController` constructor, as is done elsewhere. To do so we now pass the `device_id` field for the preparation printer model from the backend. We also ensure IoT devices/boxes are loaded even with a 'limited' load. This is because of an issue where an IoT device is added to the PoS config, but because the device itself has not be written to recently, the PoS doesn't load it and you get a traceback in the frontend. Forward-Port-Of: odoo/enterprise#91369 Forward-Port-Of: odoo/enterprise#91260
Sign template editing is now easier because edit buttons take users directly to the matching field. Template preview screens are cleaner by hiding unnecessary edit icons, and the document menu button now displays correctly.
Original PR description
Improved the sign_template_sidebar view by enabling pencil buttons to focus corresponding input fields for editing, and hidden the edit icons in template visualization mode for a cleaner experience. Additionally, fixed the document menu button to ensure proper display. task-4908825 Forward-Port-Of: odoo/enterprise#89884
Fixes the calculation of accident-related days in Swiss payroll reporting so employee payroll data is reported more accurately. This helps reduce payroll reporting errors and supports more reliable compliance processing for Swiss companies.
Original PR description
Forward-Port-Of: odoo/enterprise#91391 Forward-Port-Of: odoo/enterprise#91358
Vendor batch payments now use the correct payable account when matched with bank statements. This prevents accounting entries from being posted to the wrong partner account during reconciliation, improving financial accuracy.
Original PR description
**Steps to reproduce:** - Install accountant - Go to "Accounting / Vendors / Payments" - Create a payment: * Payment Type: Send * Vendor: [any] * Amount: 1000 - Confirm the payment - From payments list, select the payment and create a batch - Validate the batch payment - From Accounting dashboard, go to Bank journal - Create a statement: * Partner: [None] * Amount: -1000 * Memo: [anything] - Reconcile the statement with the batch payment **Issue:** The receivable account of the partner is used for the batch line instead of his payable account. **Solution:** Select the type of the account to use depending on the type of the payment. opw-4952786 Forward-Port-Of: odoo/enterprise#91354 Forward-Port-Of: odoo/enterprise#91206
Studio exports now retain several important customization fields that were previously left out automatically. This helps ensure exported Studio customizations, views, approvals, automations, and attachments can be restored or moved more reliably.
Original PR description
If you create a **StudioExportModel** with a model that we always export (for studio customizations, i.e. ir.ui.view) then the excluded_fields field gets computed. Before this commit, the _compute_excluded_fields method of the StudioExportModel model could have excluded some fields we would like to export. This commit fixes that. **List of fields we should export but by default were excluded:** - "base.automation": "action_server_ids" - "ir.model.fields": "selection" - "studio.approval.rule": ["approver_ids", "can_validate"] - "ir.ui.view": "arch" - "ir.attachment": "datas" task-4866474 Forward-Port-Of: odoo/enterprise#91409 Forward-Port-Of: odoo/enterprise#88125
Self-order kiosks can now print receipts through connected IoT devices as intended. The update adds the missing dependency and adjusts communication so receipt printing works even when kiosk users do not have a standard logged-in session.
Original PR description
The kiosk was updated to use iot http service to print receipt, but the dependancy was missing. This commit fixes the issue. We now override the iot http service to avoid using the orm as there is no session using self order, and use rpc calls instead. Forward-Port-Of: odoo/enterprise#90532
Subscription commission calculations now account for plan transfers during renewals, so salespeople are credited or debited according to the correct recurring plan rates. The update also prevents duplicate achievement lines when currency is missing and improves commission report performance for larger datasets.
Original PR description
PURPOSE In order to take into account the achievement rate based on recurring plan for MRR log on a renewal, we need to take into account transfer logs SPECIFICATIONS Take into account transfer logs…
PURPOSE
In order to take into account the achievement rate based on recurring plan for MRR log on a renewal, we need to take into account transfer logs
SPECIFICATIONS
Take into account transfer logs in achievements computation. Source should be clear that it's a transfer log of a renewal
Example:
If you have a Monthly sub to 100$/month but the yearly of 1000/year (MRR = 83.33) With a commission plan rewarding: 80% MRR of Monthly and 100% MRR of yearly
If you renew a montlhy into a yearly --> MRR that was 100 become 83,33 so you have a negative MRR so a negative commission and a negative on yearly so with more weight (100% instead of 80)
Current:
Renew in into yearly: 100% of MRR change -16.67 = -$16.67
New monthly 80% of MRR change $100 = $80
Total = 63.33 (modifié)
New
New monthly 80% of MRR change $100 = $80
Transfer 1 : 80% of MRR change -100 = -$80
Transfer 2 : 100% of MRR change +100 = +$100
Contraction of MRR: 100% of MRR change -16.67 = -$16.67
Total = 83.33
Moreover this PR:
- fix a bug when achievements were duplicated when no currency was set.
- improve performances by creating a temporary table for invoice rules.
taskid-4783929
Forward-Port-Of: odoo/enterprise#91045
Forward-Port-Of: odoo/enterprise#88646Users who manage timesheets but do not have Project access can now open Timesheet list and kanban views without being blocked by an access error. This keeps timesheet administration usable for teams with restricted project permissions while preserving existing access rules.
Original PR description
Steps to Reproduce: - Ensure the `timesheet_grid_holidays` module is installed. - Log in as a user with Timesheets Administrator access but no access to the Project module. - Navigate to the Timesheets > List or Kanban view. - An `AccessError` occurs due to missing read rights on the `project.task` model. Cause: - In the `timesheet_grid_holidays` module, the `_should_not_display_timer` method accesses `self.task_id.is_timeoff_task` without checking access rights, causing an `AccessError` when users who can view timesheets but lack read access to `project.task` try to access tasks linked to projects with private privacy visibility. Solution: - Use `sudo()` when accessing `self.task_id` in `_should_not_display_timer()` to avoid access errors. task-4798066 Forward-Port-Of: odoo/enterprise#91361 Forward-Port-Of: odoo/enterprise#86302
Payroll payment reports now use the company linked to the payslip batch instead of whichever company is currently selected. This helps multi-company payroll users avoid incorrect company details on payment reports.
Original PR description
Steps to reproduce: - install payroll and create a batch - generate payslips - select multiple companies. - Click on "Create Payment Report." - create any payment method issue: - The report displays the currently selected company instead of the one associated with the payslip batch. reason - the default company is given on the field which is self.env.company fix - now the company field is computed to the payslip company task-4643306 Forward-Port-Of: odoo/enterprise#91233 Forward-Port-Of: odoo/enterprise#81812
Appointments in the evening before an all-day event are no longer incorrectly marked as unavailable because of timezone differences. This helps businesses avoid losing valid booking slots, especially for users in timezones where local evenings cross into the next UTC day.
Original PR description
All-day calendar events were incorrectly causing unavailability for appointment slots scheduled on the previous evening, due to mismatches between local time and UTC. Previously, all-day events…
All-day calendar events were incorrectly causing unavailability for appointment slots scheduled on the previous evening, due to mismatches between local time and UTC. Previously, all-day events scheduled for Tuesday were stored with a start time of 00:00 UTC. In timezones like America/Chicago, this corresponds to 7:00 PM Monday. As a result, a valid appointment booked from 6:30 PM to 8:00 PM local time on Monday would partially fall into Tuesday in UTC (ending at 01:00 UTC), causing a false conflict with Tuesday’s all-day event. The `calendar_verify_availability` method now calls the newly added `_get_date_boundaries` which than computes naive datetime boundaries based on the user's local timezone by taking the end of the previous local day and the start of the next local day. This change resolves those edge cases where evening slots crossing the UTC boundary were falsely marked as unavailable due to timezone misalignment. opw-4614544 Forward-Port-Of: odoo/enterprise#91398 Forward-Port-Of: odoo/enterprise#85654
The Barcode app now refreshes correctly after a quality check wizard is closed, so required quality check buttons reappear when needed. This helps warehouse users avoid missing required checks and makes the quality control flow more reliable.
Original PR description
Description of the issue/feature this PR addresses: The two buttons to open quality check and demand a quality check in the Barcode app are set in an override of MainComponent It would be better to set them in the BarcodeModel class like we do for the validate() button for instance (see enterprise/stock_barcode_quality_control/static/src/components/main.js) Current behavior before PR: - When closing quality check wizard without doing quality checks the quality check button would not appear (see screen recording below) Desired behavior after PR is merged: - When closing the qualityy check wizard force a page refresh to show the Quality check button if they are required task: 4825608 screen recording of QC button refresh issue: https://drive.google.com/file/d/1cVPwgp70Ivrnjufb6x9XdawXI9JYaH0n/view?usp=drive_link I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr)
23 changes
New functionality added to Odoo
This adds a new Cambodia reporting module with key financial statements and a WT003 withholding tax export. Businesses operating in Cambodia can now produce localized balance sheet, profit and loss, and tax reporting outputs more directly in Odoo.
Original PR description
Adds basic reporting module for Cambodia, including: - Balance sheet - Profit & loss - WT003 export task-4383330
Enhancements to existing features
Restaurant point-of-sale users can now access a "Get QR Codes" button directly from the floor plan view. The button opens a prefilled Odoo.com form, making it easier to order engraved QR codes for self-ordering tables.
Original PR description
Add a `Get QR Codes` button on the floor plan view TaskID: 4814164
Belgian payroll now excludes PFI contracts when calculating an employee’s seniority for departure notice periods. This helps ensure notice periods are computed according to Belgian rules and avoids overstating seniority for employees with PFI contract history.
Original PR description
When you generate the notice period for leaving employees, you must compute their seniority. In Belgium, PFI contracts should not be taken into account. This commit filters the contracts to ignore PFI ones. task-4788455
Resolved issues and error corrections
This fix ensures that when staff sell a physical gift card in Point of Sale, the entered card code is assigned to the correct gift card program even when several programs exist. This prevents unwanted automatically generated codes and helps stores activate the exact card handed to the customer.
Original PR description
### Problem: When selling a gift card via PoS, if multiple loyalty programs of type *Gift Card* exist, assigning a physical gift card code does not always link it to the correct program. As a result, the created gift card receives an automatically generated code instead of the one entered. ### How to reproduce: * Create multiple loyalty programs of type *Gift Card*. * Open a PoS session. * Add a gift card product from one of the created programs. * Assign a physical gift card code to it. * Complete the sale. * The created gift card will have a generated code. opw-4910647
This fixes an issue where point-of-sale orders created from sales orders could generate stock transfers with doubled quantities when the same lot-tracked product was split across multiple lots. The change ensures each lot is handled separately, improving inventory accuracy and reducing manual corrections.
Original PR description
When creating a sale order for a product, confirming it, and then modifying the stock move to use 2 different lots. Then paying the order in the POS, the picking created for the pos order will have double qty Steps to reproduce: ------------------- * Create a product tracked by lot * Create 2 lots for that product * Create a sale order for that 3 quantity of that product * Confirm the sale order * Modify the stock move to use 2 different lots, for example: - Lot 1001: 2 units - Lot 1002: 1 unit * Pay the order in the POS * Check the picking created for the pos order > Observation: The picking created for the pos order has double the quantity for the lots. Why the fix: ------------ A PoS line can only hold one lot, so when we import a sale order with multiple lots, we need to split the line into multiple lines, each with a single lot opw-4804704
This fixes a receipt editing issue for products tracked and valued by lot. Instead of causing a system traceback when quantities are changed without properly adding lots, Odoo now updates the existing single lot when possible or shows a clear error when multiple lots are involved.
Original PR description
Steps to reproduce: 1) Create a product tracked by lot and with valuation by lot. 2) Create a Purchase Order with this product and Confirm it. 3) Go to Receipt 4) Add a Lot number and validate 3) Unlock the receipt and modify the `quantity`. Current behavior - Get a traceback. Expected behavior: - If there is only one lot: - update the lot quantity - Else : - raise an error The fix should be applied before the `web_save` call to prevent the creation of a new `stock.move.line`. Therefore it's done on the `onchange` call. opw-4841162 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The event website now shows the registration status banner consistently for each visitor. This prevents customers from seeing incorrect “Registered” labels caused by cached pages from another session.
Original PR description
We had an inconsistent display of the Registered banner for events on the website. The banner would appear or disappear randomly, regardless of whether the user was logged in or not. Steps to reproduce: ------------------- - start the server - log in as a user that does not have access to website editor - get a ticket for an event - go to the event list -> event is marked register - go to the event page in a new browser session (incognito) -> event is still marked register > Observation: On refresh, Registered green banner on events appear and disappear randomly Why the fix: ------------ Keys that are not stored on the table of event should be added to the cache key to force a re-render when they change, or t-nocache should be used opw-4819021 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes sales order locking so orders that should remain editable, such as subscription-related orders and similar flows, are properly excluded. It restores previously intended behavior that was missed during version updates, reducing the risk of orders being locked at the wrong time.
Original PR description
The diff from this commit was introduced in the past up until saas-17.1, to prevent locking of subscription sales orders. https://github.com/odoo/odoo/pull/159863 However, the forward porting commits after saas-17.2 are missing this diff. https://github.com/odoo/odoo/pull/159993/files Few months after the commits were merged, someone mentioned about this diff being missing, but no actions were taken afterwards. This commit applies the missing diff. --- In another [bugfix](https://github.com/odoo/enterprise/pull/91339), which is dependent on this , we decided to not lock SOs from FSM tasks, taking similar approaches as how Subscription Orders process it, utilizing the `_should_be_locked()` function. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an error that could block users from completing a subcontracted product receipt when they chose not to create a backorder for a very small remaining quantity. The system now correctly cancels the leftover manufacturing order instead of reducing it to an invalid zero quantity, making subcontracting receipts smoother and more reliable.
Original PR description
Steps to reproduce the bug: - unarchive the subcontracting route - Create a storable product C1 with the following route: - Buy + Resupply Subcontractor on Order - Create a storable product P1 with:…
Steps to reproduce the bug:
- unarchive the subcontracting route
- Create a storable product C1 with the following route:
- Buy + Resupply Subcontractor on Order
- Create a storable product P1 with:
- BoM type: Subcontracting - Type: subcontracting - Subcontractor: Azure Interior - Component: C1
- Create a purchase order for 20 units of P1
- Confirm the purchase order
- Validate the resupply transfer
- Go to the receipt of P1
- Record 19.8 units of the component (ignore the remaining 0.2)
- Validate the receipt with no backorder
Problem:
A user error is raised:
```
The operation cannot be completed: The quantity to produce must
be positive!
```
When clicking No Backorder, the `process_cancel_backorder` method is
called:
https://github.com/odoo/odoo/blob/18.0/addons/stock/wizard/stock_backorder_confirmation.py#L75-L77
This triggers the validation of the picking, so updates the subcontract
order quantity:
https://github.com/odoo/odoo/blob/16a1d9b19b8b07435a9c4b4db2cad3c1e37e4e17/addons/mrp_subcontracting/models/stock_picking.py#L53
At this stage, we check whether it should reduce the MO quantity or
cancel the order entirely. However, the logic compares the quantity to
remove against the initial order quantity without using `float_compare`,
which leads to minor rounding differences. This results to update the
MO quantity to zero instead of canceling it, which then triggers an SQL
constraint error because the MO quantity cannot be zero:
https://github.com/odoo/odoo/blob/e7e2a088495eed3c2886a69054af689c01628f32/addons/mrp_subcontracting/models/stock_move.py#L304-L311
https://github.com/odoo/odoo/blob/29d1f637d3ec6f3ebb218d103001a6182af1b8a4/addons/mrp/models/mrp_bom.py#L93-L95
opw-4905031
Forward-Port-Of: odoo/odoo#221273
Forward-Port-Of: odoo/odoo#219650Past inventory reports now calculate available stock correctly when products move through multiple delivery steps. This prevents internal warehouse transfers from being counted as customer deliveries more than once, giving businesses more reliable historical stock figures.
Original PR description
Before this commit, the available quantity was incorrect when using the "Inventory At" feature with a past date in the inventory report For products using multi-step delivery routes, the…
Before this commit, the available quantity was incorrect when using the "Inventory At" feature with a past date in the inventory report For products using multi-step delivery routes, the `_compute_quantities_dict()` method incorrectly treated internal moves as outgoing moves As a result, the same outgoing quantity was added multiple times, leading to an overestimation of the available stock This commit adds a filter to the `domain_move_out_done` domain used for past dates, excluding internal moves based on `location_dest_usage`` ## Steps to reproduce: - Create a new product - Active the multi-step routes in Settings - Set the Warehouse's Outgoing Shipments to Pick, Pack, then Deliver - Create a RFQ for 100 products and Receive Products - Create a Quotation for 20 products - Validate each delivery steps - Go to Inventory -> Report -> Stock - Click on Inventory At - Set the date to 2025-01-01 - Search for your product - The `In Hand` quantity should be 0 but is 40 before the fix opw-4848473
Canceling the reward selection after entering a promo code no longer incorrectly marks the code as used. This prevents customers or sales staff from being blocked by a false “already applied” message when they try the same valid code again.
Original PR description
Issue: currently, when a user initiates applying a promo code but then discards it before completing the process. the system still marks the code as used,…
Issue: currently, when a user initiates applying a promo code but then discards it before completing the process. the system still marks the code as used, https://github.com/odoo/odoo/blob/204eb9b0737634826c4666f85d0b9d39aeed0ee6/addons/sale_loyalty/models/sale_order.py#L1378-L1379 resulting in a false-positive validation on subsequent attempts https://github.com/odoo/odoo/blob/204eb9b0737634826c4666f85d0b9d39aeed0ee6/addons/sale_loyalty/models/sale_order.py#L1352-L1355 to reapply the same code. Steps to reproduce: - Create a record in "Discount & Loyalty" - select "Discount Code" in program type field. - From the conditional rules, copy the discount code. - Create a sale order and select a product. - Click on Coupon Code button and paste the code copied in step 3 in Coupon Code field. - Click Apply. - A wizard of Available Rewards will be opened. Now click the Discard button. - Repeat last 3 steps Observation: - It gives a Validation Error: "This promo code is already applied." Fix: - we introduce action_discard() method, which will un-use the coupon , in case user discard the reward dialog box. opw-4961738 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change restores handling for deliveries that include both regular and subcontracted products, preventing backorder issues. It prioritizes keeping barcode workflows usable, while allowing warehouse users to manually adjust picked status in the backend if needed.
Original PR description
This commit reverts db8b33e (and the wrong follow-up fix of 2755c09) because it breaks backorders for pickings that mix regular and subcontrcted products. We'd rather the flow has problems in back end where the user can manually uncheck the picked box rather than in barcode where there is no work around. We keep the enterprise test introduced in [792c968](https://github.com/odoo/enterprise/commit/792c968) to protect the barcode flow. Forward-Port-Of: odoo/odoo#220318
Spreadsheet charts now keep global filters applied when their chart criteria are updated. This prevents charts from showing unfiltered or inconsistent data, helping users trust spreadsheet reports after edits.
Original PR description
The global filters were not re-applied when updating an oodo chart domain. Task: [4965683](https://www.odoo.com/odoo/2328/tasks/4965683) 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#220764
This fix restores the previous handling of manually entered tax amounts after a recent change caused incorrect results for taxes included in prices. It helps ensure invoices and accounting calculations remain accurate while a more complete solution is prepared.
Original PR description
This reverts the changes to the handling of manual tax amounts made in commit 4911adb817c07c4f789d96c0044a9f01f266ac50. That commit moved the handling of manual tax amounts from `_add_tax_details_in_base_line` to `_round_base_lines_tax_details`, but didn't consider the case of price-included taxes where the manual tax amounts must modify the base of the tax. As a result, we are reverting it while we figure out an implementation that correctly handles price-included taxes. We keep the new `_dispatch_delta_amount_smoothly` method that is used wherever we need to dispatch delta amounts over several lines. task-none
Romanian electronic invoices can now be sent to the SPV even when no e-invoice format is configured on the customer record. Odoo falls back to the standard Romanian XML format, preventing a blocking error and reducing manual retry work.
Original PR description
Currently, if we try to send an invoice without defining an EDI format on the invoice's partner and attempt to send it to the SPV, we get the error: "CIUS-RO XML attachment not found." Steps to reproduce: - Install l10n_ro_edi - Create an invoice - Do not set the eInvoice format on the partner - Send it to the SPV - You will get the error: "CIUS-RO XML attachment not found." This fix, using "account.edi.xml.ubl_ro" as a fallback, makes sense because currently, when invoices are sent in batch mode, Odoo commits the issue stating that the CIUS-RO XML is missing. As a result, when we retry sending the invoice, "account.edi.xml.ubl_ro" will also be generated because the l10n_ro_edi_document_ids will not be empty. opw-4623492
Fixed an issue where adding products to a Field Service task could lock the related sales order too early when automatic sales locking was enabled. This ensures the delivery order is created properly, so users can manage the task’s products and deliveries without getting stuck on an inconsistent locked order.
Original PR description
Issue: When the "Lock Confirmed Sales" setting is enabled, adding a product to a Field Service task would lock the associated sales order before its picking could be created. The confirmation process…
Issue: When the "Lock Confirmed Sales" setting is enabled, adding a product to a Field Service task would lock the associated sales order before its picking could be created. The confirmation process locks the order first , and the subsequent step to create stock moves (`_action_launch_stock_rule`) explicitly skips locked orders. Reproducible on 17.0~master [Task](https://www.odoo.com/odoo/action-4043/4633977) Odoo 17: https://drive.google.com/file/d/1qmAYhSu6gU91efuJEDF-Irn2cLGUQP0A/view?usp=drivesdk Odoo 18: https://drive.google.com/file/d/1x8IeXwT7ZFM7Av9Vp6GSvGIbOaEGfmVx/view?usp=drivesdk Steps to reproduce: 1. In Sales > Configuration > Settings, enable "Lock Confirmed Sales". 2. Go to a Field Service task. 3. In the kanban view via the "Products" smart button, add a product. 4. Come back to the task, refresh the browser, open the linked Sales Order from the smart button. 5. **Before this fix:** The SO is locked, no picking is created, and SO lines will have delivered_qty set even though we haven't delivered anything. 6. **After this fix:** The SO is not locked, and a Delivery smart button is correctly displayed, linking to the generated picking. This behavior left the sales order in an inconsistent state: it was locked, but had no corresponding delivery order. As a result, users were blocked from removing or modifying the products added to the task, as the system prevented edits on a locked order with no picking to cancel. Let's step through what's going on here; 0. We enable "Lock Confirmed Sales" option. 1. Add a product to the Field Service(FS) task https://github.com/odoo/enterprise/blob/4256ea170c31209b83ff808e51145757571f8556/industry_fsm_sale/controllers/catalog.py#L19-L42 https://github.com/odoo/enterprise/blob/4256ea170c31209b83ff808e51145757571f8556/industry_fsm_sale/controllers/catalog.py#L38 2. set_fsm_quantity() is invoked, which will create a SO for the FS task https://github.com/odoo/enterprise/blob/35e1f47160d5840e8701fc0ad43ec42bbfaf9e36/industry_fsm_sale/models/product_product.py#L144 3. `_fsm_create_sale_order()` will immediately `action_confirm()` the new SO, because of the reasons in the function description. ( Since we are immediately confirming newly created SO, I think we should consider not applying the "Lock Confirmed Orders" option to FSM SOs.) https://github.com/odoo/enterprise/blob/2347dac2568dbcf83578f044f8fe41ab70a20f47/industry_fsm_stock/models/project_task.py#L124-L134 https://github.com/odoo/enterprise/blob/2347dac2568dbcf83578f044f8fe41ab70a20f47/industry_fsm_stock/models/project_task.py#L134 4. `odoo/addons/sale/models/sale_order.py/action_confirm()` will lock SO because we enabled 'Lock Confirmed Sales' https://github.com/odoo/odoo/blob/863c064fd911cb4eeedad0abec82adb4690128f6/addons/sale/models/sale_order.py#L964 6. `_action_launch_stock_rule()` is invoked, is in charge of creating Pickings for SOs https://github.com/odoo/odoo/blob/3be83d363786526fe470e41122169e594b5467fb/addons/sale_stock/models/sale_order_line.py#L303 https://github.com/odoo/odoo/blob/3be83d363786526fe470e41122169e594b5467fb/addons/sale_stock/models/sale_order_line.py#L343-L344 7. But, since `line.order_id.locked` , the system do not create Pickings for the SOs. https://github.com/odoo/odoo/blob/3be83d363786526fe470e41122169e594b5467fb/addons/sale_stock/models/sale_order_line.py#L315-L316 The line was introduced by https://github.com/odoo/odoo/commit/17bece3e797913bcba8dd7e07fc8541c0a45e3f7 This commit resolves the issue by passing a context key `fsm_create_sale_order=True` when confirming a sales order that is being created from a Field Service task. The `_should_be_locked` method on the sale order is overridden to check for this context key. If the key is present, it prevents the order from being locked within that specific transaction, allowing the stock rules to execute correctly and create the necessary picking. The order will be locked for any subsequent operations as intended. Tradeoff here; We are sacrificing the universal application of one feature (automatic lock on confirmed sales order) to fix a critical bug that makes the entire FSM delivery process unusable. --- EDIT: Without this change, all of [test_fsm_stock](https://github.com/odoo/enterprise/blob/17.0/industry_fsm_stock/tests/test_fsm_stock.py)'s test cases that use `_fsm_ensure_sale_order()` will fail if the setting is on. (around ~20 test cases). [In the past, similar issue occurred for Subscription Orders, and the PO confirmed that the "Lock Confirmed Order" setting should never affect the subscriptions. ](https://github.com/odoo/enterprise/commit/e4f9d76c0a58f3cc226a2372f3936cea4547312e). This commit takes the same approach to ignore the setting upon SO confirmation. opw-4633977 opw-4749653 opw-4880664 Forward-Port-Of: odoo/enterprise#88855
Chilean vendor bill imports now work for accounting users who do not have administrator rights. This prevents imported bills from failing with empty fields, helping finance teams process supplier documents without needing elevated access.
Original PR description
### Issue: Vendor bills are not importing when the user has no administration rights. ### Steps to reproduce: - Install `l10n_cl_edi` and switch to a Chilean company - Create a new user without Administration access rights but with Accounting rights - Switch to this user - Go in Accounting > Vendor Bills - Import a Chilean vendor bill - On the created bill, we can see an error in the chatter, no fields have been filled ### Cause: This [commit](https://github.com/odoo/enterprise/commit/b26a7905cbcbfdb59d55a7ecf9e963e267b8f0a5) aadded a line writing on `l10n_cl_dte_file` but the field is only accessible to [`base.group_system`](https://github.com/odoo/enterprise/blob/bcd42d624587a968ec0b7023855ba4083894baf7/l10n_cl_edi/models/account_move.py#L1071). ### Solution: Use `sudo()` like everywhere in the file. opw-4943499
WinBooks imports now handle certain accounting data inconsistencies that previously blocked the import, including tax payable accounts, unknown journals, and deprecated accounts used in tax settings. This helps businesses complete legacy accounting imports more reliably without manual cleanup or unexpected validation errors.
Original PR description
When importing a winbooks file the following issues and or inconsistencies may be found **Issue 1** We may import an account with CENTRALID 'V03' and code 45100000 Having this centralID means that it…
When importing a winbooks file the following issues and or inconsistencies may be found **Issue 1** We may import an account with CENTRALID 'V03' and code 45100000 Having this centralID means that it will be set as tax payable account id according to https://github.com/odoo/enterprise/blame/d8d4812414dba8825a1c785c29d00f7d0fd98360/account_winbooks_import/wizard/import_wizard.py#L174 However, this means it needs to be a `liability_payable` account with reconcile enable, in order to comply with the following check https://github.com/odoo/odoo/blame/ad6c9001b447f5ffebafe1581512f48708c7d746/addons/account/models/account_tax.py#L80 *Note* Even if we set it as liability_payable, the import may fail later on in case the same account is used in a sales move where those types of account are not allowed https://github.com/odoo/odoo/blame/1b657cf1e1ce43874a3ede307b2f8ad68216aa56/addons/account/models/account_move_line.py#L1247 A solution is to skip the `_check_payable_receivable` check for winbooks lines **Issue 2** Move line data may reference an unkown journal, causing a validation error because no journal is retrieved from the database and a move always need a journal **Issue 3** Account created during import may be marked for deprecation, which occurs at the end of the import process. However, if the account has been used in a tax repartition line, trying to set it as deprecated will raise an error. https://github.com/odoo/odoo/blame/2cdc41c012f637849ba030989ce928b6b1152e7e/addons/account/models/account_account.py#L1028 opw-4850314
Sales achievements made on the final day of a commission period are now included in the correct period totals. This ensures commission reports and detail views reflect the full eligible sales activity for monthly targets.
Original PR description
**Issue** Achievements realised on the last day of the period were not taken into account (neither in the expected one, or the next period). **Steps to reproduce** - Create a commission plan with a monthly target frequency and an achievement on "Amount sold" - Have a Sale order with a `date_order` on the last day of a month - Click on the "Commissions" smart button to open the `sale.commission.report` list view -> achieved amount for the SO's month is missing. - Click on "Details" for the line -> there should be one `sale.commission.achievement.report` record. **Cause** We were comparing a Timestamp coming from the commission line with the start/end date of the period. To perform the comparison, the date was cast to a Timestamp with 0:00:00 as the hour, resulting in all commission lines on the last day of the period to be missed. opw-4857936 opw-4934168
This fix prevents in-progress POS cart items from disappearing after a page refresh when UrbanPiper is enabled. It also ensures product variants are synced to UrbanPiper with the correct vegetarian or non-vegetarian food type, improving menu accuracy for online orders.
Original PR description
Steps to reproduce: - Installed urbanpiper - Open POS and add product to cart - Refresh the page . Issue: - Product in the cart automatically removes. Cause: - Order lines were filtered out when urban piper is enabled. Fix: - Filter out the order lines which are not associated with online order. Issue 2: - While menu sync to Urban piper, 'product variant' food_type is sent as NA although main product food_type is set as Vegetarian or Non-Vegetarian. Fix: - Set variant food_type as main product food_type. task- 4971503
This fixes an issue where products could fail to register with Kenya eTIMS because the required quantity unit could not be set when creating a new unit of measure from the category screen. The unit field is now available in the right place and shown only when relevant for Kenyan fiscal settings, helping users complete eTIMS submissions successfully.
Original PR description
When trying to register a product with eTIMS, submisission happens to fail because `l10n_ke_quantity_unit_id` can not be set on new UoM via the UoM Category view. With this commit, we extend the UoM Category view and add the field in the notebook. We also make the column invisble regarding the fiscal country code from the UoM Category, which is get from a new, non stored, computed field. We also add the validation message from UoM model in addition to the one from Product. Note: Change was already done in 18.0 by 8e30b68b80b1db5b309c192ed7adf8be26b807d5 opw-4395902 Forward-Port-Of: odoo/enterprise#91442
Fixes a barcode app issue where scanning from the main menu could fail on iOS 18.5 if the scan confirmation sound was unsupported or blocked by the browser. The app now chooses a safer audio format and handles sound playback errors without interrupting barcode scanning.
Original PR description
Issue ----- On iOS 18.5, users can get a `NotSupportedError` when trying to scan a barcode from the (barcode) main menu. Steps to reproduce ----- - Open barcode - Click the center scan button - Scan…
Issue ----- On iOS 18.5, users can get a `NotSupportedError` when trying to scan a barcode from the (barcode) main menu. Steps to reproduce ----- - Open barcode - Click the center scan button - Scan a barcode --> Traceback Discussion ----- There are 2 issues occuring here. 1. We play either an ogg or mp3 file. However, the method to know if the format is supported by the browser returns one of 'probably', 'maybe', ''. https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canPlayType#return_value This means that when we do https://github.com/odoo/enterprise/blob/70e5013ea022ed04ff27db71ea3ecccb55ae1f70/stock_barcode/static/src/main_menu/main_menu.js#L37 We might end up using ogg even if the browser doesn't actually support it, as 'maybe' is truthy. To reduce the risk of this happening, we can specify the codec as "vorbis" (all ogg files of Odoo are vorbis). This is already done in mail: https://github.com/odoo/odoo/blob/cd4c1d599ea9403ce3791e239ad765d946446a47/addons/mail/static/src/core/common/sound_effects_service.js#L46 2. The browser might not have the permission to play the sound. In such cases, the best we can do is try to play the sound and log potential errors. ----- Ticket: opw-4820022
Expiration dates shown in the Barcode app now respect the user's local timezone when receiving tracked products. This prevents dates entered at midnight from appearing as the previous day, improving accuracy for inventory and compliance workflows.
Original PR description
**Issue**: The expiration date displayed in the barcode app's scan screen may appear incorrect. **Steps to reproduce**: - Go to Settings > Inventory, and enable the `Expiration Date` field - Open the…
**Issue**: The expiration date displayed in the barcode app's scan screen may appear incorrect. **Steps to reproduce**: - Go to Settings > Inventory, and enable the `Expiration Date` field - Open the Purchase app - Create a new Request For Quotation - Select a product that: - is a good tracked by lot - has the `Expiration Date` field enabled (Inventory tab > Traceability) - Confirm the RFQ - Click the `Receipt` smart button - Click the `hamburger button` and enter an expiration date at midnight. - Go to the Barcode application > Operation > Receipts - Open the corresponding RFQ - Click Edit and increase the quantity to 1, then Validate - Observe that the date is displayed as one day earlier **Cause**: The code https://github.com/odoo/enterprise/blob/b5ad18b101f4a2608758762edf0f49270a67ba20/stock_barcode_product_expiry/static/src/components/line.js#L17 assumes that the date is encoded using the local while the date comes from the server https://github.com/odoo/enterprise/blob/b5ad18b101f4a2608758762edf0f49270a67ba20/stock_barcode_product_expiry/static/src/components/line.js#L13, and thus is utc encoded. So for example, if the user's timezone is `Europe/Brussels`, a midnight timestamp will appear as 10 PM the previous day. **Solution**: To solve this issue, use this method https://github.com/odoo/odoo/blob/7a40285fd03f75f07a74f05d4b60e760e1c83eb3/addons/web/static/src/core/l10n/dates.js#L619-L622 instead of https://github.com/odoo/odoo/blob/7a40285fd03f75f07a74f05d4b60e760e1c83eb3/addons/web/static/src/core/l10n/dates.js#L514-L516. This way, it would parse the utc-base server date as a utc-base date. opw-4865513 Forward-Port-Of: odoo/enterprise#88526