Daily updates from Odoo
Monday, June 1, 2026
29 changes · master
New functionality added to Odoo
This update introduces a new module, `obox_pos`, to seamlessly integrate Obox connected scales into the Point of Sale (PoS) system. This allows for accurate weight-based product tracking and order processing within Obox, improving operational efficiency and data accuracy.
Original PR description
We add a new `obox_pos` module to integrate Obox connected scales to PoS.
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
This update adds a new report, MUHSGK V2 (1003B), required for Turkish clients to submit monthly payroll data to the SGK and GİB authorities. This ensures compliance with Turkish regulations regarding withheld taxes and social insurance contributions, streamlining reporting processes.
Original PR description
On a monthly basis, all clients in Turkey are obligated to submit reports to the social insurance entity (SGK) and the revenue authority (GİB). The reports include details about the employee, employer, and amounts deducted from the employee's salary to be submitted to the authorities. The main report for this task is the MUHSGK V2 (1003B), which is a combined report for both withheld taxes from employees' salaries and withheld amounts for social insurance. task-id: 4966571
Enhancements to existing features
This update ensures that the helpdesk team automatically receives notifications when a new support ticket is created from a CRM lead. This improves team awareness and responsiveness to customer inquiries, streamlining the support process. It addresses a previous gap in notification workflows.
Original PR description
- Ensure that users added as followers of the helpdesk team receive notifications when a ticket is created from a CRM lead. task-4500059
This update enhances the appraisal survey experience by automatically displaying the employee's name (Appraisal Display Name) after the survey title when the survey is linked to an appraisal bridge. This makes the survey more personalized and provides better context for the employee providing feedback, leading to more relevant responses.
Original PR description
Display the Appraisal Display Name after the survey title when the survey is linked to an appraisal bridge, making the survey less generic and more contextual. Task-5972109
This update enhances the appearance of exported audit reports by applying the company's branding, including fonts, colors, and layout. Users now have more control over PDF dimensions and orientation, ensuring reports consistently reflect the company's visual standards.
Original PR description
When exporting an audit report to PDF, the system will now apply the margins, spacing, fonts, color theme, defined in the company's document layout. Users can also configure the PDF's dimensions (i.e: A4, etc) and orientation. This update makes the exported PDF fully customizable while ensuring it aligns with the company's branding and formatting standards. Technical note: This commit refactors the audit report XML templates to use the standard report assets. This reduces the number of generated asset bundles and ensures consistent styling. COM: odoo/odoo#241292 Task-5079740
This update adds specialized cost calculations within Odoo's payroll system for Belgium, specifically addressing the requirements for termination fees related to social security contributions. It incorporates detailed rules based on Belgian regulations, ensuring accurate accounting and reporting for employee departures. This improves compliance and financial reporting accuracy for businesses operating in Belgium.
Original PR description
task-5102928
This update enhances the performance and stability of Odoo's HTML editor by streamlining how it handles changes to the content. The changes, introduced by a community contribution, optimize the editor's responsiveness and reduce potential errors, particularly within various modules like AI, Documents, and Knowledge. This results in a smoother and more reliable editing experience for users.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/246336
This update enhances the Thailand withholding tax reports to provide more detailed and accurate information, aligning with PND 3 and PND 53 form requirements. Previously, the reports only showed total amounts; now, they group data by partner and tax type. Additionally, the CSV export format has been corrected to prevent data errors, ensuring reliable reporting.
Original PR description
Thailand withholding tax report only displayed the total withholding tax amount instead of showing extensive information required on PND 3 and PND 53 forms. This commit improves the tax reports by…
Thailand withholding tax report only displayed the total withholding tax amount instead of showing extensive information required on PND 3 and PND 53 forms. This commit improves the tax reports by grouping withholding tax values into partners and the withholding tax type. This change improves the report to display more comprehensive data for the users. Furthermore, previously the PND 3 & 53 report CSV export had hardcoded value on certain columns because the corresponding fields did not exist in Odoo. Now that we have fields required to properly build the CSV export, this commit updates the export logic to generate accurate values for the fields: - Partner title/company types are no longer hardcoded to "บริษัท". The value refers to the new fields in res.partner. - The withholding tax condition is no longer hardcoded to "1". The value is determined by the selection field value set on the related payment. - The tax type no longer depends on the withholding tax's amount value. The value is based on the selection field of the tax. Additionally, the CSV export delimeter is updated from "," to "|" to prevent data corruption caused by commas often found in the address values. [Task-5423108](https://www.odoo.com/odoo/project.task/5423108)
This update adjusts the sale module to allow orders to be shipped even if the stock isn't immediately available. The method name was changed from 'deliver' to 'ship' to better reflect this new functionality. This change streamlines the order fulfillment process.
Original PR description
**Purpose:** Reflect the changes made in sale module **Specification:** Renamed method _compute_show_deliver_button to _compute_show_ship_button Task-5343527 See also: - https://github.com/odoo/odoo/pull/240746 - https://github.com/odoo/upgrade/pull/10170
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
Resolved issues and error corrections
This update corrects a bug where importing a product with a changed subscription type would bypass a necessary warning. Now, when a product has been sold, attempting to manually change its subscription type triggers a warning, ensuring data integrity and preventing unintended subscription modifications.
Original PR description
__ ## Short functional explanation of the error When we have a subscription product that has already been sold. If we try to import a product with the same ID but where we change the subscription…
__ ## Short functional explanation of the error When we have a subscription product that has already been sold. If we try to import a product with the same ID but where we change the subscription type of the product, the import is executed without issue. However, this leads to undesired behavior: when we go to the product page and try to manually change the subscription type (set it back to subscription), the change is not applied as a warning is raised. ## Reproduction Steps Make sure you have debug mode enabled. 1. Create a product, and check the Subscription box. 2. Click on Orders and create a Quotation with this product, then confirm. 3. Go to Products > Products. Select the list view and search for the product you just created. Select it, and click Actions > Export. 4. Check the import compatible field. Select the fields to export: name, id and recurring_invoice. Upon exporting, a file is downloaded. 5. Access that file and change the recurring_invoice to FAUX or FALSE if your computer is in English. Save the changes. 6. Unselect the product and click on the cog, top right > Import. Click on Upload Data File and select the file that you have downloaded upon exporting, then import. ### Expected behavior A user warning is raised: we shouldn't be able to change the subscription type of the product when it has already been sold. ### Unexpected behavior The import is processed normally. Then, when we access the product page, and try to check the Subscriptions box again, a warning is raised. ## Origin of the issue Nothing prevents the import from occurring in that case. __ opw-6143789 Forward-Port-Of: odoo/enterprise#117318 Forward-Port-Of: odoo/enterprise#115046
This update optimizes a key query used in financial reporting by correcting how the database searches for reconciliation models. By fixing a wildcard issue, the query now utilizes the database's index more effectively, resulting in significantly faster performance. This change improves the speed of financial reports and reduces processing times.
Original PR description
The CTE `model_fees` is supposed to get the reconciliation models that match conditions that involves a join with the ir.model.data table. One of these conditions is filtering based on the `name`…
The CTE `model_fees` is supposed to get the reconciliation models that match conditions that involves a join with the ir.model.data table. One of these conditions is filtering based on the `name` field with an `LIKE` operator. On databases that has a GIST index on the field `name`, the planner will prefer to filter the records based using the GIST index and add the extra filters as a filtering criteria after the index condition if the index-condition wasn't possible to be switched to a range-query. The condition is supposed to be a prefix-matching, which can be evaluated directly by a B-TREE if the field had an index and the planner can convert the condition to a range-query. Apparently the `_` in `account_reco_models_fees_%%` was evaluated as a wild-card, making the condition a substring-matching rather than direct prefix-matching. In this PR, I have modified the condition to escape the '_' wildcards. The benchmark done below was on a database that has around **10^7** `ir.model.data` records and 1K `account.reconciliation.model` records. I have split the benchmark into two cases, a case where the buffer-pool of postgres warmed-up and a case where it is not. After Worst case -> https://explain.dalibo.com/plan/975geg1f1h109d5c Before Worst case -> https://explain.dalibo.com/plan/0ce9bf3g0ad8f98b After Best Case -> https://explain.dalibo.com/plan/1a77459dadb0gfc4 Definition of ir_model_data_name_idx2 -> CREATE INDEX ir_model_data_name_idx2 ON public.ir_model_data USING gist (name gist_trgm_ops) Definition of ir_model_data_module_name_uniq_index -> CREATE UNIQUE INDEX ir_model_data_module_name_uniq_index ON public.ir_model_data USING btree (module, name) | PostgreSQL Buffer Pool Status | Before | After | | :--- | :--- | :--- | | Not warmed up (Cold) | 11s | 130ms | | Warmed up (Hot) | 0.022ms | 0.097ms | Forward-Port-Of: odoo/enterprise#117746
This update optimizes the styling of account reports, specifically targeting performance issues related to large tables. By using CSS variables and simplifying selectors, the changes reduce unnecessary DOM calculations, resulting in smoother and faster report rendering, especially for complex reports.
Original PR description
Forward-Port-Of: odoo/enterprise#118741 Forward-Port-Of: odoo/enterprise#118490
This update fixes an issue where the 'next' and 'previous' arrows in the planning calendar view didn't retain the previously selected task's context. Now, when navigating the calendar, the new slot will automatically default to the same task, ensuring a consistent and intuitive scheduling experience. This improves usability and reduces the chance of users accidentally starting new tasks in the wrong context.
Original PR description
Issue: ---------------------------------------- The default values aren't kept when using the previous/next arrows in planning calendar view. Steps to reproduce:…
Issue: ---------------------------------------- The default values aren't kept when using the previous/next arrows in planning calendar view. Steps to reproduce: ---------------------------------------- - Go on a Project task - Click the "To Schedule" button - Switch to calendar view - If we create now, the new slot will have the task as default value - Click the arrow to switch to next week - If we create there will be no default values Cause: ---------------------------------------- Since 7b844902e5c3a7aeedda6cc2be61366caad2d144 the context is lost when using the arrows. When switching to calendar view `load()` is called with the context in the params: https://github.com/odoo/odoo/blob/786c373d5ac8afdfb79eb7a7d69c5eb83b919625/addons/web/static/src/model/model.js#L163-L164 But when using the arrows, it is called with only a date: https://github.com/odoo/odoo/blob/786c373d5ac8afdfb79eb7a7d69c5eb83b919625/addons/web/static/src/views/calendar/calendar_controller.js#L426 So `...params.context,` is empty, and the context is only `hide_planned_dates: true,`. Solution: ---------------------------------------- If no context is specified in params, we use the one in `this.meta` to allow changing the context by giving it in the params but keeping the previous context when it's not given. opw-6211055 Forward-Port-Of: odoo/enterprise#118527
This update resolves an issue where product prices didn't automatically update when the cost price was modified. Previously, users had to manually switch price lists to trigger the price update. Now, the system correctly updates the 'On Sale Price' whenever the cost price changes, ensuring accurate pricing calculations.
Original PR description
When we create a product variant and have a pricelist which is based on the cost price, and change the cost price, the on_sale_price doesn't update. You have the change the price list to other and…
When we create a product variant and have a pricelist which is based on the cost price, and change the cost price, the on_sale_price doesn't update. You have the change the price list to other and back to the one you want for it to trigger change because the _onchange_compute_pricing only gets triggered if there's change on pricelist (pricer_sale_pricelist_id), and sales price (lst_price). Steps to Reproduce: 1.Create a pricelist and add a line with "formula" price type, and based on "cost", 2.Create a product variant, and add the pricelist just created. 3.Change the "Cost". The "On Sale Price" doesn't update. 4.You have to change the price list to some other and back to the one you want for the "On Sale Price" to update. To fix the issue, we add the field Cost (standard_price) on api.onchange, so when we change the cost it'll update the "On Sale Price" right away. opw-5947995 Forward-Port-Of: odoo/enterprise#118584 Forward-Port-Of: odoo/enterprise#111892
This update resolves an issue where changing 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' start dates adjust dynamically when a main task's deadline is modified, improving project scheduling accuracy. This impacts project managers and team members relying on the Gantt chart for task synchronization.
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 ensures Odoo's Czech VAT reports accurately comply with the Czech tax authority's hybrid rounding rules. Previously, the system didn't correctly handle the required rounding of tax bases and VAT amounts. This change directly updates report expressions to ensure accurate VAT return calculations and avoid potential discrepancies.
Original PR description
The Czech tax authority enforces specific hybrid rounding rules for the VAT Return: - Tax bases and subtotals must use standard mathematical rounding. - VAT Due / Tax Amounts must be rounded UP to the nearest whole CZK. - Calculated totals must be the exact sum of the previously rounded lines. Currently, the report generation does not support this mixed rounding behavior out of the box. This commit resolves the issue by updating the report expressions directly in the XML to comply with the legal requirements thus removing the need to have the float_round method in the tax_report_handler. task: 6081523
This update resolves an issue preventing users from unreconciling SEPA CT batch payments with a 'pending' online status. Previously, the system incorrectly blocked this process, causing delays in bank statement reconciliation. The fix allows internal unreconciliation flows to bypass validation, ensuring accurate bank statement updates.
Original PR description
**Issue:** The account_online_payment module overrides `action_draft` to raise a UserError for sepa_ct payments belonging to a batch with a `payment_online_status` = 'pending' or 'accepted'. This…
**Issue:** The account_online_payment module overrides `action_draft` to raise a UserError for sepa_ct payments belonging to a batch with a `payment_online_status` = 'pending' or 'accepted'. This blocks the bank statement unreconciliation process. When `delete_reconciled_line` is called, it tries to set payments to draft and re-post them, despite it being an internal process not a manual user modification. **Steps to reproduce:** - Setup a 'sepa_ct' payment method on a bank journal. - Create a bill with a vendor with a trusted bank account. - Create a payment for that bill with a 'sepa_ct' payment method. - Add the payment to a batch. - Manually set the `payment_online_status` = 'pending'. - Create a bank transaction and reconcile it with the batch. - Try to unreconcile the lines on the transaction - Result: UserError 'You cannot modify a payment that has already been sent to the bank.' **Fix:** Pass a context flag to `action_draft` during the unreconciliation flow so that the validation is skipped when the call originates from the internal unreconcile flow. OPW-6080464 Forward-Port-Of: odoo/enterprise#118649 Forward-Port-Of: odoo/enterprise#117921
This update resolves an issue where Odoo was incorrectly generating CFDI invoices in Mexico, leading to export rejections. The fix ensures that cash rounding lines, which are not valid CFDI concepts, are excluded from the invoice XML, aligning with SAT regulations. This prevents errors and ensures compliant invoice generation.
Original PR description
When using the 'add_invoice_line' cash rounding strategy, Odoo adds a journal line with display_type='rounding'. This line has no product and therefore no ClaveProdServ, causing PAC to reject the XML with error 301. Per SAT regulations, cash rounding is not a valid CFDI concept. The CFDI must report the pre-rounding amounts (e.g. 99.80); the rounding difference (e.g. 0.20) belongs only in the journal entry on the accounting side. opw-6024078 Forward-Port-Of: odoo/enterprise#117400 Forward-Port-Of: odoo/enterprise#112633
This update resolves an issue where appointment scheduling displayed 'no slots available' when appointments started in a future month. The fix ensures that the calendar correctly reflects all available months, regardless of when the appointment's booking range begins. This improves the user experience for scheduling appointments with future start dates.
Original PR description
The "show only 1 month at a time" optimization computes the navigated month as datetime.now() + month_id, so the controller passes that (month, year) tuple to _get_appointment_slots:…
The "show only 1 month at a time" optimization computes the navigated month as datetime.now() + month_id, so the controller passes that (month, year) tuple to _get_appointment_slots: https://github.com/odoo/enterprise/blob/57ec37b74a60c7e879a8afa66df5ab22a92c5bcd/appointment/models/appointment_type.py#L833 For a punctual appointment whose Allow Bookings range starts in a future month, the first displayed month is start_datetime.month, so the (month, year) tuple doesn't match the month the visitor is looking at. The model fills an empty month and the recovery loop refills the first displayed month (where slots actually live): https://github.com/odoo/enterprise/blob/57ec37b74a60c7e879a8afa66df5ab22a92c5bcd/appointment/models/appointment_type.py#L973-L988 The calendar the visitor just navigated to comes back empty. Compute the navigation base from start_datetime when it lies in the future and keep datetime.now() otherwise. month_id is added on top of that base so it always matches the displayed month index. Introduced by https://github.com/odoo/enterprise/commit/664857dd2c4ae2bc0dde8f44cb94136659ed2fe2 Steps to reproduce: 1. Open the Appointments app 2. Open an appointment type and set Schedule to Weekly and Allow Bookings to On specific dates with a range starting in a future month (for example 1 September to 31 December) 3. Save and click the Preview button in the header 4. Pick a staff member to reach the calendar 5. Click the right arrow to navigate to the next month => the next month shows "Sorry, we have no more slots available for this month" opw-6206293 Forward-Port-Of: odoo/enterprise#117283
This update resolves an issue where the IP salary rule wasn't correctly displayed on Belgian employee payslips. The underlying calculation has been adjusted to ensure accurate reporting of IP contributions, improving payroll accuracy and compliance for our Belgian clients.
Original PR description
-**Issue**: The IP salary rule was not visible on payslip. -**Fix**: Computation has been adjusted to include the correct field. Forward-Port-Of: odoo/enterprise#112711 Forward-Port-Of: odoo/enterprise#110936
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
Code cleanup and technical improvements
This update replaces older reactive calls with more efficient proxy calls, a key change introduced with the Owl3 upgrade. This refactoring enhances performance and contributes to overall system stability across several core Odoo modules. The changes impact modules like Account, Documents, Knowledge, and Website, ensuring a smoother user experience.
Original PR description
With Owl3, uses of `reactive` with only one arg can be changed to `proxy` calls. This commit changes all those uses. *: account_batch_payment,documents,knowledge, pos_order_tracking_display,sale_account_accountant,timesheet_grid, voip,web_enterprise,web_studio,website_knowledge,
This update streamlines how key performance indicators (KPIs) are calculated within Odoo. By directly computing summaries using SQL, the system now responds faster and more efficiently, especially when generating reports. This change enhances the overall user experience and reporting speed.
Original PR description
Refactor KPI providers to compute summaries directly in SQL. This makes KPI computation callable from the /kpi/summary controller, which can call them without loading a registry. Task-id: [5167731](https://www.odoo.com/odoo/project.task/5167731) Forward-Port-Of: odoo/enterprise#118901 Forward-Port-Of: odoo/enterprise#113422