Daily updates from Odoo
Monday, February 9, 2026
51 changes
19 changes
Resolved issues and error corrections
This update resolves an error that occurred when generating Time Off reports for French and Indian companies. The issue stemmed from a mismatch in how a reporting parameter was handled, causing a technical error. This fix ensures accurate time off reporting functionality for both locales.
Original PR description
Currently, an error occurs when user opens Time Off per Employee Analysis. **Steps to Reproduce:** - Install `l10n_fr_hr_holidays` with demo data. - Switch to a `French company`. - Create a time off…
Currently, an error occurs when user opens Time Off per Employee Analysis. **Steps to Reproduce:** - Install `l10n_fr_hr_holidays` with demo data. - Switch to a `French company`. - Create a time off for any employee (if none exists). - Go to `Time Off` > `Reporting` > `By Employee`. `TypeError: HrLeave._get_durations() got an unexpected keyword argument 'additional_domain'` After [this commit], _get_durations accepts an additional_domain parameter. However, this parameter is not defined in the _get_durations method in the French and Indian localizations. When a user opens Time Off by Employee in the French or Indian localization, the compute method is executed to calculate leave durations, and additional_domain is passed as an argument [1], which raises the error [2] [3]. This commit adds the additional_domain parameter to the Indian and French localizations. In the French localization, it also passes check_leave_type, as its value is passed internally within the method [4]. [this commit]: https://github.com/odoo/odoo/commit/1c3f5633ef87f6d9c5a6169eefd51cd42ef442d5#diff-38469def2f870bb866f971f57797dd7c21b6a95d52a8eae72f832f0eea2434f9R575 [1]- https://github.com/odoo/odoo/blob/8db5a8cf07fa9c2b677b061b5897f757cb1f7260/addons/hr_holidays/report/hr_leave_employee_report.py#L94 [2]: https://github.com/odoo/odoo/blob/80e29d864b3e54ea68d2731da4c0f2f917f5d56a/addons/l10n_in_hr_holidays/models/hr_leave.py#L218 [3]: https://github.com/odoo/odoo/blob/80e29d864b3e54ea68d2731da4c0f2f917f5d56a/addons/l10n_fr_hr_holidays/models/hr_leave.py#L112 [4]: https://github.com/odoo/odoo/blob/9d4103c061c5fbe9913fa721ea3e6d417bc89e93/addons/hr_holidays/models/hr_leave.py#L531 sentry-7213025295 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Gantt progress bar now displays the correct operation duration after switching workcenters. Previously, the duration remained inaccurate when changing workcenters, due to a bug in how the system calculated the finished date. This update corrects this calculation to ensure accurate progress visualization.
Original PR description
**Issue** Changing the workcenter of a workorder to another with a different time efficiency does not correctly update `date_finished`, causing the Gantt progress bar to show an incorrect expected…
**Issue** Changing the workcenter of a workorder to another with a different time efficiency does not correctly update `date_finished`, causing the Gantt progress bar to show an incorrect expected duration. **Steps to reproduce** 1. Create two workcenters marked as alternatives (100% and 50% efficiency). 2. Create a BOM operation that produces 100 products with a 1h expected duration each, on the 100% workcenter. 3. Create and plan an MO using this BOM. 4. In Planning > Planning by Workcenter (Gantt), drag the workorder to the 50% efficiency workcenter. → Expected duration remains 100h instead of 200h. 5. Drag the same workorder back to the 100% workcenter. → Expected duration becomes 200h instead of 100h. **Cause** `date_finished` is recomputed in `write()` using the *previous* workcenter’s efficiency, because the duration calculation happens before the new `workcenter_id` is applied: https://github.com/odoo/odoo/blob/18.0/addons/mrp/models/mrp_workorder.py#L471 Since the Gantt progress bar uses the interval [`[date_start, date_finished]`](https://github.com/odoo/enterprise/blob/18.0/mrp_workorder/models/mrp_workorder.py#L672C13-L674C107) to compute the expected duration (via `_web_gantt_progress_bar_workcenter_id`), the displayed duration becomes wrong. opw-5224272 Forward-Port-Of: odoo/odoo#245236 Forward-Port-Of: odoo/odoo#239021
This update resolves an issue where stock account postings were failing for a second company in a test environment. The fix ensures the correct company's account information is used during processing, guaranteeing accurate stock valuation postings across all companies. This improves data reliability and prevents disruptions to financial reporting.
Original PR description
Prior to this PR: In my test setup, there are 2 companies. The cron '_cron_post_stock_valuation()'is manually triggered while the user is in Company 1. Processing for Company 1 works correctly. When the loop reaches Company 2, the process crashes as the account fetched is the one from self.env.company which is the wrong company. After this PR: The correct company is being used to fetch the accounts. therefore everything is posted correctly. OPW - 5447337 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247408
This change reverts a recent update that prevented public holidays from being correctly applied to work schedules without a company assigned. Previously, the system incorrectly ignored public holidays when a schedule lacked a company. This fix ensures public holidays are properly reflected in time off requests and schedules.
Original PR description
Revert of https://github.com/odoo/odoo/commit/a95af8b78a94a795e05a0adf299837adc0ef2117 and https://github.com/odoo/odoo/commit/f4f9ecb3e4801b3d382abc24c478fe5e533c9bf8 **Steps to reproduce** 1.…
Revert of https://github.com/odoo/odoo/commit/a95af8b78a94a795e05a0adf299837adc0ef2117 and
https://github.com/odoo/odoo/commit/f4f9ecb3e4801b3d382abc24c478fe5e533c9bf8
**Steps to reproduce**
1. Remove the company of the Working Schedule (needs to be done in
a multi-company environment from the UI) used by an employee.
2. Using the company of this employee, create a Public Holiday
(for the employee's schedule or all schedules).
Issues:
- the public holiday doesn't appear in the Time Off dashboard
- when taking a time off on that day, the public holiday is
included in the duration
**Cause**
After the fix in https://github.com/odoo/odoo/commit/a95af8b78a94a795e05a0adf299837adc0ef2117 , it will lead
to a search domain for public holidays of `('company_id', 'in', [False])`
when the working schedule has no company, ignoring any public
holidays with a company set. This is especially problematic since the
company of the public holiday is always forced.
https://github.com/odoo/odoo/blob/7bce5f3f95429a4d4ba034a66c350ee2a5868567/addons/resource/models/resource_calendar_leaves.py#L49-L51
**Solution**
Since the intent of the original fix https://github.com/odoo/odoo/commit/f4f9ecb3e4801b3d382abc24c478fe5e533c9bf8
was to correct an issue related to the computation of some `project.task`
fields calling a resource method (`get_work_duration_data`), we can revert
the fix and later fix the original issue directly in `project`, without
impacting `hr`/`resource` modules.
opw-5496999
opw-5401425
Forward-Port-Of: odoo/odoo#247139
Forward-Port-Of: odoo/odoo#244052This update resolves a problem where Safari browsers, particularly when used in collaboration mode, would display incorrect HTML editor content. The fix ensures the HTML editor accurately reflects changes made by users, regardless of the browser used (Chrome or Safari). This improves the consistency and reliability of the HTML editor for all users.
Original PR description
Before this commit: safari returns invalid document in collaboration, typically when a chrome user is sending history steps with undo. Reproduction steps: 1. In chrome, use an existing task with…
Before this commit: safari returns invalid document in collaboration, typically when a chrome user is sending history steps with undo. Reproduction steps: 1. In chrome, use an existing task with empty description or create a task in the project (first create the task title in the kanban view, then click edit), enter 4 lines of text 2. In one of the middle lines, delete one character --> undo --> add a new character 3. Save the task, open the task in Safari incognito, log in as demo (not admin), go to the task and click the description field 4. TraceBack: IndexSizeError: The index is not in the allowed range. After this commit: we use the range of the DOM selection to set the offsets of activeSelection. If the DOM selection is too wrong to be corrected, e.g. the selection's anchor node isn't the same with range's start container (or end container if direction is right to left), we do not set new activeSelection but just return the previous activeSelection task-5428788 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247484 Forward-Port-Of: odoo/odoo#246056
This update fixes an error that occurred during upgrades of Odoo 18, specifically when upgrading from version 17. The issue stemmed from a missing requirement for production locations in warehouses, which was addressed by incorporating a solution from the MRP module. This ensures smoother upgrades and prevents disruptions to stock management.
Original PR description
The warehouses need at least a Production location[^2] to avoid triggering an error, but they are not considered a missing location. The function is borrowed from the `mrp` module[^mrp]. This error was found during upgrades. To reproduce: - In 17, install repair and don't install mrp. - Archive the production locations. - Upgrade to 18. - It will trigger an error[^1] while upgrading stock. [^1]:https://github.com/odoo/upgrade/blob/b46cf7ea8770c5d428ea3d569148eb76d16903b9/migrations/stock/saas~17.3.1.1/end-migrate.py#L16 [^2]:https://github.com/odoo/odoo/blob/ab3c2d52bcaee516eae319ccd20088eb48c819f1/addons/repair/models/stock_warehouse.py#L67 [^mrp]:https://github.com/odoo/odoo/blob/ab3c2d52bcaee516eae319ccd20088eb48c819f1/addons/mrp/models/stock_warehouse.py#L278-L283 Forward-Port-Of: odoo/odoo#245805
This update resolves an issue where the height of image gallery snippets would unexpectedly reset when images were reordered. The fix ensures users can set and maintain custom heights for gallery snippets, providing consistent control over their appearance. Additionally, minor template issues were addressed.
Original PR description
Steps to reproduce Scenario A 1. Go to Website → drop an Image Gallery snippet → A default height value appears in the `"Height"` input. 2. Select an image → change its order in the carousel → The…
Steps to reproduce Scenario A 1. Go to Website → drop an Image Gallery snippet → A default height value appears in the `"Height"` input. 2. Select an image → change its order in the carousel → The snippet height is automatically reset to `70%` of the screen height. Scenario B 1. Change the height value of the snippet from the `"Height"` option. 2. Select an image → change its order in the carousel → The snippet height is again reset (and the option value is overridden). Issue The original height behavior was introduced in [1] to make the slideshow mode auto-adapt to `70%` of the viewport height. This diff also removed height CSS for other modes where the height should depend on the content [2] Subsequent adaptations: [3] added a default height (`500px`) in XML, [4] removed it during a design refactoring, [5] restored the possibility to control the height of the image gallery snippet using the `"Height"` option. Keeping the same JS logic that forces the snippet height, led to the behavior explained above: even when the user manually sets a height, any action triggering `slideshow()` (e.g., image reorder) forces the height back to 70% of `window.innerHeight`. Fix 1. Remove the outdated JS code that automatically updates the height. 2. Keep the slideshow behavior consistent with [2] by excluding it from the height CSS removal logic. The snippet now starts with a default height and only changes when edited through the `"Height"` input. Additional fixes This commit also fixes a few minor issues in the new carousel items template introduced in [4]: items having an `"undefined"` class, and a missing margin style in the main snippet template. [1]: https://github.com/odoo/odoo/commit/239b6bc0b5a2a644486737f2b0b71e7e6c0a2edf [3]: https://github.com/odoo/odoo/commit/9069d0127c176317436b67b23ae5677dd9d53de7 [4]: https://github.com/odoo/odoo/commit/9042b1cae7b630b20e0670788b7a4ed9e4c97609 [5]: https://github.com/odoo/odoo/commit/d5d138e833344e857a420d865d4b12f1acdb0e7c task-3414281 Forward-Port-Of: odoo/odoo#243914 Forward-Port-Of: odoo/odoo#126766
This update resolves an issue where reducing order quantities incorrectly triggered additional picking operations when using multi-step delivery routes for kits. The fix ensures accurate quantity calculations during order fulfillment, preventing unnecessary stock movements and improving order processing efficiency. This impacts users utilizing the multi-step delivery feature.
Original PR description
### Steps to reproduce: 1. In the settings enable: Multi-steps route 2. Put your warehouse in 2-step deliveries 3. Create a kit product: - With one component - There is one component in the stock 4.…
### Steps to reproduce: 1. In the settings enable: Multi-steps route 2. Put your warehouse in 2-step deliveries 3. Create a kit product: - With one component - There is one component in the stock 4. Create and confirm a SO with 1 x K 5. Process the pick and ship 6. Return the delivery 7. Set the sol qty to 0 #### > Two unexpected pickings are created to put the kit in output ### Cause of the issue: Decreasing the sol quantity to 0 will call the `_action_launch_stock_rule` in order to create and run procurements related to that quantity change. However, the quantity currently handled by other procurements is determined here by the `_compute_kit_quantities`: https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/sale_stock/models/sale_order_line.py#L388 https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/sale_mrp/models/sale_order_line.py#L154-L166 https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/mrp/models/stock_move.py#L578-L580 Now, the issue is that `_compute_kit_quantities` does not handle move chains properly, as all delivery moves contribute to the `incoming_qty` and all return moves contribute to the `outgoing_qty`. This results in an `incoming_qty` of 1 (for the pick) + 1 (for the ship) and an `outgoing_qty` of 1 (for the 1-step return), that is a `qty_processed` of 1. As a result, the procurement will be generated for a quantity of `0 - 1` (rather than 0): https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/sale_stock/models/sale_order_line.py#L388-L402 which leads to the unexpected picking creations. opw-5432558 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246141
This update resolves an issue where hourly accrual plans were incorrectly ignoring attendances that spanned multiple days. The fix adjusts how attendances are calculated within the accrual plan, ensuring that all worked hours are accurately accounted for, regardless of overlapping times. This improves the accuracy of time-off accruals.
Original PR description
### Issue: Attendances overlapping on two days are ignored for hourly accrual plans based on attendances. ### Steps to reproduce: - Install 'hr_holidays_attendance' - In Time Off > Configuration >…
### Issue: Attendances overlapping on two days are ignored for hourly accrual plans based on attendances. ### Steps to reproduce: - Install 'hr_holidays_attendance' - In Time Off > Configuration > Accrual Plan, create a new plan - Based on worked time - Hourly rule - Attendances as Source - In Management > Allocations, create an allocation for an employee using the new accrual plan - Create an Attendance for this employee in the period of the Accrual Plan - Check-in at 22pm for example - Check-out at 7am - Run the cron "Accrual Time Off: Updates the number of time off" - The Allocation ignores the worked time from the attendance ### Cause: `_get_accrual_plan_level_work_entry_prorata()` is called on each day of the accrual period. So `start_dt` is `datetime.datetime(2026, 1, 2, 0, 0)` and `end_dt` is `datetime.datetime(2026, 1, 3, 0, 0)` for example. This means that the search will always excludes attendances overlapping on two days. https://github.com/odoo/odoo/blob/26f3026ed45cc409cd7f67fa219d44f1adbac9b7/addons/hr_holidays_attendance/models/hr_leave_allocation.py#L79-L83 ### Solution: To count the attendances on several days, we need to split these attendances by day because `_get_accrual_plan_level_work_entry_prorata()` is only called with an interval of one day from midnight to midnight. First we get all attendances overlapping with the day by changing the domain in the search. Then we could simply take the difference between `max(attendance.check_in, start_dt)` and `min(attendance.check_out, end_dt)` but we also need to remove the lunch breaks (they were not counted in `attendance.worked_hours`). This would mean duplicating the code present in `_compute_worked_hours()`. To avoid this we create a new method for `hr.attendance` named `_get_worked_hours_in_range()`. That returns the number of hours worked due to this attendance in a given time frame. This new method can be used in both cases to get the needed value. opw-5172669 Forward-Port-Of: odoo/odoo#247472 Forward-Port-Of: odoo/odoo#246270
This update fixes inconsistencies in how stock valuation is calculated during purchase invoices. The changes streamline the process, ensuring accurate currency reconciliation and aligning with recent Odoo updates. It improves the reliability of purchase order valuation calculations.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245551
This update resolves an issue where self-order kiosks would freeze if a terminal sent a 'cancel' signal. Now, the system treats this 'cancel' event as an error, allowing users to restart their transaction and ensuring a smoother user experience. This prevents kiosk downtime and improves order completion rates.
Original PR description
If the transaction isn't handled after some time, the terminal itself sends a cancelation event. As the kiosk doesn't handle cancelations, it results in the user being stuck with "Follow instructions on the terminal", but the terminal not processing any transaction anymore. We now treat the "cancel" event as an error to allow the user restart the transaction. Forward-Port-Of: odoo/enterprise#106731
This update resolves an issue that prevented users from creating new payslip runs within the Hong Kong payroll module. The problem stemmed from an incorrect value being passed to the system, triggering an error. The fix ensures a proper list is always provided, allowing users to successfully generate payslips.
Original PR description
Currently an error occurs when user tries to create a new payslip run.
Steps to replicate:
- Install `l10n_hk_hr_payroll_empf` with demo and switch to Hong Kong company.
- Go to Payroll > Payslips > Pay Runs > Click New > Continue.
Error:
```
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/models.py", line 5202, in browse
assert all(ids) or all(isinstance(x, NewId) or x for x in ids), "Invalid falsy real id"
AssertionError: Invalid falsy real id
```
Cause:
- While making the orm call the [resId] was being passed as False, that further calls the browse and caused the error to occur.
Solution:
- Passed an empty list instead of passing a falsy ID to the ORM call.
[resId]: https://github.com/odoo/enterprise/blob/55a71ba4d0c2f3e4478d47c7edb442009f4fc1c4/l10n_hk_hr_payroll_empf/static/src/views/payslip_run_form/hr_payslip_run_form.js#L12
sentry-7207509338This update resolves an issue where journal items displayed in general ledger reports were incorrectly linked to account groups. The fix addresses a technical problem caused by a change in Odoo's data structure, ensuring accurate reporting of financial data. This prevents errors and ensures users see the correct financial information.
Original PR description
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR…
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR [1]. - Install `Accounting (accountant)` with demo data - Create account groups e.g., name as `Test 1` and code prefix `1 to 1` - Go to the general ledger report - Click on `Journal Items` of the account group line `1 Test 1` Error from saas-18.3: `ValueError: Cannot convert account.account.group_id to SQL because it is ...` This error occurs because PR with ref [1] in 17.0 added the` group_id` field of the `account.account` model to the search domain. However, in 18.0, commit [2] modified this field so that it is no longer stored. As a result, when a search domain includes this `non-stored` field, Odoo skips the domain evaluation and logs a error at code line [3]. Consequently, the changes introduced by commit [1] have no functional effect from 18.0. Also, starting from saas-18.3, passing such a non-stored field in a domain raises an explicit error at code line [4], instead of being silently ignored. This commit resolves the issue by introducing an SQL query that returns the account ids related to `record_id(account group id)` include `record_id` as `None`. [1]: https://github.com/odoo/enterprise/pull/100191 [2]: https://github.com/odoo/odoo/commit/854c3b27aa5476c208572f19e64f8f3364bfc381#diff-19ef5a530c506fdee93fe0d113e61946b87fae7dd2d360558da69c0014f766b2R114-R767 [3]: https://github.com/odoo/odoo/blob/71e86f38c7699aaea980c929c67835a3495edf55/odoo/osv/expression.py#L1166-L1174 [4]: https://github.com/odoo/odoo/blob/00517e9e085c6fa9e00bedb8aee122a60e407fea/odoo/orm/fields.py#L1201 sentry-7100657414 Forward-Port-Of: odoo/enterprise#103137
This update resolves an error in the calculation of payslips for employees on secondary contracts in Kenya. The fix replaces a missing variable with the total taxable gross, ensuring accurate payroll processing and compliance with Kenyan tax regulations. This improves the reliability of payroll for Kenyan businesses using Odoo Enterprise.
Original PR description
Steps to reproduce: With a Kenyan company, create an employee. Check the "Secondary Contract" on the employee form view. Create a payslip and compute. There is an error in the payslip computation. Cause: There is an undefined variable "remaining_gross". Fix: Replace it by the total taxable gross. Task: 5462310 Forward-Port-Of: odoo/enterprise#106055 Forward-Port-Of: odoo/enterprise#103229
This fix resolves an issue where Modelo 390 reports for past years were generating empty BOE files. The problem stemmed from incorrect data retrieval based on the report period, which was corrected to accurately reflect the specified year. This ensures accurate tax reporting for Spanish companies.
Original PR description
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report`…
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report` options However, `section_reports` do not store the date or return periodicity of the selected report As a result, using their options always fetched data for the current period instead of the specified year ### Note: `_generate_mod_390_page2()` also had issues: some lines were missing or incorrectly indexed The mod 360 format, it strict in the structure with specific index so it may produce invalid documents The latest documentation for mod 390: https://sede.agenciatributaria.gob.es/static_files/Sede/Disenyo_registro/DR_300_399/archivos_25/dr390e2025.xlsx ### Steps to reproduce: - Install `l10n_es_reports` and switch to ES Company - Create an Invoice and a Bill (Any product, Price: 100.00, Tax: 21%, Invoice Date: 01/01/2025) - Open Tax Return, switch to Mod 390, and set year to 2025 - You should see data in the 2 first sections - Use the gear icon, and download the BOE - Use the gear icon to download the BOE, fill the wizard (Natural Person – Name: Test, Principal activity: Test, Activity Code: 12345), and generate the file Before the fix: all values in the BOE were 0 instead of matching the report opw-5457374 Forward-Port-Of: odoo/enterprise#106676 Forward-Port-Of: odoo/enterprise#104928
This update ensures that failure messages are correctly displayed when a quality check is marked as failed using the quick-action button. Previously, the system didn't show these messages, preventing users from understanding the issue. The fix corrects a technical issue related to how the view is rendered, ensuring the failure message is now visible.
Original PR description
*= quality_control, quality_mrp_workorder, mrp_workorder Currently, when a user fails a quality check using the quick-action button, the failure message defined for that quality control point isn’t…
*= quality_control, quality_mrp_workorder, mrp_workorder Currently, when a user fails a quality check using the quick-action button, the failure message defined for that quality control point isn’t shown. **Steps to produce:** * Install `Quality` and `Manufacturing` with demo data * Go to MRP > Configuration > Operations > Manual Assembly * Create a pass/fail quality point with a failure message * Create and confirm an MO for `Table Top` * Go to Shop Floor > Activate work centers if inactive > Manual Assembly * Fail the assembly using the quick-action button Replication video: [Link](https://drive.google.com/file/d/1gBHrvQEAavhjU4lS-bKQHQjAa9qDHj6-/view?usp=sharing) **Observed Behavior:** * No failure message is displayed when the quality check is failed. **Root cause:** * This happens because pressing the quick-action button triggers `failCheck` [1] , which calls `doActionNext` [2], which then runs the server function `action_fail_and_next` [3]. That function sets `quality_state = fail` and calls [4] to get the view. But since [3] wraps that view inside a dictionary, the check in [5] never passes, so the message never appears. **Solution:** * Pass the view correctly to display the failure message. Since the quick action already marks the quality state as failed we can hide the Confirm and Back buttons by passing the context and checking it in the view to show a single OK button, similar to earlier versions. **Before:** <img width="1673" height="813" alt="image" src="https://github.com/user-attachments/assets/029e347b-5f2c-463a-833e-3b55677137b6" /> **After:** <img width="1687" height="829" alt="image" src="https://github.com/user-attachments/assets/e4c85093-ea0d-44ca-bc9c-0fab5ac08fbc" /> [1]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/static/src/mrp_display/quality_check.js#L83-L86 [2]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/mrp_workorder/static/src/mrp_display/mrp_record_line/quality_check.js#L147-L163 [3]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/models/quality.py#L86-L89 [4]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/models/quality.py#L48-L68 [5]: https://github.com/odoo/enterprise/blob/19.0/mrp_workorder/static/src/mrp_display/mrp_record_line/quality_check.js#L154-L161 opw-5403465 Forward-Port-Of: odoo/enterprise#106711 Forward-Port-Of: odoo/enterprise#102095
This update fixes an issue where the XML export for VAT listings in the Belgian reports was incomplete, only showing the initial batch of partners. The change ensures that all partners, regardless of the 'Load More' setting, are included in the generated XML file. This improves the accuracy and completeness of the VAT reporting data.
Original PR description
# Steps to reproduce: * Install **Accounting** and **l10n_be_reports**. * Enable **debug mode**. * Go to **Accounting → Reporting → Belgium → Partner VAT Listing**. * Create invoices with invoice…
# Steps to reproduce: * Install **Accounting** and **l10n_be_reports**. * Enable **debug mode**. * Go to **Accounting → Reporting → Belgium → Partner VAT Listing**. * Create invoices with invoice lines with no product set on it, just a label, so that **more than 10 Belgian partners** appear in the report and ensure each partner has a **VAT number**. * Open the report **Options** tab and set **Load More Limit** to **5**. * Click **Load More** until all partners are visible. * Click **Returns** and create a return for the month you have created invoices for, and submit it. * Download the generated XML. # Observed behavior: * The XML file contains only the first batch of partners. * Partners shown after clicking **Load More** are missing from the export. # Cause: * In v17, the XML export button was defined as: https://github.com/odoo/enterprise/blob/42ef1fe589fc4e7fe4b611736253251c44506578/l10n_be_reports/models/partner_vat_listing.py#L53-L59 * This meant clicking the button would go through the [export_file](https://github.com/odoo/enterprise/blob/42ef1fe589fc4e7fe4b611736253251c44506578/account_reports/models/account_report.py#L4927) method, which sets `options['export_mode'] = 'file'` before calling the export function. The test in v17 explicitly sets `export_mode = 'file'` to simulate what `export_file` does in production. * In v19, the architecture changed: - The XML export is now triggered via the account.return workflow and a submission wizard [1.](https://github.com/odoo/enterprise/blob/19.0/l10n_be_reports/wizard/vat_listing_submission_wizard.py) - The wizard's `print_xml` method calls [_get_closing_report_options()](https://github.com/odoo/enterprise/blob/19.0/account_reports/models/account_return.py#L1601) which does NOT set `export_mode = 'file'`. - The controller then calls `dispatch_report_action(options, file_generator)` directly, bypassing `export_file`. * Why the test changed: - In v17 test: `export_mode = 'file'` was set to mimic the `export_file` → `partner_vat_listing_export_to_xml` flow. - In v19 test: `export_mode = 'file'` should NOT be needed in the test because the fix is to set `export_mode = 'file'` inside `partner_vat_listing_export_to_xml` itself. # Fix: * Enable **export mode** when generating the XML. * Ensures all partners are included regardless of the load limit. opw-5494247 Forward-Port-Of: odoo/enterprise#106134
This pull request addresses critical updates to Odoo's Belgian payroll reporting functionality, specifically related to tax forms 281.10, 281.45, and 281.XX. The changes ensure accurate reporting for 2025 and 2026, including updated validation schemas and declaration values, resolving previous discrepancies and improving compliance.
Original PR description
Forward-Port-Of: odoo/enterprise#106703
This update resolves a problem where long item codes were causing errors in the AvaTax integration, preventing tax calculations from completing successfully. The system now automatically shortens item codes to 50 characters before sending them to the AvaTax API, ensuring accurate and reliable tax processing.
Original PR description
Link to Avalara (Avatax) documentation: https://developer.avalara.com/api-reference/avatax/rest/v2/models/LineItemModel/ Expected Behaviour: The itemCode sent to the AvaTax API should be 50…
Link to Avalara (Avatax) documentation: https://developer.avalara.com/api-reference/avatax/rest/v2/models/LineItemModel/ Expected Behaviour: The itemCode sent to the AvaTax API should be 50 characters or fewer to comply with Avalara's field length constraints. Actual Behaviour before the Fix: When an itemCode exceeded 50 characters, the system attempted to send the request as-is. This resulted in the AvaTax API returning an error, causing the transaction or tax calculation to fail. Behaviour with the Fix: The system now ensures that the itemCode adheres to the 50-character limit before the API call is made, by trancating the code to the first 50 characters if it exceeds 50 characters. This prevents API rejection and ensures successful tax processing for items with long identifiers. Steps to reproduce: 1. Create or select a product/item with a reference (or barcode if using UPC) longer than 50 characters. 2. Trigger an action that calculates tax via the AvaTax integration (e.g., creating an invoice or updating a line item). 3. Observe the API response. - Before fix: API returns a validation error regarding the itemCode length. - After fix: Request is successful as the itemCode is properly handled/validated. opw-5406451 Forward-Port-Of: odoo/enterprise#106085 Forward-Port-Of: odoo/enterprise#105017
3 changes
Resolved issues and error corrections
This update ensures that a failure message is now correctly displayed when a quality check is marked as failed. Previously, the system didn't show the intended failure notification. The fix corrects a technical issue related to how the system handles quality check states, ensuring users receive the expected feedback.
Original PR description
*= quality_control, quality_mrp_workorder, mrp_workorder Currently, when a user fails a quality check using the quick-action button, the failure message defined for that quality control point isn’t…
*= quality_control, quality_mrp_workorder, mrp_workorder Currently, when a user fails a quality check using the quick-action button, the failure message defined for that quality control point isn’t shown. **Steps to produce:** * Install `Quality` and `Manufacturing` with demo data * Go to MRP > Configuration > Operations > Manual Assembly * Create a pass/fail quality point with a failure message * Create and confirm an MO for `Table Top` * Go to Shop Floor > Activate work centers if inactive > Manual Assembly * Fail the assembly using the quick-action button Replication video: [Link](https://drive.google.com/file/d/1gBHrvQEAavhjU4lS-bKQHQjAa9qDHj6-/view?usp=sharing) **Observed Behavior:** * No failure message is displayed when the quality check is failed. **Root cause:** * This happens because pressing the quick-action button triggers `failCheck` [1] , which calls `doActionNext` [2], which then runs the server function `action_fail_and_next` [3]. That function sets `quality_state = fail` and calls [4] to get the view. But since [3] wraps that view inside a dictionary, the check in [5] never passes, so the message never appears. **Solution:** * Pass the view correctly to display the failure message. Since the quick action already marks the quality state as failed we can hide the Confirm and Back buttons by passing the context and checking it in the view to show a single OK button, similar to earlier versions. **Before:** <img width="1673" height="813" alt="image" src="https://github.com/user-attachments/assets/029e347b-5f2c-463a-833e-3b55677137b6" /> **After:** <img width="1687" height="829" alt="image" src="https://github.com/user-attachments/assets/e4c85093-ea0d-44ca-bc9c-0fab5ac08fbc" /> [1]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/static/src/mrp_display/quality_check.js#L83-L86 [2]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/mrp_workorder/static/src/mrp_display/mrp_record_line/quality_check.js#L147-L163 [3]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/models/quality.py#L86-L89 [4]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/models/quality.py#L48-L68 [5]: https://github.com/odoo/enterprise/blob/19.0/mrp_workorder/static/src/mrp_display/mrp_record_line/quality_check.js#L154-L161 opw-5403465 Forward-Port-Of: odoo/enterprise#102095
This update fixes an issue where Modelo 390 reports for past years were generating empty BOE files. The fix ensures the report correctly uses the specified year's data, resolving a discrepancy between the report and the actual tax information. This improves the accuracy of tax reporting for Spanish companies.
Original PR description
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report`…
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report` options However, `section_reports` do not store the date or return periodicity of the selected report As a result, using their options always fetched data for the current period instead of the specified year ### Note: `_generate_mod_390_page2()` also had issues: some lines were missing or incorrectly indexed The mod 360 format, it strict in the structure with specific index so it may produce invalid documents The latest documentation for mod 390: https://sede.agenciatributaria.gob.es/static_files/Sede/Disenyo_registro/DR_300_399/archivos_25/dr390e2025.xlsx ### Steps to reproduce: - Install `l10n_es_reports` and switch to ES Company - Create an Invoice and a Bill (Any product, Price: 100.00, Tax: 21%, Invoice Date: 01/01/2025) - Open Tax Return, switch to Mod 390, and set year to 2025 - You should see data in the 2 first sections - Use the gear icon, and download the BOE - Use the gear icon to download the BOE, fill the wizard (Natural Person – Name: Test, Principal activity: Test, Activity Code: 12345), and generate the file Before the fix: all values in the BOE were 0 instead of matching the report opw-5457374 Forward-Port-Of: odoo/enterprise#106676 Forward-Port-Of: odoo/enterprise#104928
A recent page refresh issue was preventing the restaurant appointment tour from working correctly. This update refactors the tour to maintain a consistent simulated time, ensuring appointments remain visible and the tour functions as expected after a reload. This improves the user experience for restaurant bookings.
Original PR description
The `RestaurantAppointmentTour` fails when page refreshes reset the mock clock to system time, causing the frontend to filter out mock appointments and the tour to timeout. Refactor the tour to use the new `withTimeFreeze` helper, ensuring the simulated date persists across reloads so appointments remain visible. runbot-232601 Related Community PR: odoo/odoo#247596
5 changes
Resolved issues and error corrections
This update ensures that invoice dates sent to ECPay (a payment processor) are formatted correctly for Taiwan's time zone. Previously, dates were stored in UTC, causing errors when ECPay searched for invoices. This fix resolves a critical issue preventing successful invoice processing and ensures accurate record-keeping.
Original PR description
sending to ECPay The date store in Odoo is in utc format, we need to convert it to tw time when sending the date to ECPay. The APIs are using the date to search for the invoices, if the date is not correct, it cannot find the invoices and return error. task-5884616 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#246039
This update fixes an issue where the Product ConfiguratorPopup in the Point of Sale module wasn't showing the correct price from the configured pricelist. The fix ensures that the pricelist price is now displayed, providing accurate pricing information to users during product selection. This improves the user experience and prevents pricing discrepancies.
Original PR description
Steps to reproduce: - Configure POS → enable Allow Flexible Pricelist and assign the Default pricelist. - Create product A with variants. - Add product A to the Default pricelist. - Set a fixed price…
Steps to reproduce: - Configure POS → enable Allow Flexible Pricelist and assign the Default pricelist. - Create product A with variants. - Add product A to the Default pricelist. - Set a fixed price for product A in that pricelist. - Open POS session. - Select product A in POS. Observation: - In ProductConfiguratorPopup dialog, pricelist price is not considered Cause: - After this [commit](https://github.com/odoo/odoo/commit/5e77c14912324bf967a55a1a40bb01071eca5c8b) the text appears from `get title()` method, which do not consider pricelist Fix: - we now consider pricelist for displaying title. **Before** <table> <tr> <td> <img width="400" height="300" alt="image" src="https://github.com/user-attachments/assets/6faac3e4-a579-41db-a2ad-fdc9c24e422f" /> </td> <td> <img width="400" height="300" alt="image" src="https://github.com/user-attachments/assets/14035707-aa23-4fb3-97d7-d0ce2f6e6b46" /> </td> </tr> </table> **After** <img width="340" height="225" alt="image" src="https://github.com/user-attachments/assets/3beeaf76-fc1a-42a5-9f3c-dabc43389d36" /> opw-5270319 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237899
This update optimizes the process of exporting financial data (FEC) from large Odoo databases. Previously, the export generated extremely large files, leading to memory issues. Now, the system streams the data directly to the user, preventing memory overload and improving export speeds for extensive transactions.
Original PR description
On large databases (millions of account moves), The FEC exported file can be huge. This resulted in memory error since at some point we have the entire file in memory. This commit aims to overcome this issue by streaming the content of the file to the user. task-5404142 Forward-Port-Of: odoo/odoo#246005 Forward-Port-Of: odoo/odoo#240981
This update fixes an issue where the barcode scanning process wasn't correctly creating quality checks for products tracked by lot. The change ensures that each unique lot within a receipt triggers a separate quality check, improving inventory accuracy and quality control processes. This resolves a discrepancy in how the system was generating quality checks when using the 'Put-In-Pack' feature.
Original PR description
**Steps to reproduce:** * Install the `stock_barcode`, `quality_control` modules. * Go to *Inventory > Configuration > Settings* and enable **Packages**. * Create a product with **By Lot** tracking…
**Steps to reproduce:** * Install the `stock_barcode`, `quality_control` modules. * Go to *Inventory > Configuration > Settings* and enable **Packages**. * Create a product with **By Lot** tracking enabled and set a barcode reference. * Create a quality control point for this product with following configuration: * Operation: *Receipts* * Control per: *Quantity* * Control Frequency: *All* * Product: the previously created lot-tracked product. * Create a receipt for this product with a quantity of 6 and `mark as todo`. * Open the *Barcode* app and process the receipt. * Scan the product barcode. * Scan some quantity of the product with lot *LOT01* and put those units into a package(Put-In-Pack). * Scan the remaining quantity with lot *LOT02* and put those units into a different package(Put-In-Pack). * Click on **Quality Checks**. **Observed behavior:** * Only one quality check is created, even though the receipt contains two different lots that should each generate a quality check. **Cause:** * In `_inverse_qty_done`, move lines are marked as *picked* when `qty_done` is equal to quantity(Demand). * During the `write` operation, quality checks are created only for move lines that are not picked, which prevents creating a quality check for each lot. * Relevant code: https://github.com/odoo/enterprise/blob/464dc0c65548f3f440b293b534616743ddd5e130/quality_control/models/stock_move_line.py#L39 https://github.com/odoo/enterprise/blob/464dc0c65548f3f440b293b534616743ddd5e130/stock_barcode/models/stock_move_line.py#L67-L71 **Fix:** * Ensure that quality check points are generated correctly when validating products through the Barcode app using the Put in Pack option. --- opw-5405221 Forward-Port-Of: odoo/enterprise#105535 Forward-Port-Of: odoo/enterprise#102714
This fix resolves an issue where Modelo 390 reports for past years were incorrectly generating empty BOE files. The update ensures the report period is correctly identified, pulling accurate data for the specified year. This guarantees accurate tax reporting for Spanish businesses.
Original PR description
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report`…
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report` options However, `section_reports` do not store the date or return periodicity of the selected report As a result, using their options always fetched data for the current period instead of the specified year ### Note: `_generate_mod_390_page2()` also had issues: some lines were missing or incorrectly indexed The mod 360 format, it strict in the structure with specific index so it may produce invalid documents The latest documentation for mod 390: https://sede.agenciatributaria.gob.es/static_files/Sede/Disenyo_registro/DR_300_399/archivos_25/dr390e2025.xlsx ### Steps to reproduce: - Install `l10n_es_reports` and switch to ES Company - Create an Invoice and a Bill (Any product, Price: 100.00, Tax: 21%, Invoice Date: 01/01/2025) - Open Tax Return, switch to Mod 390, and set year to 2025 - You should see data in the 2 first sections - Use the gear icon, and download the BOE - Use the gear icon to download the BOE, fill the wizard (Natural Person – Name: Test, Principal activity: Test, Activity Code: 12345), and generate the file Before the fix: all values in the BOE were 0 instead of matching the report opw-5457374 Forward-Port-Of: odoo/enterprise#106676 Forward-Port-Of: odoo/enterprise#104928
2 changes
Resolved issues and error corrections
This update fixes a reporting issue related to Spanish withholding taxes. It ensures that moves involving withholding taxes now correctly clear the 'type for 347' field, aligning with Spanish tax regulations. This improves the accuracy of financial reports for Spanish businesses using Odoo Enterprise.
Original PR description
- Moves that use withholding taxes should have the `type for 347` unselected and left blank. Related PR : https://github.com/odoo/odoo/pull/245828 task-5732679 Forward-Port-Of: odoo/enterprise#105597
This update fixes inconsistencies in how time off and absences are handled within the Odoo Enterprise system. It standardizes the views related to these processes, ensuring more accurate and reliable reporting for payroll and tax compliance, specifically for Swiss operations. This change improves data accuracy and simplifies reporting requirements.
Original PR description
Backport of https://github.com/odoo/enterprise/commit/f238e04f3f6c39b61d0449a0766809df06eb6980 task-5384297 Forward-Port-Of: odoo/enterprise#101449
3 changes
Resolved issues and error corrections
This update prevents subscription discounts from being reset when the subscription's start date or plan is changed. Previously, date changes triggered a recalculation that wiped out manually entered commercial discounts. Now, the system checks if the line items have actually changed before recalculating discounts, ensuring user-defined discounts are maintained.
Original PR description
Before this commit, changing the `start_date` or `plan_id` on a Subscription would trigger a recomputation of the `discount` field on all order lines. This triggered the standard `_compute_discount`…
Before this commit, changing the `start_date` or `plan_id` on a Subscription would trigger a recomputation of the `discount` field on all order lines. This triggered the standard `_compute_discount` method, which recalculates the price and discount based on the Pricelist, effectively wiping out any manually entered commercial discounts. This occurred because the `_compute_discount` method in `sale_subscription` depends on `order_id.start_date` to calculate pro-rated amounts for upsells. However, it was unconditionally calling `super()`, which runs the standard pricelist logic even when the line content itself (Product, Qty) had not changed. This commit introduces a check to detect if the line content has actually been modified by the user (comparing against the database origin). - If the line content (Product, Qty, UoM) is unchanged, we skip the `super()` call to preserve the manual discount. - If the line content is changed (or it is a new line), we allow `super()` to run to update the price according to the pricelist. This ensures that contextual changes (like shifting the start date) do not destroy manual data entered on the lines. task: 5788384
This update simplifies how Odoo identifies downpayments by moving the related field from a custom 'is_downpayment' field to the 'display_type'. Previously, this required complex overrides across multiple modules, leading to potential instability. This change ensures downpayment logic is more reliable and easier to maintain.
Original PR description
*: helpdesk_sale_timesheet, industry_fsm_sale, l10n_mx_edi_landing, l10n_pe_edi, sale_external_tax, sale_subscription, --- Description of the issue this commit addresses: Currently the detection of whether a line (account move, sale order, purchase order) or a move is a downpayement relies on a `is_downpayment` field one the lines models. This creates complexity as overridable methods are put on account models so that when other module with downpayments are installed, they get overriden and the downpayment behavior is implemented. This means that the account module always calls those helper just in case of if one of those modules is installed. --- Desired behavior after this commit is merged: This commit migrates the `is_downpayment` field to a new value for the `display_type` field so that checking for downpayment doesn't rely on whether some other module is installed. --- Odoo PR: https://github.com/odoo/odoo/pull/246933 task-5871102
A recent error on the payment page when using Avatax with point of sale (POS) has been resolved. This was caused by an outdated method that no longer existed. The fix simply removed the problematic code, ensuring smooth payment processing.
Original PR description
Step to reproduce: - configure pos for Avatax from settings - open pos and settle a order - notice a error message on payment page Cause: - error is due to usage of `replaceDataByKey` which is removed in [1] [1] https://github.com/odoo/odoo/commit/3e94fe90ded58d498f0098cd9ed8679cbe500b8f Fix: - we removed the method as now we do not rely on it. opw-5089351 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#106135 Forward-Port-Of: odoo/enterprise#102101
5 changes
Resolved issues and error corrections
This update fixes an issue where failure messages weren't shown when a quality check was marked as failed. The change ensures that the correct failure message appears immediately after a quality check is marked as failed, improving user feedback and process clarity. This was achieved by correctly passing the view to display the failure message.
Original PR description
*= quality_control, quality_mrp_workorder, mrp_workorder Currently, when a user fails a quality check using the quick-action button, the failure message defined for that quality control point isn’t…
*= quality_control, quality_mrp_workorder, mrp_workorder Currently, when a user fails a quality check using the quick-action button, the failure message defined for that quality control point isn’t shown. **Steps to produce:** * Install `Quality` and `Manufacturing` with demo data * Go to MRP > Configuration > Operations > Manual Assembly * Create a pass/fail quality point with a failure message * Create and confirm an MO for `Table Top` * Go to Shop Floor > Activate work centers if inactive > Manual Assembly * Fail the assembly using the quick-action button Replication video: [Link](https://drive.google.com/file/d/1gBHrvQEAavhjU4lS-bKQHQjAa9qDHj6-/view?usp=sharing) **Observed Behavior:** * No failure message is displayed when the quality check is failed. **Root cause:** * This happens because pressing the quick-action button triggers `failCheck` [1] , which calls `doActionNext` [2], which then runs the server function `action_fail_and_next` [3]. That function sets `quality_state = fail` and calls [4] to get the view. But since [3] wraps that view inside a dictionary, the check in [5] never passes, so the message never appears. **Solution:** * Pass the view correctly to display the failure message. Since the quick action already marks the quality state as failed we can hide the Confirm and Back buttons by passing the context and checking it in the view to show a single OK button, similar to earlier versions. **Before:** <img width="1673" height="813" alt="image" src="https://github.com/user-attachments/assets/029e347b-5f2c-463a-833e-3b55677137b6" /> **After:** <img width="1687" height="829" alt="image" src="https://github.com/user-attachments/assets/e4c85093-ea0d-44ca-bc9c-0fab5ac08fbc" /> [1]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/static/src/mrp_display/quality_check.js#L83-L86 [2]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/mrp_workorder/static/src/mrp_display/mrp_record_line/quality_check.js#L147-L163 [3]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/models/quality.py#L86-L89 [4]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/models/quality.py#L48-L68 [5]: https://github.com/odoo/enterprise/blob/19.0/mrp_workorder/static/src/mrp_display/mrp_record_line/quality_check.js#L154-L161 opw-5403465 Forward-Port-Of: odoo/enterprise#102095
This update fixes an issue where the XML export for Belgium VAT listings was incomplete, only including the initial batch of partners. The change adjusts the export process to ensure all partners, regardless of the 'Load More' setting, are correctly included in the generated XML file. This improves the accuracy of VAT reporting.
Original PR description
# Steps to reproduce: * Install **Accounting** and **l10n_be_reports**. * Enable **debug mode**. * Go to **Accounting → Reporting → Belgium → Partner VAT Listing**. * Create invoices with invoice…
# Steps to reproduce: * Install **Accounting** and **l10n_be_reports**. * Enable **debug mode**. * Go to **Accounting → Reporting → Belgium → Partner VAT Listing**. * Create invoices with invoice lines with no product set on it, just a label, so that **more than 10 Belgian partners** appear in the report and ensure each partner has a **VAT number**. * Open the report **Options** tab and set **Load More Limit** to **5**. * Click **Load More** until all partners are visible. * Click **Returns** and create a return for the month you have created invoices for, and submit it. * Download the generated XML. # Observed behavior: * The XML file contains only the first batch of partners. * Partners shown after clicking **Load More** are missing from the export. # Cause: * In v17, the XML export button was defined as: https://github.com/odoo/enterprise/blob/42ef1fe589fc4e7fe4b611736253251c44506578/l10n_be_reports/models/partner_vat_listing.py#L53-L59 * This meant clicking the button would go through the [export_file](https://github.com/odoo/enterprise/blob/42ef1fe589fc4e7fe4b611736253251c44506578/account_reports/models/account_report.py#L4927) method, which sets `options['export_mode'] = 'file'` before calling the export function. The test in v17 explicitly sets `export_mode = 'file'` to simulate what `export_file` does in production. * In v19, the architecture changed: - The XML export is now triggered via the account.return workflow and a submission wizard [1.](https://github.com/odoo/enterprise/blob/19.0/l10n_be_reports/wizard/vat_listing_submission_wizard.py) - The wizard's `print_xml` method calls [_get_closing_report_options()](https://github.com/odoo/enterprise/blob/19.0/account_reports/models/account_return.py#L1601) which does NOT set `export_mode = 'file'`. - The controller then calls `dispatch_report_action(options, file_generator)` directly, bypassing `export_file`. * Why the test changed: - In v17 test: `export_mode = 'file'` was set to mimic the `export_file` → `partner_vat_listing_export_to_xml` flow. - In v19 test: `export_mode = 'file'` should NOT be needed in the test because the fix is to set `export_mode = 'file'` inside `partner_vat_listing_export_to_xml` itself. # Fix: * Enable **export mode** when generating the XML. * Ensures all partners are included regardless of the load limit. opw-5494247
This update corrects an issue where Modelo 390 reports for past years were generating empty BOE files. The fix ensures the report period is correctly identified, pulling accurate data for the specified year from the Spanish tax agency. This resolves a reporting discrepancy impacting tax compliance.
Original PR description
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report`…
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report` options However, `section_reports` do not store the date or return periodicity of the selected report As a result, using their options always fetched data for the current period instead of the specified year ### Note: `_generate_mod_390_page2()` also had issues: some lines were missing or incorrectly indexed The mod 360 format, it strict in the structure with specific index so it may produce invalid documents The latest documentation for mod 390: https://sede.agenciatributaria.gob.es/static_files/Sede/Disenyo_registro/DR_300_399/archivos_25/dr390e2025.xlsx ### Steps to reproduce: - Install `l10n_es_reports` and switch to ES Company - Create an Invoice and a Bill (Any product, Price: 100.00, Tax: 21%, Invoice Date: 01/01/2025) - Open Tax Return, switch to Mod 390, and set year to 2025 - You should see data in the 2 first sections - Use the gear icon, and download the BOE - Use the gear icon to download the BOE, fill the wizard (Natural Person – Name: Test, Principal activity: Test, Activity Code: 12345), and generate the file Before the fix: all values in the BOE were 0 instead of matching the report opw-5457374 Forward-Port-Of: odoo/enterprise#106676 Forward-Port-Of: odoo/enterprise#104928
This update resolves a bug preventing users from installing modules after setting up a Belgian company with the account_accountant module. The issue stemmed from a registry reload delay during module installation, now corrected to ensure proper module installation.
Original PR description
Encountered this bug while trying to reproduce a bug from one of my ticket. **STEP TO REPRODUCE** On a fresh db with module account_accountant. 1. Create a new company with country set to Belgium. After l10n_modules are install, and the chart template loaded: 2. Try installing a module, and notice you can't. **CAUSE** button_install() doesn't reload the registry, so the sepa modules states are set to `to install` but are not install until the registry is reloaded, which doesn't happen on its own. button_immediate_install() does the same as button_install(), and reload the registry which trigger the actual installation process. Indirectly related to opw-5880247: when trying to reproduce the bug, I had to create a company, setup a chart of account on it. I created a belgium company -> setting it to belgium trigger the button_install, preventing me from installing payment module afterward.
This update resolves a problem where long item codes were causing errors in the AvaTax integration. The system now automatically limits item codes to 50 characters, ensuring successful tax calculations and preventing transaction failures. This improves the reliability of our tax processing.
Original PR description
Link to Avalara (Avatax) documentation: https://developer.avalara.com/api-reference/avatax/rest/v2/models/LineItemModel/ Expected Behaviour: The itemCode sent to the AvaTax API should be 50…
Link to Avalara (Avatax) documentation: https://developer.avalara.com/api-reference/avatax/rest/v2/models/LineItemModel/ Expected Behaviour: The itemCode sent to the AvaTax API should be 50 characters or fewer to comply with Avalara's field length constraints. Actual Behaviour before the Fix: When an itemCode exceeded 50 characters, the system attempted to send the request as-is. This resulted in the AvaTax API returning an error, causing the transaction or tax calculation to fail. Behaviour with the Fix: The system now ensures that the itemCode adheres to the 50-character limit before the API call is made, by trancating the code to the first 50 characters if it exceeds 50 characters. This prevents API rejection and ensures successful tax processing for items with long identifiers. Steps to reproduce: 1. Create or select a product/item with a reference (or barcode if using UPC) longer than 50 characters. 2. Trigger an action that calculates tax via the AvaTax integration (e.g., creating an invoice or updating a line item). 3. Observe the API response. - Before fix: API returns a validation error regarding the itemCode length. - After fix: Request is successful as the itemCode is properly handled/validated. opw-5406451 Forward-Port-Of: odoo/enterprise#106085 Forward-Port-Of: odoo/enterprise#105017
10 changes
Resolved issues and error corrections
This update resolves an issue with the calculation of Spanish taxes (Mod 390) by accurately incorporating balances from specific accounts into the relevant tax reporting sections. This ensures compliance with Spanish tax regulations and improves the accuracy of financial reporting within the Odoo system. The change was part of a larger effort to improve the Spanish localization.
Original PR description
In this commit: Fixing 390 computation: - Add balance from 27, 29, 649 and 31 to casilla 33. - Add balance from 28, 30, 650 and 32 to casilla 34. Related PR : https://github.com/odoo/enterprise/pull/105597 task-5732679 Forward-Port-Of: odoo/odoo#245828
This update corrects a calculation error in the Point of Sale system when applying taxes. Specifically, it ensures that the total price displayed accurately reflects the base product price plus the correct tax amount, regardless of how taxes are configured. This fix resolves an issue where tax calculations were inconsistent, leading to incorrect totals.
Original PR description
When a fiscal position maps a tax-included tax to a tax-excluded tax (or vice versa), the price unit must be adjusted to keep the base amount consistent. This adjustment was missing in the POS…
When a fiscal position maps a tax-included tax to a tax-excluded tax (or vice versa), the price unit must be adjusted to keep the base amount consistent. This adjustment was missing in the POS frontend after the tax computation refactoring in v18+. Background: In v17, the computePriceAfterFp method handled this price adaptation: https://github.com/odoo/odoo/blob/36688ce4dad4b3d508b4fd3d778a06a5a7036408/addons/point_of_sale/static/src/app/store/pos_store.js#L1102-L1133 This method was removed in: https://github.com/odoo/odoo/commit/ab0bdf019212 The refactoring introduced: https://github.com/odoo/odoo/blob/0d7e3d4c0ea976e37871ca44a10a442cce7caa85/addons/account/static/src/helpers/account_tax.js#L472-L481 However, the POS module was not updated to call this helper when preparing base lines for tax computation. Steps to reproduce: 1. Create a tax configured as "Included in Price" (21) 2. Create a tax configured as "Excluded from Price" (21) 4. Create a fiscal position that maps the included to the excluded tax 4. Add the fiscal position to a contact 5. Create a product with the included tax, priced at 100 6. In POS, add the contact as the client and add the product 7. Total incorrectly shows 121 (or 100 + tax) instead of 100 Ticket [link](https://www.odoo.com/odoo/project.task/5877918) opw-5877918 ------------------------------------------------------------------------ I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update allows for seamless payment matching between parent and child companies within Odoo. Previously, matching was limited to purchase orders; now, it extends to bills, streamlining financial reconciliation across company structures. This enhancement improves accuracy and efficiency in managing intercompany transactions.
Original PR description
On bills, the `purchase_vendor_bill_id` field already allows matching with cross-company purchase orders. This commit extends this behavior to payment matching. Steps to reproduce: - Create a child company from a parent company. - Create a purchase order in the child company. - Create a bill in the parent company. - In the bill’s payment matching, the child company’s purchase order should be available. opw-5416947
This update resolves a bug where syncing an order with point changes could incorrectly trigger processing for all orders, including draft ones. This change ensures that draft orders are not unnecessarily processed, improving order stability and preventing potential errors. It addresses a technical issue impacting order processing reliability.
Original PR description
Before this commit, when a draft order with point changes existed, syncing an order would trigger the post processing of all orders, including draft ones. This could lead to issues. opw-5370267 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update optimizes how Odoo retrieves messages, leading to faster loading times and a smoother user experience, particularly when accessing email activity records. The changes address a previous issue where message access was slow, especially when browsing records multiple times. This enhancement improves overall system responsiveness and efficiency.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245744
This update resolves an issue with Spanish tax reporting (l10n_es_reports) related to withholding taxes. Specifically, the system now correctly handles the 'type for 347' field in invoices, ensuring accurate tax calculations and compliance. This change improves the reliability of financial reporting for Spanish businesses using Odoo Enterprise.
Original PR description
- Moves that use withholding taxes should have the `type for 347` unselected and left blank. Related PR : https://github.com/odoo/odoo/pull/245828 task-5732679 Forward-Port-Of: odoo/enterprise#105597
This update fixes a bug where appointment slots remained available to customers even when a user was marked as being on time off. The fix ensures that unavailable dates are correctly blocked, preventing appointments from being scheduled during a user's scheduled time off. This improves scheduling accuracy and prevents double-booking.
Original PR description
__ ## Short functional explanation of the error When setting a time off for a user, it doesn't prevent customers from selecting an appointment slot during this time off with said user. ##…
__ ## Short functional explanation of the error When setting a time off for a user, it doesn't prevent customers from selecting an appointment slot during this time off with said user. ## Reproduction Steps 1. Go to Users. Create a user U and a corresponding employee E. 2. Click on the smart button Employee, and in Work Information tab, under Schedule, set the Working Hours as a working schedule you'll remember. Let's call it WS. 3. In debug mode, go to Employees > configuration > Working Schedules. Select the working schedule WS and click on Time Off. 4. Click on new. Give the time off a name, and in the field Working Hours, enter the working schedule WS. As resource, select the employee E. 5. Go to Appointments and click on New. Let the Availability based on Users, and add user U to users. Hit save and preview. ### Expected behavior The date on which the user has a time off shouldn't be selectable. ### Unexpected behavior The date is selectable, and the slots a user can select appear as usual. ## Origin of the issue In the method https://github.com/odoo/enterprise/blob/99231105268a74b24a396903cecc3699b16121b0/appointment/models/appointment_type.py#L1088 we only check if the user has a meeting for a time slot, but no holiday. This issue doesn't appear if the availability is based on resources: we do check leaves on resource for a given time slot with https://github.com/odoo/enterprise/blob/99231105268a74b24a396903cecc3699b16121b0/appointment/models/appointment_type.py#L1481 __ opw-5419376
This update resolves an issue where accents were unintentionally removed from legal names used in Mexican electronic invoicing (EDI). This ensures accurate recognition of these names by the SAT (Servicio de Administración Tributaria), preventing potential processing errors and compliance issues. The change specifically addresses the 'ë' character, a common requirement for Mexican tax documents.
Original PR description
Previus commit (odoo#95207) removed accents for names including character ë which indeed its recognized for SAT opw-5897333
This update resolves an issue where reports would display outdated data while waiting for new variants to load. By preventing the initial display of the first variant, we ensure a smoother and more responsive user experience when switching between report options. This improves report loading times and data accuracy.
Original PR description
Previously, when a report was loading if a variant was selected, it would display the first one when it loaded and display the second one when it loaded. With this, we wont show the first one as we are waiting for the new one. To reproduce: - load the Demo data on the demo company - Add time.sleep(5) in _get_lines - load the Generic Tax report and wait for it to load - click on the Group by: Account > Tax and wait for 3s - click on the Group by: Tax > Account - Watch the Account > Tax load and still being displayed for 3s while the Tax > Account variant is loading.
This update standardizes the way time off and absences are recorded and transmitted for payroll reporting in Switzerland (CH). It backports a fix from a previous Odoo release, ensuring accurate and compliant reporting related to employee leave and absence data. This improves the reliability of the ELM (Einmalige Leistungen) transmission.
Original PR description
Backport of https://github.com/odoo/enterprise/commit/f238e04f3f6c39b61d0449a0766809df06eb6980 task-5384297 Forward-Port-Of: odoo/enterprise#101449
4 changes
Resolved issues and error corrections
This update resolves a bug where importing journal entries in foreign currencies could fail due to rounding discrepancies. The issue stemmed from individual line rounding, leading to an imbalance between debit and credit. This fix ensures journal entries with foreign currency transactions can be reliably imported and balanced.
Original PR description
**PROBLEM** If you create/import a journal entry using a foreign currency, it can happen that the journal entry is balanced in said foreign currency but isn't balanced in the company currency,…
**PROBLEM** If you create/import a journal entry using a foreign currency, it can happen that the journal entry is balanced in said foreign currency but isn't balanced in the company currency, preventing you from creating/importing the journal entry. When creating the journal entry, you could add a line to balance this, but if you import it, you can't. **STEP TO REPRODUCE** 1. Set the exchange rate: 1€ = 0.134068$ 2. Import the journal entry named issue.csv (can be found in the ticket page or the PR). **CAUSE** Because we round each line individually, we may end up with a rounding issue that leads to debit/credit not being equal. opw-4668369 | Reference | account_move_journal.id | Date | Journal Items / Account | Journal Items / Currency | Journal Items / Amount in Currency | |-----------|--------------------------|---------|-------------------------|--------------------------|------------------------------------| | Bunq | Miscellaneous Operations | 8/15/25 | 1010 | EUR | -34.9 | | | | | 1050 | EUR | 34.9 | | | | | 1100 | EUR | 2.69 | | | | | 1200 | EUR | 32.21 | | | | | 1300 | EUR | -34.9 |€
This update corrects a reporting issue where unreserved stock was incorrectly included in the stock in transit forecast. The fix ensures that only non-available quantities are considered, providing a more accurate view of inventory movement for sales forecasting. This improves the reliability of sales order predictions.
Original PR description
**Issue** It is possible to have unreserved quantity, outside the stock location, considered as 'stock in transit' in the forecast report. This is an issue because that means some quantities, that…
**Issue** It is possible to have unreserved quantity, outside the stock location, considered as 'stock in transit' in the forecast report. This is an issue because that means some quantities, that are not meant to be moved to the stock location, are linked to a delivery. **Steps to reproduce** - Activate 3 step receipt on your warehouse - Create a new product 'Test' and adds 1 Unit in WH/Input and 1 Unit in WH/Quality - Create a sales order for 2 Units and check the forecast report of Test -> 2 units are recorded as 'stock in transit' links to the so delivery while they should not. **Cause** The forecast report is computed here: https://github.com/odoo/odoo/blob/f0196258ed41f56790db94747192545ae56c78b5/addons/stock/report/stock_forecasted.py#L17-L24 The lines are computed here: https://github.com/odoo/odoo/blob/f0196258ed41f56790db94747192545ae56c78b5/addons/stock/report/stock_forecasted.py#L125 Currently, stock in transit is calculated by: Aggregating quantities per product and location (including unreserved quantities): https://github.com/odoo/odoo/blob/f0196258ed41f56790db94747192545ae56c78b5/addons/stock/report/stock_forecasted.py#L327-L328 Removing the reserved stock, then summing per product: https://github.com/odoo/odoo/blob/f0196258ed41f56790db94747192545ae56c78b5/addons/stock/report/stock_forecasted.py#L353-L354 Assigning the result as 'stock in transit' (since free_stock is 0 here): https://github.com/odoo/odoo/blob/f0196258ed41f56790db94747192545ae56c78b5/addons/stock/report/stock_forecasted.py#L361 This method incorrectly includes unreserved quantities from intermediate locations. **Solution** Since we only want non-available quantity to be considered as stock in transit, we use the reserved quantity instead. No need to substract the free quantity anymore since free quantity are no reserved by definition. opw-5865378
This update resolves a problem where project breadcrumbs disappeared after migrating databases from older versions to the latest. The change ensures correct breadcrumb functionality when opening projects from sale orders, particularly after upgrading from version 16. This improves the user experience and data visibility.
Original PR description
Steps to reproduce: 1. Create a db with having 'sale' & 'project' installed in version 16. 2. Create a sale order having linkage to more than single project. 3. Migrate the db to version 19. 4. When…
Steps to reproduce:
1. Create a db with having 'sale' & 'project' installed in version 16.
2. Create a sale order having linkage to more than single project.
3. Migrate the db to version 19.
4. When clicking on the project stat button the breadcrumb traceability will not be there.
Issue:
-> In v16.4 the target defined for the action `project.open_view_project_all` is removed from [here](odoo/odoo@a92d686)
When migrating a database from v16 to v19 and opening projects from a sale order linked to multiple projects, the stat button triggers `action_view_project_ids`, which in turn calls
`project.open_view_project_all` for records having len('projects_ids') > 1 from [here]
(https://github.com/odoo/odoo/blame/19.0/addons/sale_project/models/sale_order.py#L220) Because the persisted target is `main`, breadcrumb traceability will be lost. The issue will arise in the DBs coming from version 16 or lesser. Therefore, it would be necessary to address this immediately and set correct target for window_action for databases >= v17
This commit explicitly sets the action target to `current` to restore proper breadcrumb behavior and align it with standard odoo record.
OPW-5448916
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-prThis update standardizes the way time off and absences are recorded and transmitted for payroll reporting in Switzerland (CH). It backports a fix from the main Odoo repository, ensuring accurate and compliant reporting by aligning views and data structures related to leave management.
Original PR description
Backport of https://github.com/odoo/enterprise/commit/f238e04f3f6c39b61d0449a0766809df06eb6980 task-5384297