Daily updates from Odoo
Monday, June 1, 2026
327 changes
28 changes
Resolved issues and error corrections
This update resolves an issue where adjusting wages for employees below the minimum wage would unexpectedly terminate and restart their contracts. Now, when 'Adjust Wages' is clicked, a new, effective version is created within the existing contract, maintaining the original contract dates and minimum wage information. This ensures accurate payroll processing and avoids unnecessary contract changes.
Original PR description
Before this commit, clicking 'Adjust Wages' on the 'Employees Under Minimum Wage' warning terminated the active contract (setting contract_date_end to yesterday on the previous version) and started a brand new contract today. After this commit, the action creates a new effective-dated version within the active contract: it inherits the same contract_date_start and contract_date_end, and the minimum wage is written on it. task-6217548
This update removes a reset button from the HR payroll views. This change reverts a previous update that introduced an issue. The removal ensures consistent and reliable payroll processing functionality.
Original PR description
This reverts commit e35572b. task-6075229
This update corrects an error in the Peru - Accounting Reports module that was causing SUNAT to reject electronic reports. Specifically, the report was incorrectly including too much data in field 8 of the DAM document, leading to rejection. The fix ensures the correct 3-digit customs dependency code is used, aligning with SUNAT regulations.
Original PR description
**Steps to reproduce:** * Install Peru - Accounting Reports (l10n_pe_reports). * Create a vendor bill with Document Type 50 (Declaración Aduanera de Mercancías - DAM) and a document number in the…
**Steps to reproduce:** * Install Peru - Accounting Reports (l10n_pe_reports). * Create a vendor bill with Document Type 50 (Declaración Aduanera de Mercancías - DAM) and a document number in the standard pediment format (e.g. C235202610-38047). * Go to Accounting > Reporting > Purchase Electronic Record (RCE 8.4). * Export the TXT file and open it. **Observed behavior:** * Field 8 contains the full first numeric block of the document name including the year and sequence digits (e.g. 235202610) instead of only the 3-digit customs dependency code. * SUNAT/SIRE rejects the file immediately because 235202610 does not exist in Table 4 (RS 040-2022), which only defines 3-digit codes. **Cause:** * `_get_serie_folio()` splits the document name by taking everything before the last digit group as the serie. For a name like C235202610-38047 this produces serie = "C235202610", and the existing `serie[1:]` logic strips only the leading letter, leaving "235202610" in field 8 instead of the 3-digit customs dependency code "235". * The same incorrect value was also written to field 28 (aduana_code). * ref : https://www.sunat.gob.pe/legislacion/superin/2022/anexo-040-2022.pdf **Fix:** * For document types 50 and 52, extract the first numeric group from the document name using `re.search(r'\d+', move_name)` and slice the first 3 characters to obtain the customs dependency code as defined in SUNAT Table 4 (always a 3-digit value). * Apply the same logic to field 28 (aduana_code) for consistency. opw-6157662 Forward-Port-Of: odoo/enterprise#115406
This update corrects a technical issue where archived delivery carriers were being unintentionally included in the carrier selection process. Previously, the system would pass archived carrier records through the context, allowing users to select them. This change ensures that only active carriers are used, improving data accuracy and preventing potential errors in delivery scheduling.
Original PR description
Issue: property_delivery_carrier_id on res.partner can hold an archived delivery.carrier record. Meaning that we pass an archived record to the context and that we can select the archievd delivery.carrier in the choose.delivery.carrier wizard. Solution: Only pass active records through the context. opw-6125792 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264945 Forward-Port-Of: odoo/odoo#263819
This update resolves a problem where UPS delivery confirmations were failing for shipments to locations outside of the USA, Canada, and Vietnam. The fix ensures that province codes are limited to 5 characters, aligning with UPS API requirements and preventing errors during shipment validation.
Original PR description
Issue ----- Users cannot confirm shipments depending on the destination's province. Steps to reproduce ----- - Set up UPS - Create a contact in Philipines - Province: Cebu - Create a delivery - Validate the delivery > Error message Cause ----- Codes can only be 5 characters long, as per the API https://developer.ups.com/tag/Shipping?loc=en_US#operation/Shipment According to the doc, the field is only useful for USA, Canada and Vietnam. ----- Ticket: opw-6149404 Forward-Port-Of: odoo/enterprise#117203
This update addresses a potential issue where the system struggled to reliably retrieve IAP VIES identifiers, impacting accurate VAT calculations. The fix includes improved testing and synchronization to ensure data consistency and prevent errors, particularly related to webhook token validity.
Original PR description
- Avoid race condition while getting the IAP VIES identifiers - Clarify to which state the Intra-Community value has been updated - Increment validity of the webhook_token while waiting for a push update - Add more tests, especially for the controller and the cron - Remove no-longer-relevant tests task-none Forward-Port-Of: odoo/odoo#266925 Forward-Port-Of: odoo/odoo#260440
This update clarifies the meaning of the 'Basic' access right within the Documents app. Previously, 'No' was used, which created confusion about user access. The term has been changed to 'Basic' to accurately reflect that users retain access to their documents and shared content.
Original PR description
In the Documents app, the lowest tier access right was called "No", which implies the user has no access. However, this is not the case. The user still has access to the app, their own documents, and shared documents. To resolve this confusion, "No" is changed to "Basic" and the relevant descriptions are updated. task-6099135 Forward-Port-Of: odoo/enterprise#113660
This update ensures that changes to pricelist item dates within a Point of Sale (POS) session are correctly reflected when the POS is reloaded. Previously, reloading the POS wouldn't update the items. This fix improves the accuracy of pricing displayed to customers during transactions.
Original PR description
Before this commit, if the date validity of a pricelist item was changed after opening a POS session, reloading the POS won't update the items. opw-6223217 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265211
This update ensures our KSeF vendor bill download cron job continues to run smoothly even if some XML files are corrupted. Previously, a single error would halt the entire process. Now, errors are logged, and the cron job successfully processes the remaining valid invoices, preventing data loss and improving efficiency.
Original PR description
### Description of the issue/feature this PR addresses: **Issue:** When downloading vendor bills from KSeF via the cron, the system attempts to parse the XML files sequentially. If a single XML file…
### Description of the issue/feature this PR addresses: **Issue:** When downloading vendor bills from KSeF via the cron, the system attempts to parse the XML files sequentially. If a single XML file is missing something that is expected, the parser raises a UserError. This unhandled exception halts the entire cron job and rolls back the database transaction, clogging up the rest of the queue. **Solution:** This PR wraps the l10n_pl_edi_get_ksef_bill_vals_from_xml parsing step inside a try/except block within the batch download loop. If a UserError is encountered for a specific invoice, the error is logged as a warning, and the cron proceeds. ### Current behavior before PR: A single malformed XML file causes the cron to fail completely. Valid invoices in the same batch are not created due to the halted queue. ### Desired behavior after PR is merged: The cron successfully processes the batch of downloaded XMLs even if one or more files are invalid. Errors on specific invoices are logged for the user to investigate, while the rest of the valid vendor bills in the batch are succesfully created. opw-6179479 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266180
This update corrects a minor inaccuracy in how the 'remaining days' field displays dates close to the current date. Previously, deadlines near today were sometimes shown as 'Next month,' which wasn't ideal. This change ensures more precise and accurate date calculations for deadlines and time estimates.
Original PR description
Luxon is not very accurate when the field is close to today: If today is Apr 30, so a deadline set to May 1 will be displayed as "Next month". In practice, it is not wrong, but it is not very accurate. task-6175442 Forward-Port-Of: odoo/odoo#267102
This update resolves a technical issue preventing the `test_edi_import` test from running correctly on Python 3.14. The fix ensures the test data is properly formatted for base64 encoding, preventing a 'binascii.Error' and ensuring the Italian EDI processing functionality continues to operate as expected.
Original PR description
This commit fixes an error when running the `test_edi_import` test on Python 3.14, which is stricter about base64 validation. Ultimately, the root issue was that raw test content was being passed to the `datas` field of an attachment when a base64 representation was actually expected (which is obviously invalid base64). Passing it via the `raw` field instead correctly handles the raw binary data. runbot-939133 Forward-Port-Of: odoo/odoo#267185 Forward-Port-Of: odoo/odoo#266731
This update fixes an issue where discounts applied to purchase orders weren't correctly reflected in the final amount displayed. The fix ensures that the total tax-exclusive amount, including the discount, is accurately shown after a purchase order is confirmed and an accrued expense entry is created. This improves the accuracy of purchase order reporting.
Original PR description
Steps to reproduce: [purchase] - Create a purchase order - add a line with a discount - confirm and receive - create an accrued expense entry Issue: The full tax excl amount is displayed but no discount is applied opw-5049848 Forward-Port-Of: odoo/odoo#240887 Forward-Port-Of: odoo/odoo#225375
This update fixes an issue where overtime hours were incorrectly calculated and displayed. Previously, overtime was rounded down to zero days, leading to inaccurate pay calculations and a misleading user interface. The change now accurately calculates overtime in hours, ensuring correct pay and a clear display of overtime hours.
Original PR description
Because OVERTIME was configured with request_unit='day' (defaulting as no value was specified), OT hours were converted to days and then rounded down, so fractional overtime appeared as 0.00 days on the payslip and the UI became misleading. This change set it to 'hour'. task-6197878 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a previous error in how overtime tracking is managed within the payroll system. The system now uses a simple checkbox instead of a dropdown menu for tracking method, streamlining the process for employees and administrators. This change improves accuracy and ease of use.
Original PR description
The tour previously matched the tracking method field with his previous implementation, where it was a dropdown selection, while now is a checkbox. task-6197878
This update corrects a display issue where certain product categories were incorrectly shown on Website 1, leading to a 'Not Found' error. The fix ensures that categories are only displayed on the website to which they have been assigned, improving the user experience and preventing broken links. This resolves a technical problem related to website access control.
Original PR description
Steps to produce: --- - Install `website_sale` with demo data. - Go to `website > ecommerce > products > ecommerce categories`. - Open `Desks/Components` category > Set website to `My website 2`. -…
Steps to produce: --- - Install `website_sale` with demo data. - Go to `website > ecommerce > products > ecommerce categories`. - Open `Desks/Components` category > Set website to `My website 2`. - Open the shop page on website > Click on Desks category. Issue: --- - The Components subcategory is still displayed on Website 1. - Clicking on it leads to a Not Found page since the category is not assigned to that website. Root cause: --- - At [1], In the category filmstrip template, subcategories are fetched without filtering based on website access. - As a result, categories restricted to another website are still shown. Solution: --- - Filter categories using the `can_access_from_current_website` method to ensure only categories accessible from the current website are displayed. [1]https://github.com/odoo/odoo/blob/900fc043064216c5943ea07392d8120be7b50b63/addons/website_sale/views/templates.xml#L758-L769 opw-6159549 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266637 Forward-Port-Of: odoo/odoo#262410
This update resolves an issue where Odoo failed to import simplified Italian electronic invoices (TD08) when a line item represented only tax. The fix prevents a division-by-zero error, ensuring that valid tax-only invoices submitted by the Italian tax authority (Agenzia delle Entrate) can now be correctly imported into Odoo. This improves the reliability of invoice processing for Italian businesses.
Original PR description
### Issue before this commit: Importing a simplified Italian electronic invoice or credit note (e.g., TD08) fails with a float division by 0 traceback if a document line consists entirely of taxes…
### Issue before this commit: Importing a simplified Italian electronic invoice or credit note (e.g., TD08) fails with a float division by 0 traceback if a document line consists entirely of taxes (where the total line amount equals the tax amount). ### Steps to reproduce the issue: 1. Download Accounting and l10n_it 2. Switch to IT company 3. Go to Vendors > Refunds 4. Try to import the xml from the ticket ### Cause of the issue: The XML parser attempts to dynamically calculate the tax percentage using the formula tax_amount / (amount - tax_amount). When a line is purely a tax adjustment, the taxable base (amount - tax_amount) evaluates to exactly zero, triggering the critical division by zero crash. https://github.com/odoo/odoo/blob/e3b0ca11d99b2ef819cdad68b169112cd73668b6/addons/l10n_it_edi/models/account_move.py#L1863-L1867 ### Reason to introduce the fix: To ensure Odoo successfully imports valid, tax-only EDI documents already accepted by the Agenzia delle Entrate. Ticket [link](https://www.odoo.com/odoo/project.task/6217373) opw-6217373 Forward-Port-Of: odoo/odoo#267081 Forward-Port-Of: odoo/odoo#266374
This update fixes an issue where the Timesheet Assistant incorrectly suggested declined calendar events. The change now includes events where the user is an attendee, regardless of their RSVP status, providing more relevant suggestions. This ensures the Timesheet Assistant offers a more complete and accurate view of available calendar events.
Original PR description
### Before this commit: The Timesheet Assistant would incorrectly suggest calendar events that the user had explicitly declined. Furthermore, the domain only retrieved events where the user was the organizer (`user_id`), completely missing events where the user was only an attendee. ### After this commit: The `get_calendar_events` getter in `_get_assistant_events_getters` is updated to: 1. Include events where the current user is an attendee by adding a condition on `partner_ids`. 2. Explicitly exclude events where the user's `calendar.attendee` status is 'declined'. Task-6222659 Forward-Port-Of: odoo/enterprise#117613
This update resolves an issue where orders placed via mobile self-order with 'Pay After Meal' and online payment were not being sent to the kitchen for preparation. The fix ensures that all orders, regardless of payment type, are now correctly transmitted to the preparation display, improving order flow and kitchen efficiency.
Original PR description
pos* = pos_self_order_preparation_display, pos_online_payment_self_order_preparation_display Configuration: -------------- - Restaurant Mode - Self-Order Mode: "QR + Ordering" - Service At: Table - Pay after meal (Online Payment) Issue: ------ Orders created via mobile self-order using "Pay After Meal" + online payment were not appearing in the Preparation Display. Steps to Reproduce: ------------------- 1. Create an order from mobile self-order. 2. Open the restaurant POS, the order is visible there, but it does not appear on the preparation display. Cause: --------------- - The system only sent paid orders to the kitchen when online payment is set, skipping pay-after-meal case. Fix: ------------ - Updated logic to send all orders to the kitchen when “Pay After Meal” is selected, Task: 5929555 Forward-Port-Of: odoo/enterprise#107129
This update strengthens the security of our Point of Sale system by ensuring that the correct access token is being used when displaying customer information. Previously, the system didn't always validate this token, creating a potential vulnerability. This change adds a check to confirm the correct token is present, enhancing overall security.
Original PR description
In this commit we adapt the `PosCustomerDisplay` controller such that it checks that the correct `pos.access_token` was sent. Task: 6144690 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263428 Forward-Port-Of: odoo/odoo#261545
This update resolves an issue where field service orders were incorrectly displaying a delivered quantity of '1' before purchase order confirmation. The fix ensures the delivered quantity accurately reflects stock pickings, improving order accuracy and fulfillment. This change corrects a miscalculation related to how the system handles manual service types.
Original PR description
### Steps to reproduce: - In the settings enable dropshipping - Create a storable product P, enable the dropshipping and set a vendor - Create and confirm a sale order for a field service - Open the…
### Steps to reproduce: - In the settings enable dropshipping - Create a storable product P, enable the dropshipping and set a vendor - Create and confirm a sale order for a field service - Open the related task > Products > Add 1 unit of P - Go back to the sale order > an RFQ has been created #### > The delivered quantity of P is set to 1 ### Cause of the issue: Since 2361368acfe7fecbffde2ca26392eb89aecdc9e1 the `_inverse_fsm_quantity` method manually adapts the delivered quantity based on the fact that the `product.service_type` is `manual` rather than the `qty_delivered_method` of the line or future line is. In particular, because these lines: https://github.com/odoo/enterprise/blob/8f4fe902cb71c49bdb3caf9915f9a5abfe6f237f/industry_fsm_sale/models/product_product.py#L82-L83 provide a value of the `qty_delivered` to the created purchase order line and since the `qty_delivered_method` is a precomputed field: https://github.com/odoo/odoo/blob/fdfd9851393ff82a265997478886bcad6da357d0/addons/sale/models/sale_order_line.py#L225-L237 The fact that the purchase order line will be created with a `stock_move` `qty_delivered_method` and that the generated PO does not generate any move prior to confirmation will not trigger the dependency of the `qty_delivered` to retrigger a computation of the `delivered_qty` of the product which is suppose to be based on stock pickings: https://github.com/odoo/odoo/blob/fdfd9851393ff82a265997478886bcad6da357d0/addons/sale/models/sale_order_line.py#L871-L876 https://github.com/odoo/odoo/blob/fdfd9851393ff82a265997478886bcad6da357d0/addons/sale_stock/models/sale_order_line.py#L193-L198 Leaving the created sol with a delivered quantity of 1 prior to confirmation of the PO (which will generate move_ids related to the sol and trigger the compute). Fix: The changes of 2361368acfe7fecbffde2ca26392eb89aecdc9e1 regarding the `_inverse_fsm_quantity` appears unjustified with respect to the purpose of the fix. In addition, the `qty_delivered` and changes are already expected to be properly computed when the `qty_delivered_method` is not manual, particularly since the '`manual'` `service_type` is actually the default `service_type` corresponding to any 'consu' product and looks unrelated by any mean to the `delivered_qty` computation: https://github.com/odoo/odoo/blob/fdfd9851393ff82a265997478886bcad6da357d0/addons/sale/models/product_template.py#L165-L167 opw-6104326 Forward-Port-Of: odoo/enterprise#118131 Forward-Port-Of: odoo/enterprise#115760
A recent update incorrectly added state attributes to all select elements on the website. This was caused by a small error in the code and resulted in unnecessary data being stored in the website's design and database. This fix ensures that only the intended select elements receive these attributes.
Original PR description
Commit [1] introduced an option to link state and country, which uses the data-link-state-to-country attribute. However, because parentheses were missed, it added the mentioned attribute to all select elements, which polluted the dom and the database. [1]: https://github.com/odoo/odoo/commit/7a43c49441b5a50168c3919fb8e8b658686363b5 Forward-Port-Of: odoo/odoo#266986
This update fixes issues with drag-and-drop functionality in the Gantt chart for planning managers, ensuring correct user permissions. It also automatically sends email notifications to customers when interventions are scheduled and completed, and provides clearer communication about intervention reports.
Original PR description
## [FIX] web_gantt,planning: apply hasGroup before compute params Before this commit, some actions like drag and drop gantt pills are blocked for planning manager instead of being allowed only for…
## [FIX] web_gantt,planning: apply hasGroup before compute params Before this commit, some actions like drag and drop gantt pills are blocked for planning manager instead of being allowed only for them. The reason is because the compute params is something made before checking if the user is a planning manager and so the system will consider the user is not a planning manager. The compute params is something made before because the methods are executed inside 2 distincts onWillStart hook and so OWL framework cannot know one hook depends on the other one. This commit creates a method `onWillStart` in the main gantt controller to be able to override it and be able to wait a rpc before processing the compute params. ## [FIX] planning_field_service_sale_timesheet: don't count unscheduled intervention This commit filters the interventions counted to display the field service stat button in the form view of Sale Order. Now the intervention unscheduled will no longer be counted and also the one linked to plannable SOL. ## [FIX] planning_field_service: send email to customer when intervention published Before this commit, the template "Field Service Scheduled" was unsused. This commit uses that template to send an email to the customer once the intervention is scheduled. ## [FIX] planning_field_service: send report when intervention completed and signed Before this commit, the customer signs the intervention completed and does not received any email with the intervention report. He has to create an account in the DB as portal user to be able to see his intervention or ask to contact person to send him the report by mail. This commit will automatically send the intervention report by mail to the customer once the intervention is completed and signed by the customer. ## [FIX] planning_field_service: fix label and record_name in email sent for Field service Before this commit, the button sent to the customer to see the intervention is `View Planning Slot` and the record name used inside the same email is the display name which is not useful for the customer. This commit changes the label of the button displayed to see `View Report` and change the record_name to show `Field Service - <intervention date>` as shown in the portal view. ## [FIX] planning_field_service: no login required to access to intervention Before this commit, the customer cannot access to the intervention without begin log in even if he has the access token. This commit changes the route access to let the user access to the intervention completed and he can also sign it. ## [FIX] planning: hide duplicated name field in kanban displayed in gantt This commit hides the duplicated name field displayed in the popover of the gantt view in the planning.slot model. ## [FIX] planning_field_service: rename module name This commit renames the module to call it `Field Service` instead of `Planning - Field Service`. ## [FIX] worksheet: only show property warning message in mobile ## [FIX] planning: define employee_public_ids field in planning.slot Before this commit, when a planning user goes to a shift he will see Assign to me button on a shift assigned to another human resource which is normally not allowed. The reason because the button is visible is because `employee_ids` field is always empty for users who are not HR user. This commit adds `employee_public_ids` field which is also a computed field non stored to get the employee for the user who is not a HR user. ## [FIX] planning_field_service: always compute break_time This commit removes the default value on break_time field to always trigger the compute of that field, the reason is because by default the allocated_hours computed when we create a shift, will not always cover the whole duration of the shift, the allocated hours of the shift is computed based on the working schedule of the shift and so the break_time field has to be computed afterwards to make sure the break time is correctly set instead of having 0 by default when we create a shift. task-6060493 Forward-Port-Of: odoo/enterprise#112420
This update resolves an issue where rescheduling a task's deadline didn't automatically update the deadlines of its dependent tasks, even with the 'Auto-Reschedule (Keep Buffer)' option enabled. The fix ensures that dependent tasks are correctly adjusted when the main task's deadline is modified, maintaining the intended buffer times.
Original PR description
__ ## Short functional explanation of the error When rescheduling the deadline only of a task that has dependencies, other dependencies won't be moved in time, even if we select `Auto-Reschedule…
__ ## Short functional explanation of the error When rescheduling the deadline only of a task that has dependencies, other dependencies won't be moved in time, even if we select `Auto-Reschedule (Keep Buffer)`. ## Reproduction Steps 1. Go to Project. On a given project, click on the 3 dots on the top right of the project card. Then, click settings and under Task Management, check Task Dependencies. 2. Create 2 tasks for this project. On task 1, click on the Deadline field, then click on the top right of the calendar card to set a planned date. 3. On task 2, click on the Blocked By tab. Then, add a line with task 1. Select a planned date like you did with task 1. 4. Go back to the project and on the top right, click on the Gantt view. Make sure that above the calendar, the Auto-Reschedule (Keep Buffer) option is selected. Then, move forward (or backward) the deadline of task 1 by only clicking on the right edge of the pill and dragging/dropping it to the left/right. ### Expected behavior As task 2 depends on task 1, and we need to keep the buffer. The start date of task 2 should be moved left when we drop the deadline of task 1 further left, or right when we move the deadline of task 1 further right. ### Unexpected behavior Nothing happens. ## Origin of the issue ### JS side When we click on the whole task 1 and drag it to the right (thus changing the start date *and* the deadline), the dependent tasks are also moved right. When performing this action, this calls the method `dragPillDrop`. In it, we can see this piece of code: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/static/src/gantt_renderer.js#L1484-L1489 where `this.isAutoPlan` indicates whether we checked the Auto-Reschedule (Keep Buffer) option. In that case, we call `rescheduleAccordingToDependency`, which performs this ORM call: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/static/src/gantt_model.js#L500 However, when only moving the deadline of the task, we call the method `resizePillDrop`. In this method, we don't check if `this.isAutoPlan` is True, as we perform in all case the call to: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/static/src/gantt_renderer.js#L2822 Which will trigger the orm call: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/static/src/gantt_model.js#L479 which will call the `web_gantt_write` method in Python, only writing on the task we changed the deadline of. ### PY side Inside `web_gantt_reschedule`, to reschedule dependent tasks, we have to reach the method call: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/models/models.py#L247 However, there's a condition preventing us from reaching that code when only changing the deadline: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/models/models.py#L230-L235 Yet, we need to trigger the code and reschedule dependencies even if there's no planned date as soon as we change the deadline. Once we're in `_web_gantt_action_reschedule_candidates`, we check if we're in the case of preponing or postponing the task (i.e the direction of the rescheduling): https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/models/models.py#L410 This call is performed with `start_date_field_name`, which is present in the `vals` in the case of moving a whole task. Yet, in our case, we only move the deadline, so `start_date_field_name` isn't in our `vals`. So, to get the direction of our rescheduling, we have to use `stop_date_field_name` instead. Then, we perform this call: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/models/models.py#L412 However, in our case, the dependent tasks are still found under the `dependency_inverted_field_name` field. This leads us to the return of the function, where we call `_web_gantt_move_candidates`. In it, we retrieve the previous values of the pill we're modifying with: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/project_enterprise/models/project_task.py#L1366 using `vals`. Later we use `start_date_field_name` to update the dates of dependent tasks: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/project_enterprise/models/project_task.py#L1413-L1415 Still, in our case, we don't have `start_date_field_name` in vals. Thus, we have to define `old_vals_per_pill_id[self.id][start_date_field_name]`. Next, we define the start date and end date of the intervals in which we reschedule the dependent tasks (so, the left and right bounds of intervals): https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/project_enterprise/models/project_task.py#L1392-L1401 In case of a `search_forward`, this is natural. Nevertheless, in the case of a backwards search, we can't consider the start date of the first task to be the right bound for our dependent tasks, as they occur after the first task! This would mean that our right bound is set before the dependent tasks even start. So, in our case of changing only a deadline, we have to set the right bound to the latest deadline of the dependent tasks. They won't be set to later, as we are moving the deadline backward. Finally, in the case of setting a deadline backwards, we have to keep the time gap between task 1 and the dependent tasks, based on the working hours. This feature wasn't implemented. __ opw-6080405 Forward-Port-Of: odoo/enterprise#117815 Forward-Port-Of: odoo/enterprise#113787
This pull request reverts a previous change to improve the consistency and style of the l10n_fr_pdp module's code. The change addresses issues identified during automated checks (CI/Style). This ensures the module continues to function correctly and aligns with our coding standards.
Original PR description
This reverts commit 5406869fb9d55e8f7f7f070bd21396c140baf088.
This update fixes a visual issue where the sidebar menu wouldn't allow scrolling to view all items, particularly when the menu is long or the page is narrow. The fix adds scrolling functionality to the sidebar, ensuring users can access all menu options. It also resolves a related issue with the disclaimer appearing when the sidebar menu is active.
Original PR description
Scenario: - set menu bar as sidebar - adds lot of menu item (or decrease page height) - try to scroll to bottom menu item that are not shown Result: you can't see the bottom of the menu Cause: there…
Scenario: - set menu bar as sidebar - adds lot of menu item (or decrease page height) - try to scroll to bottom menu item that are not shown Result: you can't see the bottom of the menu Cause: there is no overflow auto on sidebar elements so the default visible is used without possible scroll. This issue doesn't happen for hamburger menu (hamburger template or on mobile) because it wraps the menu in an .offcanvas-body element that has in bootstrap overflow-y: auto Fix: add vertical overflow to o_header_sidebar menu. Note: also fixes the visual issue happening when setting both sidebar menu and disclaimer by forcing the disclaimer to not be avialable if sidebar menu is selected. opw-5486934 --- __pr note__: I'm not sure if there is a reason this was not done yet or if this has just not been reported. The behavior happen from 16.0 to now. Since the query is from 19.0 to lower risk (and since it's not really broken, just not working with a big number of menu) I've targeted 19.0 but I could go lower if wanted. Forward-Port-Of: odoo/odoo#252047
This update fixes an issue where internal links within the Timesheet Assistant's custom form view opened in a new window, disrupting the user's workflow. Now, these links will open within a modal, keeping users directly within the Timesheets Assistant menu for a smoother experience.
Original PR description
This commit opens the internal links in the custom form view displayed in the timesheet assistant inside a modal to stay in Timesheets Assistant menu. task-[6132392](https://www.odoo.com/odoo/project/4105/tasks/6132392) Forward-Port-Of: odoo/enterprise#118277 Forward-Port-Of: odoo/enterprise#114596
This update fixes an issue where the expected hours displayed in the Attendances Gantt view didn't accurately reflect flexible work schedules. The fix ensures the calculation considers the user's local timezone, leading to more precise hour estimations. This improves the accuracy of time tracking for employees on flexible arrangements.
Original PR description
Steps to reproduce: 1. Ensure your browser is in a non-UTC timezone (e.g. Europe/Zurich) 2. Set an employee to have a flexible working schedule 3. Enter the Attendances app 4. When hovering over the employee in the gantt view, the expected hours do not match their working schedule When we calculate the expected hours for the Gantt view in attendances, we calculate this based on an incorrect number of attendance intervals given from _attendance_intervals_batch(). To ensure that we recieve accurate intervals, we need to ensure that we calculate intervals based on the correct date range with respect to the browsers timezone, instead of the UTC date range. [opw-6175441](https://www.odoo.com/odoo/my-tasks/6175441?debug=assets) Forward-Port-Of: odoo/enterprise#118729 Forward-Port-Of: odoo/enterprise#116807
This update optimizes Odoo's performance when displaying large tables, like the Accounting > Balances Sheets. By using a more targeted approach to style recalculations, the system now responds faster during actions like scrolling and resizing, leading to a smoother user experience.
Original PR description
Avoid using the :has() selector and use a specific class on the body instead to replicate the same behavior. This reduces work during the "Recalculate Style" phase (for example when hovering rows in large tables such as the Accounting > Balances Sheets). It lowers recalculation time during window resizes, heavy scrolling, and table sorting by preventing broad selector matches and limiting style checks to elements with the specific class. similar fix: https://github.com/odoo/enterprise/pull/118535 Forward-Port-Of: odoo/odoo#266954
13 changes
Resolved issues and error corrections
This update fixes an issue where half-day absences were incorrectly rounding up hours, leading to inaccurate payroll calculations for employees using flexible schedules. The change decouples the scheduling logic, allowing for precise splitting of half and full days, ensuring accurate work hour totals and payroll processing. This improves the reliability of the flexible schedule feature.
Original PR description
Steps: - Create half day off for an employee - Create a full day off of the same type - Create a payslip for the employee Issue: - Due to the lack of attendance hours in the flexible schedules, the _get_work_hours_split_half is unable to split half day and full days work entries of the same type. - Half worked days will be rounded up which affects the total number of work days in a month Solution: The approach was to decouple the work_hours_split_half functionality from the attendance hours and rely on the specified hours_per_day instead. This accurately splits half and full days. Task: 6253675
This update resolves a test failure related to how binary data is handled during the import of Italian electronic invoices. The fix ensures test data is correctly formatted for Python 3.14's stricter base64 validation, preventing an error and ensuring the test runs successfully.
Original PR description
This commit fixes an error when running the `test_edi_import` test on Python 3.14, which is stricter about base64 validation. Ultimately, the root issue was that raw test content was being passed to the `datas` field of an attachment when a base64 representation was actually expected (which is obviously invalid base64). Passing it via the `raw` field instead correctly handles the raw binary data. runbot-939133 Forward-Port-Of: odoo/odoo#266731
This update resolves a minor issue in the POS system's testing process. A recent change introduced a new property within the data generated for preparation, and this fix ensures the tests accurately reflect this updated data. This ensures the POS functionality continues to operate correctly.
Original PR description
The community PR added a new property (`order_name`) to `extra_data` returned by `generatePreparationData`. We adapt the assertion in this test to account for that new field. opw-6208965
This update resolves an issue where Odoo failed to import simplified Italian electronic invoices (TD08) when a line item represented only tax. The fix prevents a division-by-zero error, ensuring that valid tax-only invoices from the Italian tax authority (Agenzia delle Entrate) can now be successfully imported. This improves the accuracy and reliability of invoice processing for Italian businesses.
Original PR description
### Issue before this commit: Importing a simplified Italian electronic invoice or credit note (e.g., TD08) fails with a float division by 0 traceback if a document line consists entirely of taxes…
### Issue before this commit: Importing a simplified Italian electronic invoice or credit note (e.g., TD08) fails with a float division by 0 traceback if a document line consists entirely of taxes (where the total line amount equals the tax amount). ### Steps to reproduce the issue: 1. Download Accounting and l10n_it 2. Switch to IT company 3. Go to Vendors > Refunds 4. Try to import the xml from the ticket ### Cause of the issue: The XML parser attempts to dynamically calculate the tax percentage using the formula tax_amount / (amount - tax_amount). When a line is purely a tax adjustment, the taxable base (amount - tax_amount) evaluates to exactly zero, triggering the critical division by zero crash. https://github.com/odoo/odoo/blob/e3b0ca11d99b2ef819cdad68b169112cd73668b6/addons/l10n_it_edi/models/account_move.py#L1863-L1867 ### Reason to introduce the fix: To ensure Odoo successfully imports valid, tax-only EDI documents already accepted by the Agenzia delle Entrate. Ticket [link](https://www.odoo.com/odoo/project.task/6217373) opw-6217373 Forward-Port-Of: odoo/odoo#267081 Forward-Port-Of: odoo/odoo#266374
This update fixes an issue where the Timesheet Assistant incorrectly suggested declined calendar events. The change now includes events where the user is an attendee, regardless of their RSVP status, providing more relevant suggestions. This ensures the Timesheet Assistant offers a more complete and accurate view of available calendar events.
Original PR description
### Before this commit: The Timesheet Assistant would incorrectly suggest calendar events that the user had explicitly declined. Furthermore, the domain only retrieved events where the user was the organizer (`user_id`), completely missing events where the user was only an attendee. ### After this commit: The `get_calendar_events` getter in `_get_assistant_events_getters` is updated to: 1. Include events where the current user is an attendee by adding a condition on `partner_ids`. 2. Explicitly exclude events where the user's `calendar.attendee` status is 'declined'. Task-6222659 Forward-Port-Of: odoo/enterprise#117613
This update resolves an issue where orders placed via mobile self-order with 'Pay After Meal' and online payment weren't correctly displayed in the restaurant's preparation display. The fix ensures all orders, regardless of payment type, are sent to the kitchen, improving order management and reducing potential delays.
Original PR description
pos* = pos_self_order_preparation_display, pos_online_payment_self_order_preparation_display Configuration: -------------- - Restaurant Mode - Self-Order Mode: "QR + Ordering" - Service At: Table - Pay after meal (Online Payment) Issue: ------ Orders created via mobile self-order using "Pay After Meal" + online payment were not appearing in the Preparation Display. Steps to Reproduce: ------------------- 1. Create an order from mobile self-order. 2. Open the restaurant POS, the order is visible there, but it does not appear on the preparation display. Cause: --------------- - The system only sent paid orders to the kitchen when online payment is set, skipping pay-after-meal case. Fix: ------------ - Updated logic to send all orders to the kitchen when “Pay After Meal” is selected, Task: 5929555 Forward-Port-Of: odoo/enterprise#107129
This update fixes an issue where the expected hours displayed in the attendance Gantt view were inaccurate for employees with flexible schedules. The fix ensures the calculation uses the user's local timezone instead of UTC, resulting in more precise hour estimations. This improves the accuracy of attendance tracking.
Original PR description
Steps to reproduce: 1. Ensure your browser is in a non-UTC timezone (e.g. Europe/Zurich) 2. Set an employee to have a flexible working schedule 3. Enter the Attendances app 4. When hovering over the employee in the gantt view, the expected hours do not match their working schedule When we calculate the expected hours for the Gantt view in attendances, we calculate this based on an incorrect number of attendance intervals given from _attendance_intervals_batch(). To ensure that we recieve accurate intervals, we need to ensure that we calculate intervals based on the correct date range with respect to the browsers timezone, instead of the UTC date range. [opw-6175441](https://www.odoo.com/odoo/my-tasks/6175441?debug=assets) Forward-Port-Of: odoo/enterprise#118607 Forward-Port-Of: odoo/enterprise#116807
This update strengthens the security of our Point of Sale system by ensuring that the correct access token is being used when displaying customer information. The `PosCustomerDisplay` controller now validates the access token, preventing potential vulnerabilities. This enhances the overall security posture of the Odoo POS module.
Original PR description
In this commit we adapt the `PosCustomerDisplay` controller such that it checks that the correct `pos.access_token` was sent. Task: 6144690 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263428 Forward-Port-Of: odoo/odoo#261545
This update resolves a bug where the time parser incorrectly handled German time entries with capital letters (e.g., '2h30m'). The fix ensures the parser correctly interprets time formats, including those with minutes, regardless of the user's language setting.
Original PR description
Issue: ---------------------------------------- In German, using a time field with minutes breaks the parser and only the hours are taken into account. Steps to reproduce:…
Issue:
----------------------------------------
In German, using a time field with minutes breaks the parser and only the hours are taken into account.
Steps to reproduce:
----------------------------------------
- Install Timesheet and Project
- Change language to German
- Open a task, page "Timesheets"
- Create a new record
- Write "2:30" to set the time, it will work
- It won't work if you add an UoM, i.e. "2h30m", "2h 30 Min."
Cause:
----------------------------------------
In German all common nouns begin with a capital letter so their UoMs too.
In the parser we call `durationUnitsRegex` which uses a library to get the UoMs in the local language.
https://github.com/odoo/odoo/blob/2e2d4752bd12210be4b30bddaf8c9fc1861ec0e4/addons/web/static/src/core/l10n/time.js#L289-L298
For Germany, the abbreviations will have capital letters ("Min.", "Sek.", etc.). So there will be upper case letters in the regex.
But the string on which we call the regex is only lower case:
https://github.com/odoo/odoo/blob/2e2d4752bd12210be4b30bddaf8c9fc1861ec0e4/addons/web/static/src/views/fields/parsers.js#L185-L189
https://github.com/odoo/odoo/blob/2e2d4752bd12210be4b30bddaf8c9fc1861ec0e4/addons/web/static/src/core/l10n/time.js#L271-L277
So the regex returns no match.
Solution:
----------------------------------------
When building the regex, we call `RegExp()` constructor with "i" to ignore cases.
opw-6236787This update resolves a performance issue impacting the calculation of payroll for Belgian companies (l10n_be_hr_payroll). The fix optimizes a key process, leading to faster and more reliable payroll processing. This ensures accurate and timely payroll calculations for our Belgian clients.
This update resolves an issue where rescheduling a task's deadline didn't automatically update the deadlines of its dependent tasks, even with the 'Auto-Reschedule (Keep Buffer)' option enabled. The fix ensures that dependent tasks' deadlines adjust dynamically when the main task's deadline is modified, maintaining accurate scheduling within the Gantt chart. This improves project planning and reduces the risk of missed deadlines.
Original PR description
__ ## Short functional explanation of the error When rescheduling the deadline only of a task that has dependencies, other dependencies won't be moved in time, even if we select `Auto-Reschedule…
__ ## Short functional explanation of the error When rescheduling the deadline only of a task that has dependencies, other dependencies won't be moved in time, even if we select `Auto-Reschedule (Keep Buffer)`. ## Reproduction Steps 1. Go to Project. On a given project, click on the 3 dots on the top right of the project card. Then, click settings and under Task Management, check Task Dependencies. 2. Create 2 tasks for this project. On task 1, click on the Deadline field, then click on the top right of the calendar card to set a planned date. 3. On task 2, click on the Blocked By tab. Then, add a line with task 1. Select a planned date like you did with task 1. 4. Go back to the project and on the top right, click on the Gantt view. Make sure that above the calendar, the Auto-Reschedule (Keep Buffer) option is selected. Then, move forward (or backward) the deadline of task 1 by only clicking on the right edge of the pill and dragging/dropping it to the left/right. ### Expected behavior As task 2 depends on task 1, and we need to keep the buffer. The start date of task 2 should be moved left when we drop the deadline of task 1 further left, or right when we move the deadline of task 1 further right. ### Unexpected behavior Nothing happens. ## Origin of the issue ### JS side When we click on the whole task 1 and drag it to the right (thus changing the start date *and* the deadline), the dependent tasks are also moved right. When performing this action, this calls the method `dragPillDrop`. In it, we can see this piece of code: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/static/src/gantt_renderer.js#L1484-L1489 where `this.isAutoPlan` indicates whether we checked the Auto-Reschedule (Keep Buffer) option. In that case, we call `rescheduleAccordingToDependency`, which performs this ORM call: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/static/src/gantt_model.js#L500 However, when only moving the deadline of the task, we call the method `resizePillDrop`. In this method, we don't check if `this.isAutoPlan` is True, as we perform in all case the call to: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/static/src/gantt_renderer.js#L2822 Which will trigger the orm call: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/static/src/gantt_model.js#L479 which will call the `web_gantt_write` method in Python, only writing on the task we changed the deadline of. ### PY side Inside `web_gantt_reschedule`, to reschedule dependent tasks, we have to reach the method call: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/models/models.py#L247 However, there's a condition preventing us from reaching that code when only changing the deadline: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/models/models.py#L230-L235 Yet, we need to trigger the code and reschedule dependencies even if there's no planned date as soon as we change the deadline. Once we're in `_web_gantt_action_reschedule_candidates`, we check if we're in the case of preponing or postponing the task (i.e the direction of the rescheduling): https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/models/models.py#L410 This call is performed with `start_date_field_name`, which is present in the `vals` in the case of moving a whole task. Yet, in our case, we only move the deadline, so `start_date_field_name` isn't in our `vals`. So, to get the direction of our rescheduling, we have to use `stop_date_field_name` instead. Then, we perform this call: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/web_gantt/models/models.py#L412 However, in our case, the dependent tasks are still found under the `dependency_inverted_field_name` field. This leads us to the return of the function, where we call `_web_gantt_move_candidates`. In it, we retrieve the previous values of the pill we're modifying with: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/project_enterprise/models/project_task.py#L1366 using `vals`. Later we use `start_date_field_name` to update the dates of dependent tasks: https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/project_enterprise/models/project_task.py#L1413-L1415 Still, in our case, we don't have `start_date_field_name` in vals. Thus, we have to define `old_vals_per_pill_id[self.id][start_date_field_name]`. Next, we define the start date and end date of the intervals in which we reschedule the dependent tasks (so, the left and right bounds of intervals): https://github.com/odoo/enterprise/blob/e113c851e6fa9a7a3c1dca840926ed7e58b3f16f/project_enterprise/models/project_task.py#L1392-L1401 In case of a `search_forward`, this is natural. Nevertheless, in the case of a backwards search, we can't consider the start date of the first task to be the right bound for our dependent tasks, as they occur after the first task! This would mean that our right bound is set before the dependent tasks even start. So, in our case of changing only a deadline, we have to set the right bound to the latest deadline of the dependent tasks. They won't be set to later, as we are moving the deadline backward. Finally, in the case of setting a deadline backwards, we have to keep the time gap between task 1 and the dependent tasks, based on the working hours. This feature wasn't implemented. __ opw-6080405 Forward-Port-Of: odoo/enterprise#117815 Forward-Port-Of: odoo/enterprise#113787
This update significantly improves the performance and stability of the VAT Books ES report by processing invoices in batches instead of loading everything into memory at once. This prevents memory issues and drastically reduces report generation times, especially for large invoice volumes, ensuring reliable report exports.
Original PR description
### Description of the issue/feature this PR addresses: This PR introduces batch processing to the VAT Books ES (Libros de IVA) report generation. When attempting to export the report for periods…
### Description of the issue/feature this PR addresses: This PR introduces batch processing to the VAT Books ES (Libros de IVA) report generation. When attempting to export the report for periods containing a massive volume of invoices, the ORM cache continuously accumulates records, leading to severe memory consumption. By implementing batching and explicitly clearing the environment cache, use memory use will remain stable and efficient. ### Current behavior before PR: Generating the VAT Books report loads all account move lines into memory at once. Because the ORM cache is never cleared during the iteration, RAM usage spikes continuously. On databases with tens or hundreds of thousands of invoices in a single period, this leads to significant performance degradation, worker timeouts, or complete Out-Of-Memory (OOM) crashes. ### Desired behavior after PR is merged: The report engine now splits the recordset into manageable batches (e.g., 50,000 accounts per batch). After processing each chunk to extract the income and expense line values, invalidate_model() is called to flush the ORM cache related to the searched records. This frees up memory continuously, keeping the server's RAM usage flat and allowing the successful export of massive datasets without crashing. ### Benchmark: The model is iterating through ~1.1M account move lines when generating the full report. For Memory: | # Input Data | Before PR | After PR| | -------- | -------- | -------- | | ~77,000 account move lines | 385 MB | 666 MB | | ~340,000 account move lines |1.2 GB | 1.5 GB | | ~1.2M account move lines | MemoryError | 1.5 GB | For Speed: | # Input Data | Before PR | After PR| | -------- | -------- | -------- | | ~77,000 account move lines | 32s | 12s | | ~340,000 account move lines | 2:29min | 1:11min | | ~1.2M account move lines | MemoryError | 4:11min | ### Reference opw-6037414 ----------------------------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr) Forward-Port-Of: odoo/enterprise#116139
This update corrects a bug in the website builder where an unnecessary `<p>` tag was added when inserting icons. This prevented icons from being displayed correctly and caused formatting issues. The fix ensures icons are wrapped in `<p>` tags only when appropriate, maintaining proper website styling.
Original PR description
When the "icon" snippet is dropped, after the icon is selected and inserted, a call to `wrapInlinesInBlocks` ensures the icon is wrapped in a `<p>` element. The added `p` is only desired when the icon snippet is dropped between blocks, and it is problematic when the icon snippet is dropped "inline". This commit only wraps the icon if needed (aka, the parent `allowsParagraphRelatedElements`) Steps to reproduce: - Open website builder - Select a span of text and turn it bold - Type `/button` inside the bold text and add a button - Drag and drop the "Icon" snippet (an inner content snippet) - Select any icon - Bug: a `<p>` element is added in the `strong` element (which is invalid html), and this adds line breaks (and the style is affected if the line breaks are manually deleted) task-6251585 Forward-Port-Of: odoo/odoo#266735
18 changes
Enhancements to existing features
This update enhances the flexibility of our documentation links by adding styling options through 'class' props. Previously, these links had a fixed style, limiting their use in different contexts like buttons or dropdowns. Now, developers can easily customize the appearance of these links to fit seamlessly into various parts of the Odoo application.
Original PR description
Before this commit, the style of that component is fixed, thus it is not possible to customize it to render that component as a secondary button neither display it as dropdown item. This commit adds the `class` props in that component to be able easily change the style to use that component anywhere. task-6095833
Resolved issues and error corrections
This update clarifies the meaning of a document access setting within the Documents app. Previously, 'No' indicated no access, which was misleading. It's now 'Basic,' accurately reflecting that users retain access to their own and shared documents. This change improves clarity and usability.
Original PR description
In the Documents app, the lowest tier access right was called "No", which implies the user has no access. However, this is not the case. The user still has access to the app, their own documents, and shared documents. To resolve this confusion, "No" is changed to "Basic" and the relevant descriptions are updated. task-6099135 Forward-Port-Of: odoo/enterprise#113660
This update streamlines the calculation of offer fields, optimizing performance by removing unnecessary dependencies and reducing redundant recomputations. Additionally, a fix ensures offer fields are displayed correctly when creating offers from the payroll module, resolving a previous display issue.
Original PR description
**Problem:** Since this https://github.com/odoo/enterprise/pull/103846, `employee_version_id` depends on `contract_start_date` to adjust the employee state based on the contract date. This introduced…
**Problem:** Since this https://github.com/odoo/enterprise/pull/103846, `employee_version_id` depends on `contract_start_date` to adjust the employee state based on the contract date. This introduced an unnecessary dependency chain: ``` contract_start_date -> employee_version_id -> contract_template_id -> wages and other offer fields ``` As a result, updating `contract_start_date` invalidates and recomputes the whole chain, even when `employee_version_id` does not actually change. In addition, offer fields were coupled in a single compute, causing unrelated fields to be reset to template values when only one field required recomputation. **Fix:** - `contract_template_id` compute now depends on `employee_id` instead of `employee_version_id`, and directly uses the employee's `version_id`, breaking the chain while preserving default behavior. - The offer fields computations were also split to avoid unintended recomputations and field resets. - Simplified `_get_version` by always copying values from the template to the currently active version. --- **Additional fix:** The `is_hr_payroll` context flag is used to distinguish payroll vs recruitment flows when creating an offer with both `employee_id` and `applicant_id` unset. A recent change in [Task #6094737](https://www.odoo.com/odoo/project/1251/tasks/6094737) did not account for this flag, causing both fields to be hidden when opening the form from Payroll (a new feature added in saas-19.3). This is fixed by properly considering `is_hr_payroll`, restoring consistent behavior across all versions. Task: 6158245 Forward-Port-Of: odoo/enterprise#115408
This update resolves a minor issue where a test for one2many fields could sometimes fail in an unpredictable way. The fix prevents the creation of duplicate records during testing, ensuring the test is more reliable and consistent. This improves the overall stability of the Odoo system.
Original PR description
This commit fixes a non deterministic one2many field test by ensuring that we don't quick create the record twice.
Before this commit, it might sometimes happen that the validation of the input ("Enter", by default) produced a second name_create. Note that in practice this is highly unlikely to happen as if the user presses Enter, the "Quick create" item in the dropdown only appears during a single frame, thus making impossible for the user to click on it.
It's the exact same issue as the one fixed by odoo/odoo#256582.
runbot error~242443
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#266344This update ensures that changes to pricelist item dates made while a Point of Sale session is open are correctly reflected within the POS. Previously, reloading the POS wouldn't update the items. This improves the accuracy of pricing displayed to customers during transactions.
Original PR description
Before this commit, if the date validity of a pricelist item was changed after opening a POS session, reloading the POS won't update the items. opw-6223217 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265211
This update resolves an issue where date formatting in the spreadsheet module was inconsistent across different Chrome versions. Changes in underlying dependencies caused variations in how dates were displayed, leading to test failures. This revision ensures a consistent and reliable date format for all spreadsheet outputs.
Original PR description
Some dependencies in the chrome build changed between chrome 145 and 148 which changes the output value of luxon.Interval.toLocaleString, more specifically, some space characters were changed and the tests can pass or not depending on the chrome version they run with. This revision forces a standardized output. task-6233171 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#266167 Forward-Port-Of: odoo/odoo#265565
Previously, sign requests scheduled for the future were immediately visible to the signer on the portal. This fix corrects a filtering issue that incorrectly showed scheduled requests. The update utilizes a new 'scheduled' state to accurately manage the display of sign requests based on their scheduling status.
Original PR description
## Issue When scheduling a sign request, the request appears immediately on the portal for the requested signer. ## Steps to reproduce 1. Install *Sign* (`sign`) 2. Create and send a sign request -…
## Issue
When scheduling a sign request, the request appears immediately on the portal for the requested signer.
## Steps to reproduce
1. Install *Sign* (`sign`)
2. Create and send a sign request
- Signer 1: Any portal user (e.g., Joel Willis)
- Use the clock icon to schedule the signature request to a future date
3. Log in as the portal user used in step 2
4. Navigate to Signature Requests
5. **The signature request already appears in the list, even though it was scheduled for a future date.**
## Cause
The portal filters the sign requests shown based on the `is_mail_sent` field, which does not properly reflect when the signature request is shared to the user.
https://github.com/odoo/enterprise/blob/9898272f17809decf6c5bb4600aca46f9ffae6f0/sign/controllers/portal.py#L40
In fact, when scheduling a signature request, the `is_mail_sent` field is unconditionally set to `True`, even if the signature request will only be sent later.
https://github.com/odoo/enterprise/blob/9898272f17809decf6c5bb4600aca46f9ffae6f0/sign/models/sign_request_item.py#L289
## Fix
Since the `"scheduled"` `sign_request_item.state` option introduced by https://github.com/odoo/enterprise/commit/ed8d5a653e01b1378f0020e2f7a7c2d39fadf3e9 in 19.1, we can easily filter out the sign request items that are scheduled. That state is automatically updated by the `_cron_update_state`, introduced by the same commit as the `"scheduled"` option.
https://github.com/odoo/enterprise/blob/9898272f17809decf6c5bb4600aca46f9ffae6f0/sign/models/sign_request.py#L493-L503
opw-6227472This update fixes an issue where intercompany sales and purchases with multiple identical products resulted in incorrect stock reservation during receipt picking. Specifically, when a sale is made from one company to another, the system was failing to properly reserve inventory across all lines of the order. This fix ensures accurate stock tracking for these transactions.
Original PR description
…lit for same-product lines When doing an intercompany Sale->Purchase with multiple lines having the same products, the receipt picking would be incorrectly assigned: - Enable Inter-Company…
…lit for same-product lines
When doing an intercompany Sale->Purchase with multiple lines having the same products, the receipt picking would be incorrectly assigned:
- Enable Inter-Company Transactions on both companies (Create and validate)
- Create SO in company A to company B with 2 lines having the same product P, Confirm. => Delivery in company A, Purchase and Receipts in company will be created => The SO/PO/Delivery/Receipt will all have 2 lines
- Validate delivery => On the receipt, the 2 units of P are reserved on the 1st move, and the 2nd move is not reserved.
https://github.com/user-attachments/assets/b4816051-120e-4226-9228-fd552649d5ef
---
### Test result without fix:
```
2026-04-23 13:16:44,577 48027 INFO oes_test_18.0 odoo.addons.sale_purchase_stock_inter_company_rules.tests.test_inter_company_so_to_po: Starting TestInterCompanySaleToPurchaseWithStock.test_02_inter_company_multiple_lines_with_same_product ...
2026-04-23 13:16:44,949 48027 INFO oes_test_18.0 odoo.addons.sale_purchase_stock_inter_company_rules.tests.test_inter_company_so_to_po: ======================================================================
2026-04-23 13:16:44,949 48027 ERROR oes_test_18.0 odoo.addons.sale_purchase_stock_inter_company_rules.tests.test_inter_company_so_to_po: FAIL: TestInterCompanySaleToPurchaseWithStock.test_02_inter_company_multiple_lines_with_same_product
Traceback (most recent call last):
File "/home/odoo/Odoo/src/18.0/enterprise/sale_purchase_stock_inter_company_rules/tests/test_inter_company_so_to_po.py", line 109, in test_02_inter_company_multiple_lines_with_same_product
self.assertRecordValues(purchase_from_a.picking_ids.move_ids, [
File "/home/odoo/Odoo/src/18.0/odoo/odoo/tests/common.py", line 709, in assertRecordValues
self.assertSequenceEqual(expected_reformatted, record_reformatted, seq_type=list)
AssertionError: Lists differ: [{'pr[18 chars]0, 'quantity': 1.0}, {'product_uom_qty': 1.0, 'quantity': 1.0}] != [{'pr[18 chars]0, 'quantity': 2.0}, {'product_uom_qty': 1.0, 'quantity': 0.0}]
First differing element 0:
{'product_uom_qty': 1.0, 'quantity': 1.0}
{'product_uom_qty': 1.0, 'quantity': 2.0}
- [{'product_uom_qty': 1.0, 'quantity': 1.0},
? ^
+ [{'product_uom_qty': 1.0, 'quantity': 2.0},
? ^
- {'product_uom_qty': 1.0, 'quantity': 1.0}]
? ^
+ {'product_uom_qty': 1.0, 'quantity': 0.0}]
? ^
```
OPW-6145683
Forward-Port-Of: odoo/enterprise#118548
Forward-Port-Of: odoo/enterprise#114873This update corrects a bug where newly created product categories didn't automatically use the updated default expense accounts set in the company's settings. The change ensures that all product categories, including new ones, correctly reflect the current expense account configuration. This prevents misallocation of costs and improves financial reporting accuracy.
Original PR description
**Steps to reproduce:** - Accounting > Configuration > Settings > Default Accounts > Product Accounts - Change the default expense account (and income account) - Create a new product category -…
**Steps to reproduce:** - Accounting > Configuration > Settings > Default Accounts > Product Accounts - Change the default expense account (and income account) - Create a new product category - category still proposed the old accounts Affected versions: from 18.2 till 19.2 **Cause:** `ir.default` for `product.category` (`property_account_expense_categ_id` and `property_account_income_categ_id`) was not updated when `res.company.expense_account_id` / `income_account_id` changed, so new categories kept using stale defaults. and in 19.0 https://github.com/odoo/odoo/blob/894281f2a3e313fc239529572b5cc8c06a3511f7/addons/account/models/company.py#L490 and https://github.com/odoo/odoo/blob/894281f2a3e313fc239529572b5cc8c06a3511f7/addons/account/models/company.py#L753 calls https://github.com/odoo/odoo/blob/894281f2a3e313fc239529572b5cc8c06a3511f7/addons/account/models/company.py#L1136-L1139 However, when stock_account is installed https://github.com/odoo/odoo/blob/894281f2a3e313fc239529572b5cc8c06a3511f7/addons/stock_account/models/res_company.py#L361-L366 this gets called, without calling super, that's why it didn't work although the fix is there, we will need to adapt another fix in 19.0+ **Solution:** Call `_set_category_defaults()` in `res.company.write()` so `ir.default` stays aligned with the company's current product default accounts. opw-6145491 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265052 Forward-Port-Of: odoo/odoo#261594
This update resolves an issue where Odoo failed to import simplified Italian electronic invoices (TD08) when a line consisted entirely of taxes. The fix prevents a division-by-zero error, ensuring that valid tax-only invoices submitted by the Italian tax authority (Agenzia delle Entrate) can now be successfully imported. This improves the reliability of invoice processing for Italian businesses.
Original PR description
### Issue before this commit: Importing a simplified Italian electronic invoice or credit note (e.g., TD08) fails with a float division by 0 traceback if a document line consists entirely of taxes…
### Issue before this commit: Importing a simplified Italian electronic invoice or credit note (e.g., TD08) fails with a float division by 0 traceback if a document line consists entirely of taxes (where the total line amount equals the tax amount). ### Steps to reproduce the issue: 1. Download Accounting and l10n_it 2. Switch to IT company 3. Go to Vendors > Refunds 4. Try to import the xml from the ticket ### Cause of the issue: The XML parser attempts to dynamically calculate the tax percentage using the formula tax_amount / (amount - tax_amount). When a line is purely a tax adjustment, the taxable base (amount - tax_amount) evaluates to exactly zero, triggering the critical division by zero crash. https://github.com/odoo/odoo/blob/e3b0ca11d99b2ef819cdad68b169112cd73668b6/addons/l10n_it_edi/models/account_move.py#L1863-L1867 ### Reason to introduce the fix: To ensure Odoo successfully imports valid, tax-only EDI documents already accepted by the Agenzia delle Entrate. Ticket [link](https://www.odoo.com/odoo/project.task/6217373) opw-6217373 Forward-Port-Of: odoo/odoo#267081 Forward-Port-Of: odoo/odoo#266374
A recent test failed due to an issue in how the system searches for short URLs. The fix ensures that the system correctly identifies and handles situations where the same code pattern appears in multiple URLs, preventing duplicate results. This improves the accuracy of link searches.
Original PR description
Problem ------ The test was trying to search for links that has specific code patterns in their short_url and distinguish links using this logic. However, it did not consider the case where the same code pattern might exist in two different urls. i.e `example/r/AbC` and `example/r/DbE` both contains `b`, so when searching for `b`, both urls will be returned. FIX ------ Testing the search on different code combinations for the short_url is not the subject of that unit test, it is sufficient to search for the exact codes and see if there are conflicting results. task-6254039 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266709
This update fixes an issue where the 'Unreconciled Entries' filter was hidden in Partner Ledger reports (and General Ledger) in version 19.1+. Now, users can enable this filter to view reports showing transactions that haven't been reconciled, providing more accurate financial reporting.
Original PR description
**Issue:** In 19.1+, the `Unreconciled` filter no longer appears in the report filters panel (e.g., Partner Ledger / General Ledger), even when the option is enabled in report settings. **Steps to reproduce:** - Install accounting, go to reporting - Open Partner Ledger - Enable `Unreconciled` in report options - Open the filters panel, observe that `Unreconciled` is missing **Cause:** The frontend filter rendering for `unreconciled` is not aligned with the filter options state, so the toggle is effectively hidden despite being enabled. **Solution:** Ensure the `unreconciled` filter entry is correctly exposed in the filters configuration. opw-6154054 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where orders placed via mobile self-order with 'Pay After Meal' and online payment were not being sent to the kitchen for preparation. The fix ensures that all orders, regardless of payment type, are now correctly transmitted to the preparation display, improving order flow and kitchen efficiency.
Original PR description
pos* = pos_self_order_preparation_display, pos_online_payment_self_order_preparation_display Configuration: -------------- - Restaurant Mode - Self-Order Mode: "QR + Ordering" - Service At: Table - Pay after meal (Online Payment) Issue: ------ Orders created via mobile self-order using "Pay After Meal" + online payment were not appearing in the Preparation Display. Steps to Reproduce: ------------------- 1. Create an order from mobile self-order. 2. Open the restaurant POS, the order is visible there, but it does not appear on the preparation display. Cause: --------------- - The system only sent paid orders to the kitchen when online payment is set, skipping pay-after-meal case. Fix: ------------ - Updated logic to send all orders to the kitchen when “Pay After Meal” is selected, Task: 5929555 Forward-Port-Of: odoo/enterprise#107129
This update corrects minor visual inconsistencies in the portal's layout, specifically aligning alert content and ensuring Knowledge/Document cards are properly displayed. A temporary SCSS fix was implemented for the stable version, but the underlying issue will be addressed in a larger update on the main branch to prevent future alignment problems.
Original PR description
The alert content is vertically misaligned due to the mb-1. The Knowledge / Document cards are not inserted inside a `row` which misaligns them due to the missing margin and padding. This is to be reworked on master forwardport since here we're dealing with nested rows withouth intermediary columns. SCSS only fix for stable. task-5262108 <img width="663" height="553" alt="image" src="https://github.com/user-attachments/assets/18dd6c2f-47f0-4ba8-91cb-f9c5a2e0fda4" /> > [!NOTE] > On the master forwardport I'll review the DOM to avoid the nested row and unnecessary margin instead of the scss fix here. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249313
This update adds a direct link within the Timesheets Assistant interface to its official documentation. This enhancement makes it easier for users to quickly find answers to their questions and understand how to use the Timesheets Assistant effectively. It’s a small change designed to improve user support and knowledge.
Original PR description
This commit adds documentation link in Timesheets Assistant to redirect the user to the documentation of Timesheets Assistant. task-6095833
This update fixes a technical error that occurred when applying payslips with negative amounts. The issue stemmed from referencing outdated data within the payroll system. The fix involved correcting the data references and removing unnecessary code, ensuring accurate payslip processing.
Original PR description
Steps to produce: - create a previous payslip with negative amount - create a payslip for current month - click on the warning to apply negative amount - you get an error or a traceback because it's referencing an input which is removed from the system and migrated to other input Fix: - corrected the reference to negative net - removed content of the method `_generate_payslip` as it's not used and referencing removed inputs task-id: 6240163
This update resolves a recurring issue where payments on self-order kiosks using the Worldline terminal would get stuck. The fix allows the system to correctly handle terminal disconnections and provides more specific error messages, improving the overall payment experience for customers. This enhances reliability and reduces frustration.
Original PR description
This PR fixes some payments in pos kiosk being stuck with iot worldline terminal. It allows to succesfully interpret when the terminal is disconnected and adapts the error messages to the information received fromthe terminal instead of the current generic "An error has occurred" enterprise: https://github.com/odoo/enterprise/pull/107709 task-5946033 Forward-Port-Of: odoo/odoo#249101
This update resolves an issue where attachments added to emails sent via the 'Send by Email' action were disappearing after refreshing the chatter window. The fix restricts attachment saving to the full composer view, ensuring consistent behavior across different email creation methods. This improves the reliability of sending emails with attachments.
Original PR description
**Steps to reproduce:** - Install Sales app - Create a Sales Order - Click on the 'Send by Email' action - Add an attachment and send it - Open the chatter to create a log note - Attachment is…
**Steps to reproduce:** - Install Sales app - Create a Sales Order - Click on the 'Send by Email' action - Add an attachment and send it - Open the chatter to create a log note - Attachment is attached to the new message - It disappears on refresh **Issue:** Attachment upload widget was moved to the toolbar of the composer with [1], which split it into `mail_composer_attachment_selector` and `mail_composer_attachment_list`. Then with [2] the selector logic was changed to use `FileUploader` instead of `FileInput` to get the attachment synced when switching back and forth between full and normal chatter composers. But this should not impact action composers created with `'mail.email_compose_message_wizard_form'`. **Fix:** Restrict the attachment save to the full composer using context. [1] https://github.com/odoo/odoo/commit/cee3c8146863300242f9f2d109743a50c2b91027 [2] https://github.com/odoo/odoo/commit/9f7249a141b618fc8640a65d1f7fc20023156ce3 opw-5164504 Forward-Port-Of: odoo/odoo#266530 Forward-Port-Of: odoo/odoo#265736
3 changes
Resolved issues and error corrections
This update corrects a technical issue with the Peru - Accounting Reports module that was causing SUNAT's electronic validation system to reject DAM reports. The fix ensures that only the required 3-digit customs dependency code is used in field 8 of the report, aligning with SUNAT regulations. This prevents report rejections and ensures accurate data submission.
Original PR description
**Steps to reproduce:** * Install Peru - Accounting Reports (l10n_pe_reports). * Create a vendor bill with Document Type 50 (Declaración Aduanera de Mercancías - DAM) and a document number in the…
**Steps to reproduce:** * Install Peru - Accounting Reports (l10n_pe_reports). * Create a vendor bill with Document Type 50 (Declaración Aduanera de Mercancías - DAM) and a document number in the standard pediment format (e.g. C235202610-38047). * Go to Accounting > Reporting > Purchase Electronic Record (RCE 8.4). * Export the TXT file and open it. **Observed behavior:** * Field 8 contains the full first numeric block of the document name including the year and sequence digits (e.g. 235202610) instead of only the 3-digit customs dependency code. * SUNAT/SIRE rejects the file immediately because 235202610 does not exist in Table 4 (RS 040-2022), which only defines 3-digit codes. **Cause:** * `_get_serie_folio()` splits the document name by taking everything before the last digit group as the serie. For a name like C235202610-38047 this produces serie = "C235202610", and the existing `serie[1:]` logic strips only the leading letter, leaving "235202610" in field 8 instead of the 3-digit customs dependency code "235". * The same incorrect value was also written to field 28 (aduana_code). * ref : https://www.sunat.gob.pe/legislacion/superin/2022/anexo-040-2022.pdf **Fix:** * For document types 50 and 52, extract the first numeric group from the document name using `re.search(r'\d+', move_name)` and slice the first 3 characters to obtain the customs dependency code as defined in SUNAT Table 4 (always a 3-digit value). * Apply the same logic to field 28 (aduana_code) for consistency. opw-6157662 Forward-Port-Of: odoo/enterprise#115406
This update fixes an issue where intercompany sales and purchases with multiple identical products resulted in incorrect stock reservation during receipt picking. The fix ensures that all units of a product are properly reserved across all delivery and purchase moves, resolving discrepancies in inventory tracking. This improves the accuracy of intercompany transactions.
Original PR description
…lit for same-product lines When doing an intercompany Sale->Purchase with multiple lines having the same products, the receipt picking would be incorrectly assigned: - Enable Inter-Company…
…lit for same-product lines
When doing an intercompany Sale->Purchase with multiple lines having the same products, the receipt picking would be incorrectly assigned:
- Enable Inter-Company Transactions on both companies (Create and validate)
- Create SO in company A to company B with 2 lines having the same product P, Confirm. => Delivery in company A, Purchase and Receipts in company will be created => The SO/PO/Delivery/Receipt will all have 2 lines
- Validate delivery => On the receipt, the 2 units of P are reserved on the 1st move, and the 2nd move is not reserved.
https://github.com/user-attachments/assets/b4816051-120e-4226-9228-fd552649d5ef
---
### Test result without fix:
```
2026-04-23 13:16:44,577 48027 INFO oes_test_18.0 odoo.addons.sale_purchase_stock_inter_company_rules.tests.test_inter_company_so_to_po: Starting TestInterCompanySaleToPurchaseWithStock.test_02_inter_company_multiple_lines_with_same_product ...
2026-04-23 13:16:44,949 48027 INFO oes_test_18.0 odoo.addons.sale_purchase_stock_inter_company_rules.tests.test_inter_company_so_to_po: ======================================================================
2026-04-23 13:16:44,949 48027 ERROR oes_test_18.0 odoo.addons.sale_purchase_stock_inter_company_rules.tests.test_inter_company_so_to_po: FAIL: TestInterCompanySaleToPurchaseWithStock.test_02_inter_company_multiple_lines_with_same_product
Traceback (most recent call last):
File "/home/odoo/Odoo/src/18.0/enterprise/sale_purchase_stock_inter_company_rules/tests/test_inter_company_so_to_po.py", line 109, in test_02_inter_company_multiple_lines_with_same_product
self.assertRecordValues(purchase_from_a.picking_ids.move_ids, [
File "/home/odoo/Odoo/src/18.0/odoo/odoo/tests/common.py", line 709, in assertRecordValues
self.assertSequenceEqual(expected_reformatted, record_reformatted, seq_type=list)
AssertionError: Lists differ: [{'pr[18 chars]0, 'quantity': 1.0}, {'product_uom_qty': 1.0, 'quantity': 1.0}] != [{'pr[18 chars]0, 'quantity': 2.0}, {'product_uom_qty': 1.0, 'quantity': 0.0}]
First differing element 0:
{'product_uom_qty': 1.0, 'quantity': 1.0}
{'product_uom_qty': 1.0, 'quantity': 2.0}
- [{'product_uom_qty': 1.0, 'quantity': 1.0},
? ^
+ [{'product_uom_qty': 1.0, 'quantity': 2.0},
? ^
- {'product_uom_qty': 1.0, 'quantity': 1.0}]
? ^
+ {'product_uom_qty': 1.0, 'quantity': 0.0}]
? ^
```
OPW-6145683
Forward-Port-Of: odoo/enterprise#118548
Forward-Port-Of: odoo/enterprise#114873This update resolves an issue where orders placed via mobile self-order with 'Pay After Meal' and online payment weren't correctly displayed in the restaurant's preparation display. The fix ensures that all orders, regardless of payment type, are now sent to the kitchen, improving order management and reducing potential delays.
Original PR description
pos* = pos_self_order_preparation_display, pos_online_payment_self_order_preparation_display Configuration: -------------- - Restaurant Mode - Self-Order Mode: "QR + Ordering" - Service At: Table - Pay after meal (Online Payment) Issue: ------ Orders created via mobile self-order using "Pay After Meal" + online payment were not appearing in the Preparation Display. Steps to Reproduce: ------------------- 1. Create an order from mobile self-order. 2. Open the restaurant POS, the order is visible there, but it does not appear on the preparation display. Cause: --------------- - The system only sent paid orders to the kitchen when online payment is set, skipping pay-after-meal case. Fix: ------------ - Updated logic to send all orders to the kitchen when “Pay After Meal” is selected, Task: 5929555 Forward-Port-Of: odoo/enterprise#107129
8 changes
Resolved issues and error corrections
This update automatically sets the deductibility prorata rate to 100% by default in the tax reports. Previously, users had to manually configure this rate, which often led to inaccurate tax reports. This change simplifies the process and ensures more reliable tax calculations.
Original PR description
Users often forget to complete the deductibility prorata rate, which makes the tax report seems buggy. Set the rate to 100% by default. task-6092580 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263486
This update resolves a rare test failure related to timing issues within the website's automated testing process. By adjusting how the test waits for updates, the system is now more reliable and less prone to intermittent errors. The changes also include minor improvements to the test's structure for better stability.
Original PR description
This commit fixes the test "waitForTimeout does not trigger update if interaction is not ready yet", which could very rarely fail on runbot. **Origin of the problem** The test relies on precise…
This commit fixes the test "waitForTimeout does not trigger update if interaction is not ready yet", which could very rarely fail on runbot. **Origin of the problem** The test relies on precise timings, but the helper `advanceTime` could introduce a non-deterministic lag because, when called with default options, it awaits for an animation frame. If the lag happens to be too long, the second `verifySteps` is called too late and the test fails. **Fix** The helper `advanceTime` is now called with the option `animationFrame` set to false to avoid awaiting for an animation frame. For additional safety, the waiting time is also reduced. Two changes not directly related to this problem have been applied to improve the test: 1. an unnecessary `await` in `willStart` has been removed; 2. the `animationFrame` has been set to false also on the second `advanceTime` (a non-deterministic lag here can't fail the test, but still there is no reason to await for the animation frame). runbot-243515 Forward-Port-Of: odoo/odoo#266432
This update corrects an error in the Peru - Accounting Reports module that was causing the SUNAT/SIRE system to reject DAM reports. Specifically, the report was incorrectly including too much data in field 8, leading to rejection. The fix ensures that only the required 3-digit customs dependency code is used, aligning with SUNAT regulations.
Original PR description
**Steps to reproduce:** * Install Peru - Accounting Reports (l10n_pe_reports). * Create a vendor bill with Document Type 50 (Declaración Aduanera de Mercancías - DAM) and a document number in the…
**Steps to reproduce:** * Install Peru - Accounting Reports (l10n_pe_reports). * Create a vendor bill with Document Type 50 (Declaración Aduanera de Mercancías - DAM) and a document number in the standard pediment format (e.g. C235202610-38047). * Go to Accounting > Reporting > Purchase Electronic Record (RCE 8.4). * Export the TXT file and open it. **Observed behavior:** * Field 8 contains the full first numeric block of the document name including the year and sequence digits (e.g. 235202610) instead of only the 3-digit customs dependency code. * SUNAT/SIRE rejects the file immediately because 235202610 does not exist in Table 4 (RS 040-2022), which only defines 3-digit codes. **Cause:** * `_get_serie_folio()` splits the document name by taking everything before the last digit group as the serie. For a name like C235202610-38047 this produces serie = "C235202610", and the existing `serie[1:]` logic strips only the leading letter, leaving "235202610" in field 8 instead of the 3-digit customs dependency code "235". * The same incorrect value was also written to field 28 (aduana_code). * ref : https://www.sunat.gob.pe/legislacion/superin/2022/anexo-040-2022.pdf **Fix:** * For document types 50 and 52, extract the first numeric group from the document name using `re.search(r'\d+', move_name)` and slice the first 3 characters to obtain the customs dependency code as defined in SUNAT Table 4 (always a 3-digit value). * Apply the same logic to field 28 (aduana_code) for consistency. opw-6157662 Forward-Port-Of: odoo/enterprise#115406
This update fixes an issue where intercompany sales and purchases with multiple identical products resulted in incorrect stock reservation during receipt picking. Specifically, the system was failing to properly reserve all units of a product when creating intercompany transactions with multiple lines. This change ensures accurate stock tracking and prevents discrepancies in inventory levels between companies.
Original PR description
…lit for same-product lines When doing an intercompany Sale->Purchase with multiple lines having the same products, the receipt picking would be incorrectly assigned: - Enable Inter-Company…
…lit for same-product lines
When doing an intercompany Sale->Purchase with multiple lines having the same products, the receipt picking would be incorrectly assigned:
- Enable Inter-Company Transactions on both companies (Create and validate)
- Create SO in company A to company B with 2 lines having the same product P, Confirm. => Delivery in company A, Purchase and Receipts in company will be created => The SO/PO/Delivery/Receipt will all have 2 lines
- Validate delivery => On the receipt, the 2 units of P are reserved on the 1st move, and the 2nd move is not reserved.
https://github.com/user-attachments/assets/b4816051-120e-4226-9228-fd552649d5ef
---
### Test result without fix:
```
2026-04-23 13:16:44,577 48027 INFO oes_test_18.0 odoo.addons.sale_purchase_stock_inter_company_rules.tests.test_inter_company_so_to_po: Starting TestInterCompanySaleToPurchaseWithStock.test_02_inter_company_multiple_lines_with_same_product ...
2026-04-23 13:16:44,949 48027 INFO oes_test_18.0 odoo.addons.sale_purchase_stock_inter_company_rules.tests.test_inter_company_so_to_po: ======================================================================
2026-04-23 13:16:44,949 48027 ERROR oes_test_18.0 odoo.addons.sale_purchase_stock_inter_company_rules.tests.test_inter_company_so_to_po: FAIL: TestInterCompanySaleToPurchaseWithStock.test_02_inter_company_multiple_lines_with_same_product
Traceback (most recent call last):
File "/home/odoo/Odoo/src/18.0/enterprise/sale_purchase_stock_inter_company_rules/tests/test_inter_company_so_to_po.py", line 109, in test_02_inter_company_multiple_lines_with_same_product
self.assertRecordValues(purchase_from_a.picking_ids.move_ids, [
File "/home/odoo/Odoo/src/18.0/odoo/odoo/tests/common.py", line 709, in assertRecordValues
self.assertSequenceEqual(expected_reformatted, record_reformatted, seq_type=list)
AssertionError: Lists differ: [{'pr[18 chars]0, 'quantity': 1.0}, {'product_uom_qty': 1.0, 'quantity': 1.0}] != [{'pr[18 chars]0, 'quantity': 2.0}, {'product_uom_qty': 1.0, 'quantity': 0.0}]
First differing element 0:
{'product_uom_qty': 1.0, 'quantity': 1.0}
{'product_uom_qty': 1.0, 'quantity': 2.0}
- [{'product_uom_qty': 1.0, 'quantity': 1.0},
? ^
+ [{'product_uom_qty': 1.0, 'quantity': 2.0},
? ^
- {'product_uom_qty': 1.0, 'quantity': 1.0}]
? ^
+ {'product_uom_qty': 1.0, 'quantity': 0.0}]
? ^
```
OPW-6145683
Forward-Port-Of: odoo/enterprise#118548
Forward-Port-Of: odoo/enterprise#114873This update resolves a bug where cancelled journal entries were incorrectly displayed in the reconciliation view, preventing successful reconciliations. The fix removes a previous refactor that inadvertently allowed cancelled entries to appear, ensuring accurate reconciliation processes.
Original PR description
Issue: Cancelled journal entries were visible in the "Journal Items to Reconcile" view (action_move_line_posted_unreconciled) because the action domain had no filter to exclude them. This caused…
Issue: Cancelled journal entries were visible in the "Journal Items to Reconcile" view (action_move_line_posted_unreconciled) because the action domain had no filter to exclude them. This caused reconciliation failures, no reconciliation happened, and the cancelled record remained in the view. This regression was introduced during a refactor to allow draft entries in the reconciliation view, where the posted-state condition was removed from the domain: Enterprise commit: https://github.com/odoo/enterprise/commit/003cffabda7d91a6d10d58942ed972ca5e17366d As a result, cancelled journal items also became visible, causing reconciliation attempts to fail while the records remained in the view. Also, we are not allowed to reconcile cancelled move lines, and we already have the validation for this [here](https://github.com/odoo/odoo/blame/a236f67776616f6facdefb0117a6ffdde9b7c84c/addons/account/models/account_move_line.py#L2627) Issue is reproducible on runbot. Here is the video reference: https://drive.google.com/file/d/1ojIDxHn5Yst8gVFy8JyhwtJoDSSSJsmK/view?usp=sharing - OPW: 6247870 Forward-Port-Of: odoo/enterprise#118773
This update resolves a minor visual issue where the name of the Sendcloud website delivery module was displayed incorrectly. The typo ('Sendcould') has been corrected, ensuring consistent branding and a better user experience. This change does not impact functionality.
Original PR description
The displayed name contained a typo ("Sendcould" instead of "Sendcloud") All other references already use the correct spelling, so no further changes were necessary.
opw-6239003
Forward-Port-Of: odoo/enterprise#118223This update disables the '@' mention feature for visitors in live chat conversations. Previously, visitors could trigger irrelevant suggestions, creating unnecessary noise. This change ensures a cleaner and more focused chat experience for all users.
Original PR description
**Description of the issue this PR addresses:** ---------------------------------------------- Visitors in livechat can trigger partner mention suggestions by typing the @ delimiter in the composer.…
**Description of the issue this PR addresses:** ---------------------------------------------- Visitors in livechat can trigger partner mention suggestions by typing the @ delimiter in the composer. However, visitors can only mention themselves or odoobot, which does not provide meaningful functionality in the context of a livechat conversation. **Current behavior before PR:** ---------------------------------------------- - Visitors can type @ in the livechat composer and trigger partner mention suggestions. - The suggestions only include the visitor themselves or odoobot. **Desired behavior after PR is merged:** ---------------------------------------------- - The @ delimiter is disabled for visitors in livechat threads. - Partner mention suggestions are no longer triggered for visitors. - Internal users (operators) can still use @ mentions normally. Task-5119068 ---------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266758 Forward-Port-Of: odoo/odoo#253551
This update fixes an issue where combo product prices were incorrectly duplicated in sales orders when all component prices were zero. The fix ensures the combo price is accurately distributed across its items, preventing double-reporting and improving order accuracy. This ensures consistent and correct pricing for combo products.
Original PR description
**Problem:** When a combo product has a price but all of its combo components have a zero list price, the quotation shows the combo's price twice: once on the combo line itself and once on the last…
**Problem:** When a combo product has a price but all of its combo components have a zero list price, the quotation shows the combo's price twice: once on the combo line itself and once on the last combo item line. **Steps to reproduce:** 1. Create a combo product with a non-zero price and two or more combo groups whose component products have a zero list price. 2. Create a sale order, add the combo, pick one item per group. 3. Look at the quotation/order: the combo line total and the last combo-item line both show the full combo price. **Current behavior:** The full combo price ends up on the last combo item line; the other combo items show 0. The combo line then displays the same total via `_get_combo_totals`, so the same amount appears twice. **Expected behavior:** The combo's price is spread across its combo items so no single line duplicates the combo total. **Cause of the issue:** `_get_combo_item_display_price` prorates the combo price by each combo's base price. When every base price is 0, every prorated price is 0, so `combo_price_delta` equals the full combo price and is added to the last combo as a rounding correction, concentrating the whole price there instead of spreading it. **Fix:** Treat an all-zero base case as "no proration signal" and split the combo price evenly across combos before the delta adjustment runs. The delta correction then only handles rounding, as intended. opw-6217945 Forward-Port-Of: odoo/odoo#265010
2 changes
Resolved issues and error corrections
A minor typo in the name of the Sendcloud website delivery module has been fixed. This ensures consistent and accurate branding within the Odoo Enterprise platform. No other changes were required as all other references used the correct spelling.
Original PR description
The displayed name contained a typo ("Sendcould" instead of "Sendcloud") All other references already use the correct spelling, so no further changes were necessary.
opw-6239003
Forward-Port-Of: odoo/enterprise#118223This update resolves an issue where the barcode inventory count feature would fail when using archived units of measure. The fix ensures that the system correctly identifies and utilizes these archived units, allowing for accurate inventory counts. This improves the reliability of the inventory management process.
Original PR description
### Steps to reproduce: - In the settings enable: "Units of Measure & Packagings", "Storage Locations" - Create a product in units and register 1 unit in stock - Inventory > Operations > Adjustments…
### Steps to reproduce: - In the settings enable: "Units of Measure & Packagings", "Storage Locations" - Create a product in units and register 1 unit in stock - Inventory > Operations > Adjustments > Physical Inventory - Select your line and request a count > Set Current Value - Inventory > Configurations > units of measures > UOM categories - Select unit and archive it - Go to the barcode app > Click Count inventory ### > Owl error: Uncaught promise ### Cause of the issue: Since the uom used on the quant is archived, it is not found by the search used to fill the barcodeCache: https://github.com/odoo/enterprise/blob/26546bcd3beebc7f65ce08385441b6284b46598e/stock_barcode/static/src/components/main.js#L209-L213 https://github.com/odoo/enterprise/blob/26546bcd3beebc7f65ce08385441b6284b46598e/stock_barcode/models/stock_quant.py#L104-L106 https://github.com/odoo/enterprise/blob/26546bcd3beebc7f65ce08385441b6284b46598e/stock_barcode/static/src/components/main.js#L229 https://github.com/odoo/enterprise/blob/26546bcd3beebc7f65ce08385441b6284b46598e/stock_barcode/static/src/models/barcode_model.js#L37-L39 However, if the uom is not present in the barcode cache the `BarcodeQautnModel` will fail to createLinesState whihc raises a missing error: https://github.com/odoo/enterprise/blob/26546bcd3beebc7f65ce08385441b6284b46598e/stock_barcode/static/src/models/barcode_quant_model.js#L712 https://github.com/odoo/enterprise/blob/26546bcd3beebc7f65ce08385441b6284b46598e/stock_barcode/static/src/lazy_barcode_cache.js#L107-L110 opw-6250090 Forward-Port-Of: odoo/enterprise#118813
17 changes
New functionality added to Odoo
This update integrates Obox receipt printers into the Point of Sale (POS) system. Leveraging the Obox's ePOS format compatibility, the change simplifies printer configuration and utilizes existing EpsonPrinter code, improving POS functionality. This allows for seamless printing of receipts from Obox printers.
Original PR description
See: odoo/obox#152 This commit adds support for Obox receipt printers in the POS. Since the Obox now supports the ePOS format, most of the ePOS code can be reused. Configuring an Obox printer simply prefills the IP with the correct path and the POS just uses the same EpsonPrinter class as normal. task-6241706
This update introduces a new Kanban view within the Obox app, allowing users to easily manage and track all connected devices grouped by their respective Obox. When an Obox is paired, the system automatically initiates a device discovery process, streamlining device setup and management. This improves the overall user experience for Obox device integration.
Original PR description
This commit adds a 'Devices' menu item to the Obox app, which links to a Kanban view of all the devices grouped by Obox. In addition, a device discovery is automatically started once an Obox has been paired. <img width="892" height="340" alt="image" src="https://github.com/user-attachments/assets/42d4a421-0185-4cdf-982f-55eb241e60de" /> task-6241705
This update introduces support for calculating the 'Cotisation Wijninckx,' a Belgian payroll tax related to group insurance. Eligibility is determined by a government letter and the tax rate is 12.5% of the declared amount. This ensures accurate tax reporting for employees with qualifying group insurance.
Original PR description
Purpose: When you have a group insurance and the amount of the group insurance is exceeding a specific amount, you'll be eligible to the "Cotisation Wijninckx" To know if you're eligible or not, it's based on a letter sent by the government to you, or to your payroll company. If you're eligible, they'll communicate you the amount to tax for that cotisation, the amount to pay is 12.5% of the declared amount. Current Behavior: - add a new salary rule input for Cotisation Wijninckx - add a rule parameter for the rate of the cotisation with value 12.5% starting on 1/1/2026 - declare the Cotisation Wijninckx under code 868 in the DMFA if it's present task-id: 6201188
This update allows companies to configure and manage employee contributions towards hospitalization insurance premiums. It automatically deducts these contributions from employee salaries via payroll, providing greater flexibility and control over benefits. The changes standardize settings and improve data management for company-specific insurance configurations.
Original PR description
**Purpose** In some companies, employees pay part of the hospitalization insurance premium themselves. This contribution must: - be configurable at the company level - be automatically applied to employees enrolled in hospitalization insurance, - and be deducted from the employee’s net salary through payroll computation. **Specifications** This PR implements the employee contribution workflow as follows: - Add a company level setting defining the default employee contribution amount. - Initialize the employee contribution field from company settings when hospitalization insurance is enabled on the employee. - Allow editing the contribution per employee. - Add a salary rule that deducts the employee contribution from the payslip. - Ensure the rule is computed before `NET` salary. task-6111061
Enhancements to existing features
This update ensures that when an employee changes their assigned car within Odoo, the vehicle's driver is automatically updated to reflect that employee. Previously, this process was inaccurate, and this change corrects that, streamlining the driver assignment process. This improves data accuracy related to employee vehicle assignments.
Original PR description
In this PR, we updated driver assignment when car is manually changed on employee. When a car is selected or changed on an employee, update the vehicle's driver to the employee's partner. Clear previous car's driver link if reassigned. Related task: 4922053.
This update ensures our payroll rules for Saudi Arabia (KSA) comply with Saudi Labour Law Article 77 regarding termination compensation. It adjusts salary calculations to guarantee employees receive the legally mandated minimum wage for a specified period following termination, aligning with legal requirements. This update is crucial for accurate payroll processing and avoiding potential legal issues.
Original PR description
According to Article 77 of Saudi Labour Law: Unless the contract includes specific compensation for the termination by either party for an invalid reason, the party affected by termination shall be entitled to compensation as follows: 1. For indefinite term contracts: an amount equivalent to fifteen-day wage for each year of the worker’s employment. 2. For fixed-term contracts: the wage for the remainder of the contract term. 3. The compensation referred to in paragraphs (1) and (2) of this Article shall not be less than the worker’s wage for two months. This commit makes sure our KSA EOS salary rule complies with Article 77. task-6008261
This update enhances the tracking of payslips generated directly from payruns within the Odoo Enterprise system. Previously, it was difficult to monitor the creation of payslips originating from payruns. Now, the system provides better visibility into these payslips, improving payroll management and reporting.
Original PR description
Task#6253290
This update adds optional, hidden fields to the payslip form, specifically tracking the version of worked days lines. This enhancement provides more detailed information for payroll reporting and auditing, ensuring greater accuracy and traceability of payroll data. It's a minor improvement focused on data clarity.
Original PR description
Add optional hidden fields related to the version of the worked days lines on the payslip form. task-6133414
This update enhances the backend view of employee payslips by hiding lines that aren't printed. A new toggle allows users to view all payslip lines, ensuring a more accurate representation of the employee's actual earnings. This improves clarity and reduces confusion.
Original PR description
By default, payslip lines that do not appear on the printed payslip (appears_on_payslip = 'never', or 'non_zero' with zero total) are now hidden in the Salary Computation tab, giving a backend view…
By default, payslip lines that do not appear on the printed payslip
(appears_on_payslip = 'never', or 'non_zero' with zero total) are now
hidden in the Salary Computation tab, giving a backend view consistent
with what the employee sees on their payslip.
Added a Show All Toggle that controls the visibility of payslip lines that are invisible on the actual payslip.
This Toggle state is shared across all payslips, but not stored.
Implementation:
- Added a "Show All" toggle widget registered as a view_widget.
- Toggle state is persisted in localStorage under the key
"hr_payroll.display_all_payslip_lines"
- Created a module-level proxy object "payslipShowAllState" as the
single source of truth shared across all payslip instances.
- Custom ListRenderer (PayslipListRowVisibilityRenderer) filters rows
based on appears_on_payslip and payslipShowAllState.showAll.
- Custom X2ManyField widget (payslip_lines_2many) swaps the default
ListRenderer with the custom one.
task - 6200256Resolved issues and error corrections
This update ensures that orders placed via mobile self-order with 'Pay After Meal' and online payment are now correctly displayed in the restaurant POS preparation display. Previously, the system only sent paid orders with online payment to the kitchen, causing a gap in order visibility. This fix ensures all orders are sent, improving kitchen workflow and order management.
Original PR description
pos* = pos_self_order_preparation_display, pos_online_payment_self_order_preparation_display Configuration: -------------- - Restaurant Mode - Self-Order Mode: "QR + Ordering" - Service At: Table - Pay after meal (Online Payment) Issue: ------ Orders created via mobile self-order using "Pay After Meal" + online payment were not appearing in the Preparation Display. Steps to Reproduce: ------------------- 1. Create an order from mobile self-order. 2. Open the restaurant POS, the order is visible there, but it does not appear on the preparation display. Cause: --------------- - The system only sent paid orders to the kitchen when online payment is set, skipping pay-after-meal case. Fix: ------------ - Updated logic to send all orders to the kitchen when “Pay After Meal” is selected, Task: 5929555 Forward-Port-Of: odoo/enterprise#107129
This update corrects an error in the Peru - Accounting Reports module that was causing SUNAT to reject electronic reports. Specifically, the report was incorrectly including too much data in field 8, leading to file rejection. The fix ensures the correct 3-digit customs dependency code is used, aligning with SUNAT regulations.
Original PR description
**Steps to reproduce:** * Install Peru - Accounting Reports (l10n_pe_reports). * Create a vendor bill with Document Type 50 (Declaración Aduanera de Mercancías - DAM) and a document number in the…
**Steps to reproduce:** * Install Peru - Accounting Reports (l10n_pe_reports). * Create a vendor bill with Document Type 50 (Declaración Aduanera de Mercancías - DAM) and a document number in the standard pediment format (e.g. C235202610-38047). * Go to Accounting > Reporting > Purchase Electronic Record (RCE 8.4). * Export the TXT file and open it. **Observed behavior:** * Field 8 contains the full first numeric block of the document name including the year and sequence digits (e.g. 235202610) instead of only the 3-digit customs dependency code. * SUNAT/SIRE rejects the file immediately because 235202610 does not exist in Table 4 (RS 040-2022), which only defines 3-digit codes. **Cause:** * `_get_serie_folio()` splits the document name by taking everything before the last digit group as the serie. For a name like C235202610-38047 this produces serie = "C235202610", and the existing `serie[1:]` logic strips only the leading letter, leaving "235202610" in field 8 instead of the 3-digit customs dependency code "235". * The same incorrect value was also written to field 28 (aduana_code). * ref : https://www.sunat.gob.pe/legislacion/superin/2022/anexo-040-2022.pdf **Fix:** * For document types 50 and 52, extract the first numeric group from the document name using `re.search(r'\d+', move_name)` and slice the first 3 characters to obtain the customs dependency code as defined in SUNAT Table 4 (always a 3-digit value). * Apply the same logic to field 28 (aduana_code) for consistency. opw-6157662 Forward-Port-Of: odoo/enterprise#115406
A recent issue prevented users from confirming shipments when the destination province was outside of the supported areas (USA, Canada, and Vietnam). This update corrects the UPS integration to ensure it only accepts province codes of 5 characters or less, as required by the UPS API. This resolves a problem that was blocking shipment confirmations for users in locations like the Philippines.
Original PR description
Issue ----- Users cannot confirm shipments depending on the destination's province. Steps to reproduce ----- - Set up UPS - Create a contact in Philipines - Province: Cebu - Create a delivery - Validate the delivery > Error message Cause ----- Codes can only be 5 characters long, as per the API https://developer.ups.com/tag/Shipping?loc=en_US#operation/Shipment According to the doc, the field is only useful for USA, Canada and Vietnam. ----- Ticket: opw-6149404 Forward-Port-Of: odoo/enterprise#117203
This update clarifies the meaning of the 'Basic' access right within the Documents app. Previously, 'No' was used, which created confusion about user access. The term has been changed to 'Basic' to accurately reflect that users retain access to their documents and the app itself.
Original PR description
In the Documents app, the lowest tier access right was called "No", which implies the user has no access. However, this is not the case. The user still has access to the app, their own documents, and shared documents. To resolve this confusion, "No" is changed to "Basic" and the relevant descriptions are updated. task-6099135 Forward-Port-Of: odoo/enterprise#113660
This update corrects a technical issue where a GOSI configuration warning was incorrectly displayed multiple times on payslips. The change ensures that this warning only appears once, streamlining the payroll process and improving data accuracy. This resolves a potential reporting discrepancy.
Original PR description
With this change, we prevent the GOSI configuration warning from appearing twice on a payslip task-6241149
This update removes a misleading warning message about a missing identification number from the payroll dashboard. The identification number field is no longer used in the payroll process, so the warning was unnecessary. This improves the user experience and simplifies payroll reporting.
Original PR description
Remove the "Missing Identification Number" warning from the dashboard. The identification number field is not used in the payroll workflow, making this banner redundant. Task: 6254734
This update prevents users from unintentionally opening employee views during pay run selection. By disabling clicks on data rows (except the avatar), it reduces the risk of users being forced to restart the pay run process. This enhances the user experience and efficiency.
Original PR description
This disables opening the employee form view when clicking anywhere on the data row, except when clicking directly on the avatar. The goal is to prevent accidental clicks on the row that force users to start over again. Task:6251741
Features or functions removed from Odoo
This change removes a reset button from the HR payroll views. This reverts a previous update that introduced an issue with the payroll functionality. The removal ensures consistent and reliable payroll processing.
Original PR description
This reverts commit e35572b310fb2b705cda25283824224c1f0140bc. task-6075229
4 changes
Resolved issues and error corrections
This update optimizes the way Odoo calculates the styles for work orders, resulting in faster performance during common actions like resizing windows or scrolling through large tables. By using a more targeted approach, the system avoids unnecessary style recalculations, leading to a smoother user experience.
Original PR description
Avoid using the :has() selector and use a specific class on the body instead to replicate the same behavior, this reduces work during the "Recalculate Style" phase. It lowers recalculation time during window resizes, heavy scrolling, and table sorting by preventing broad selector matches and limiting style checks to elements with the specific class.
This update fixes a minor issue in the DMFA report where the 'Calculation Basis' and 'Contribution Type' headers were incorrectly switched. The headers have now been corrected to their proper order, ensuring accurate reporting of payroll data for Belgian businesses using this module. This ensures data consistency and reliability.
Original PR description
DMFA report had "Calculation Basis" and "Contribution Type" header switched. Got switched back correctly. task-6227590
This update clarifies the 'invalid_scope' error message, which indicates a user lacks the legal right to grant consent for a company. The improved message provides clearer guidance to users, ensuring they understand the reason for the error and can resolve it correctly. This enhances the user experience and compliance with legal requirements.
Original PR description
The invalid_scope error message means the user doesn't hav the legal rights to give consent for the given company. But the error message is not clear enough. This commit improve the error message clarity. task-6144883
This update fixes an issue where XML imports for DIAN bills incorrectly defaulted the EDI type to '01' when using the Purchase journal. Now, imported bills retain their original EDI type, regardless of the journal used, ensuring accurate reporting and compliance with DIAN regulations. This improves the reliability of imported financial data.
Original PR description
In l10n_co_edi on bills, the field l10n_co_edi_type can only be changed when the journal is DIAN Support Documents and not purchase. However when importing a XML, the field is not imported and is instead always computed to type 01. It should be possible to have imported bills using the Purchase journal and maintain their original type. (Take the xml on the ticket to reproduce the issue) opw-6203930
6 changes
Resolved issues and error corrections
This update corrects a bug that incorrectly marked mass email sending as 'sent' even when emails hadn't actually been delivered to customers. This ensures accurate tracking of email campaigns and prevents misreporting of delivery status, improving the reliability of our customer communication features.
Original PR description
Fixed an issue where mass sending entries would set the sent status to true even if it's not actually sent to the customer task-6060589
This update resolves a bug where users were unexpectedly locked out of list views after editing a row. The fix ensures the system correctly exits edit mode when a user navigates away from a selected row, restoring normal functionality. This improves user experience and prevents disruptions to workflow.
Original PR description
Problem: When a user selects a row, attempts to edit a cell, and then clicks away without saving, the view becomes unusable. The selected row remains highlighted, and the system prevents the selection of other lines. The user is locked out until they click the "Save" or "Discard" buttons. Cause: The UI becomes stuck in edit mode. The `onGlobalClick` event handler within `documents_list_renderer` was missing the method call to exit edit mode. Solution: Updated `onGlobalClick` to correctly trigger the method to leave edit mode. task-6059836
This update resolves an issue where payments to PL suppliers without VAT would trigger errors when exceeding 15,000 PLN. The fix adds a check for suppliers without VAT, preventing unnecessary verification creation and ensuring smooth payment processing. This improves the reliability of the bank verification process for PL suppliers.
Original PR description
[FIX] l10n_pl_bank_verification: PL Supplier no VAT When a PL supplier has no VAT and a PL company tries to pay him a bill above 15.000 PLN, there is a traceback. The reason is that there was no check for partner with no VAT, a verification was created every time the field was compute.
This update resolves a minor typo in the name of the Sendcloud website delivery module. The incorrect spelling ('Sendcould') was corrected to the accurate 'Sendcloud'. This ensures consistent branding and avoids confusion for users.
Original PR description
The displayed name contained a typo ("Sendcould" instead of "Sendcloud") All other references already use the correct spelling, so no further changes were necessary.
opw-6239003
Forward-Port-Of: odoo/enterprise#118223This update resolves an issue where currency amounts in Arabic RTL (right-to-left) views were incorrectly formatted, appearing with the minus sign positioned to the right of the currency symbol. The fix ensures that currency amounts are displayed correctly, aligning with standard left-to-right formatting in Arabic locales, improving the user experience for Arabic-speaking users.
Original PR description
Steps to reproduce 1. Create a company with Egypt localization, currency EGP 2. On a bank journal, set Outstanding Receipt and Outstanding Payment accounts 3. Register a customer payment so the journal dashboard shows the Payments row with a negative amount 4. Switch the user language to Arabic 5. Open the Accounting dashboard Issue The Payments amount renders as "LE 5,000.00-" instead of "-5,000.00 LE". formatCurrency returns the string "-5,000.00 LE". In an Arabic page the leading "-" has no intrinsic direction, so the browser attaches it to the surrounding right-to-left Arabic text and visually moves it past the symbol. Sibling rows on the same dashboard render correctly because they already wrap the amount in dir="ltr", see https://github.com/odoo/odoo/blob/d0424f2ffcf99ee59befe288150f1643b3fa0112/addons/account/views/account_journal_dashboard_view.xml#L252 opw-6183749 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where purchase journals created with only the Invoicing app couldn't import Peppol XML invoices due to a missing default account. The fix automatically assigns a default expense account, mirroring the behavior for bank/cash journals, ensuring invoices can be processed correctly. This prevents database errors and improves invoice import functionality.
Original PR description
When a user installs only the Invoicing app and creates a new purchase journal, no default_account_id is set on the journal. The Invoicing app does not expose account configuration, so the user cannot fix this manually. As a result, importing a Peppol XML invoice through that journal fails with a database constraint error because the generated account.move.line has a null account_id. https://github.com/odoo/odoo/blob/16245530f0e3e9be21c8b96baaecd3a679420cac/addons/account/models/account_journal.py#L776-L805 This already auto-creates accounts for bank/cash journals, but does nothing for sale/purchase journals. Steps to reproduce: - Install the Invoicing app (no full Accounting) - Create a new purchase journal with type 'purchase' - Go to Vendors -> Bills and Upload a Peppol XML file - Error importing attachment as invoice (decoder=_import_invoice_ubl_cii) Ticket [link](https://www.odoo.com/odoo/action-4043/6014363) opw-6014363 Forward-Port-Of: odoo/odoo#252859
1 change
Resolved issues and error corrections
This update resolves an issue where an error was incorrectly triggered when setting intrastat codes on product templates. The fix ensures the error only appears when a product template lacks variants and uses dynamic attributes, preventing unnecessary disruptions during product creation. This improves the stability and usability of the product template feature.
Original PR description
Problem: When saving an intrastat code on a product template with no variants, an error should be raised because intrastat codes are stored on the product variants. However, the error gets raised when creating a product template with intrastat code set because the variants get created after the product template is created, so it doesn't find any variant although the default variant will be created right after saving the product template. Solution: The constraint should only be triggered when saving the intrastat code on a product template with dynamic attributes and no variants. Since dynamic attributes are the only ones that can lead to a product template with no variants, we can check if the product template has dynamic attributes and no variants before raising the error.