Daily updates from Odoo
Thursday, April 30, 2026
265 changes
11 changes
Enhancements to existing features
This update adjusts how Odoo handles validation of additional identifiers, primarily impacting demo data used by industries. The change reduces noisy logging to 'info' level, addressing issues where warnings were triggered due to incomplete demo data. This improves the overall stability and usability of the system.
Original PR description
Since [this commit], additional identifiers are retrieved in the inverse method of vat field. This method logs warnings in case this step fails for a particular partner. Industries have a lot of demo data, it's not always possible to find suitable correct demo data for so many companies. Let's lower the logger to info. [this commit]: https://github.com/odoo/odoo/commit/825e7c803a4effd601fb247c660416f1cc6d26d7
This update adjusts Odoo's reporting to align with new Indonesian tax regulations (Act 2025). Previously, reports relied on specific tax sections, but now they utilize report line names and tax tags for accurate calculations. This ensures compliance with the latest tax requirements.
Original PR description
In this commit, the XLSX export and report warning are adapted to support the newly introduced TDS/TCS reports as per Act 2025. Previously, the XLSX reports depended on TDS/TCS sections. However, with Act 2025, certain taxes no longer have associated sections. This dependency has been removed, and report generation now relies on report line names and tax tags instead. task-6124431 Forward-Port-Of: odoo/enterprise#115679 Forward-Port-Of: odoo/enterprise#113916
Resolved issues and error corrections
This update resolves an error that occurred when generating VSME reports with an invalid base year (e.g., '1'). The fix ensures that only valid 4-digit years are accepted, preventing the report generation from failing. This improves the reliability of VSME report exports.
Original PR description
Currently, an error occurs when exporting VSME reports if the base year is not a valid 4-digit year. **Steps to Reproduce:** 1. Install the ESG module with demo data. 2. Create new "**VSME Reports**"…
Currently, an error occurs when exporting VSME reports if the base year is not a valid 4-digit year. **Steps to Reproduce:** 1. Install the ESG module with demo data. 2. Create new "**VSME Reports**" with `Base Year = 1`. 3. Now, click on "**Print**". **Error:** `ValueError - Invalid isoformat string: '1-01-01'` **Cause:** The base year is directly used to build a date in [1], resulting in `datetime.date(1, 1, 1)`. In [2], this is formatted to **"1-01-01"** and used in a domain search, which raises a ValueError due to an invalid ISO date format. **Fix:** - Adds a **constraint on base year** to ensure only valid years (1000–9999) are allowed for new VSME Report records. - Adds a **helper validation method** to verify base year before performing computations on existing records. [1]: https://github.com/odoo/enterprise/blob/4cef86708a9fe3cd00855fa18e2a8cbd4fd77e66/esg_hr/models/esg_report.py#L515 [2]: https://github.com/odoo/enterprise/blob/4cef86708a9fe3cd00855fa18e2a8cbd4fd77e66/account_accountant/models/res_company.py#L176-L184 sentry-7419431039 Forward-Port-Of: odoo/enterprise#114453
This update fixes an issue where test tags containing brackets or special characters weren't parsed correctly, leading to errors. The changes ensure that nested brackets and escaped characters are handled properly, improving the reliability of test execution. This resolves a technical detail that ensures consistent test results.
Original PR description
When using test tags for js tests, some tests are not parsed correctly when containing brackets `[ ]` This is because the tag selector use them to set parameters bounds as in…
When using test tags for js tests, some tests are not parsed correctly when containing brackets `[ ]` This is because the tag selector use them to set parameters bounds as in `.test_method[test_param]` The previous implementation using a regex could generate invalid test tags when the params contains comma, and brackets This commits fixes this two ways: Nested brackets will work, meaning that something like `.test_method[test, witch brackets[]]` will be correctly parsed as a tag `.test_method` with a parameter `test, witch brackets[]`since the brakets are balanced. Before, it was parsed as twho tags, `.test_method[test` and ` witch brackets[]]` the second one being considered invalid and spamming logs with errors Brackets and backslashes can be escaped with a backslash, meaning that something like `.test_method[test, with brackets], and backslash\]` can be escaped as `.test_method[test, with brackets\], and backslash\\]` Note that the parser will make it's best effort to parse non escaped strings, so a \ not followed by and escaped character will remain there in order to make potential copy paste easier. For the previous example `.test_method[test, with brackets\], and backslash\` will work the same way. So in practice, we only really need to escape \ when followed by another backslash or a bracket, and we need to escape brackets when they are not balanced. Comma in hoot tests are also a problem since they are used to separate parameters, this can easily be tested by only splitting on `,@` since all hoot test should start with a @ and parameters of test_unit_* tests should be a list of hoot tests. A followup pr will introduce the params to the canonical tag, and escape it as needed Forward-Port-Of: odoo/odoo#262101 Forward-Port-Of: odoo/odoo#261516
This update fixes a slow performance issue that occurred when searching for stock quantities based on certain product selections. Previously, the system would fetch all available quantities regardless of a specified limit, leading to delays. Now, the system respects the limit defined in the search criteria, resulting in significantly faster response times.
Original PR description
## Problem: During an `onchange` call, if a field is defined in the `fields_spec` with a `limit` attribute, the `fetch` method doesn't respect it, and will fetch all records satisfying the domain. In…
## Problem: During an `onchange` call, if a field is defined in the `fields_spec` with a `limit` attribute, the `fetch` method doesn't respect it, and will fetch all records satisfying the domain. In certain circumstances, this leads to slow requests. ## Solution: Enforce the `limit` when fetching if it is present. ## Steps to reproduce: - Have a product with many quant records 1. Open a picking for this product in Barcode 2. Change the lot/serial The frontend will send an `onchange` request that includes `product_stock_quant_ids` in the `fields_spec` (with default `limit` 40). Odoo will fetch all quants for this product regardless of the limit, and the request will take a while to resolve. ## Benchmark: <table> <thead> <tr> <th># of quants</th> <th>Before</th> <th>After</th> </tr> </thead> <tbody> <tr> <td>17193</td> <td>~9s</td> <td>~400ms</td> </tr> </tbody> </table> opw-6041705 Forward-Port-Of: odoo/odoo#261904 Forward-Port-Of: odoo/odoo#259983
This update resolves an issue where users without HR access rights couldn't apply filters in the Time Off overview search. The fix adjusts the search domain to avoid errors related to a field not present in the public employee model, ensuring all users can effectively filter their time off data.
Original PR description
More general fix for https://github.com/odoo/enterprise/pull/113973 or https://github.com/odoo/enterprise/pull/115478 Steps to reproduce: - Log using a user with no HR access rights (e.g. Marc Demo) - Go to Time Off > Overview - Remove all filters - Add a new custom filter on "Department is equal to ..." or "Job is equal to ..." Instead of the filter being applied, a traceback occurs. This originates from the fact that in _get_gantt_data_groupby_employee, the employee domain is mapped to address the field current_version_id. However, if a user has no HR rights, the search will be redirected to the employee public model, on which that field isn't defined. This commit adapts the domain in search_fetch to avoid current_version_id being present in it. No related task Co-authored by @BeBel42 Forward-Port-Of: odoo/odoo#261937
This update adds a new test case to ensure that employees with public access permissions can correctly view their holiday schedules within the HR Gantt chart. This resolves a previous issue and strengthens the security and reliability of the HR module. It ensures consistent access for all users.
Original PR description
Add a test for the issue resolved in https://github.com/odoo/odoo/pull/261937 No related task Forward-Port-Of: odoo/enterprise#115593
This update prevents a bug where the shared worker's response processing could get stuck, leading to delays. The fix ensures that only one promise is created when `isOnMainTab` is called, improving responsiveness and stability. This resolves a technical issue that could have impacted user experience.
Original PR description
Whenever `isOnMainTab` is called, it creates and returns a new promise that will be resolved once the shared worker sends its response. However, if `isOnMainTab` is called twice in quick succession, before the shared worker answers, only the last promise is resolved, leaving the first one hanging forever. This commit fixes the issue by not recreating a promise if there is already one pending. Forward-Port-Of: odoo/odoo#262021
This update corrects a minor visual issue where icons within thumbnails weren't positioned correctly. The change adjusts the base layout to allow for overrides, ensuring a consistent and professional appearance for attachments. This improves the overall user experience.
Original PR description
We modify the base layout to allow a fix of the icon position in an override. Task-5152517 Forward-Port-Of: odoo/odoo#261299 Forward-Port-Of: odoo/odoo#249055
This pull request addresses several minor bugs in the Documents module, enhancing the user experience. Specifically, it fixes issues with scrolling after file uploads, the placement of icons in thumbnails, and incorrect badge display with long user names. These changes improve stability and visual consistency.
Original PR description
[FIX] documents: scroll to uploaded record How to reproduce: - install documents - open the "All" folder and ensure there is enough folder to not see any file - open the detail panel - drag&drop file…
[FIX] documents: scroll to uploaded record How to reproduce: - install documents - open the "All" folder and ensure there is enough folder to not see any file - open the detail panel - drag&drop file in that folder The file is uploaded, but you have to scroll to it to see it. Moreover, despite the file being selected, it's not shown the detail panel. We solve the problem here by waiting the record to be rendered before scrolling to it and notify the detail panel. [FIX] documents: fix icon position in thumbnail How to reproduce: - install documents - open the chatter of a document - click on log a note, and upload a file The "trash" icon/button in the thumbnail is weirdly positioned (neither centered, neither on a border). We fix here the position the icon/button. [FIX] documents: fix "you" badge layout How to reproduce: - install documents - change the name of Mitchell Admin to a very long name - open the share panel owned by Mitchell Admin The "You" badge is not correctly displayed (the badge appears as "Y..." instead of "You" and the shape is not correct). We fix here the layout of the badge in such configuration. Task-5152517 Forward-Port-Of: odoo/enterprise#115103 Forward-Port-Of: odoo/enterprise#107686
This update resolves a bug that prevented users from scheduling rental tours correctly. Previously, attempts to set times in the past were rejected, leading to broken booking processes. The fix ensures tours always use valid, future dates, improving the reliability of the rental booking experience.
Original PR description
Since 605c8b47d52854e36c7cb822ccb2d40de44c4c3c, rourly rental products default to a rental period starting at the next hour of the current day. Tours override the time of the rental period, but not the date. If the tours tries to set a time which is in the past, the datepicker will discard the time, breaking the tour. Scenario: Running the tour between 11am-11:59am breaks test_website_sale_renting_ui: - Product page shows default times: today 12pm (start) to 1pm (end) - Tour tries to set start time to 8am - Datepicker rejects 8am (it's before the current time 11am-11:59am) and keeps 12pm - Tour then sets end time to 12pm, resulting in equal start and end times - Equal times are invalid, cart addition fails, tour breaks This commit, extracts the existing utility function into a shared helper that returns a guaranteed future date (next Monday + offset), ensuring tours always set valid times regardless of when they run. runbot-243459
8 changes
New functionality added to Odoo
This update introduces a new 'tare' mode specifically for Toledo scales within the Odoo system. This allows users to accurately measure items by resetting the scale to zero before each measurement, improving data accuracy for inventory tracking. This enhancement supports a key feature for businesses utilizing Toledo scales.
Original PR description
This PR adds the tare mode for Toledo scales. Related PR: https://github.com/odoo/odoo/pull/253328 Forward-Port-Of: odoo/odoo#262027
Enhancements to existing features
This update expands the width of the Discuss sidebar to better utilize screen space, particularly on larger displays. This allows users to see more of the chat conversation details and improves the overall layout. The change ensures the sidebar adapts to different screen sizes for a more configurable experience.
Original PR description
Prior to this commit, the left sidebar in Discuss had a max width of 300px. This commit allows larger widths based on the screen width. This is dependent on screen width, similar to…
Prior to this commit, the left sidebar in Discuss had a max width of 300px. This commit allows larger widths based on the screen width. This is dependent on screen width, similar to o-mail-ActionPanel.o_resizable_panel. It also removes the styling setting the max width to 300px. This helps make discuss more configurable, and makes it possible to see more of the description in live chat conversations. The sizes are set to match the max size of the right panel, so that they don't overlap, and there's suitable space in the center for the chat itself. Related to 221559 task-6180965 (Screenshots below show the worst case-scenario, where both the left and right panels are expanded to their max size) Before (Screen width > 1200px): <img width="1291" height="965" alt="image" src="https://github.com/user-attachments/assets/952d6c4b-60fd-47b9-aff7-8e034a2ee752" /> After: Screen width > 750px: <img width="1291" height="964" alt="image" src="https://github.com/user-attachments/assets/1120da2d-a434-4b3b-b387-f1d29bf0cb91" /> Screen width > 1200px: <img width="1291" height="965" alt="image" src="https://github.com/user-attachments/assets/47c6c981-0c62-43b6-8634-c6d644c342bb" /> Screen width > 1600px: <img width="1291" height="964" alt="image" src="https://github.com/user-attachments/assets/2945c964-5847-456b-b982-09086f335860" /> Screen width > 2300px: <img width="1291" height="965" alt="image" src="https://github.com/user-attachments/assets/c8cbc63f-025b-463d-9a3a-c84fce87d223" />
This update adjusts Odoo's reporting to align with new Indonesian tax regulations (Act 2025). Previously, reports relied on specific tax sections, but now they utilize report line names and tax tags for accurate calculations. This ensures compliance and accurate reporting of TDS/TCS taxes.
Original PR description
In this commit, the XLSX export and report warning are adapted to support the newly introduced TDS/TCS reports as per Act 2025. Previously, the XLSX reports depended on TDS/TCS sections. However, with Act 2025, certain taxes no longer have associated sections. This dependency has been removed, and report generation now relies on report line names and tax tags instead. task-6124431 Forward-Port-Of: odoo/enterprise#115679 Forward-Port-Of: odoo/enterprise#113916
Resolved issues and error corrections
This update resolves an issue in the Gantt planning view where the Plan dialog incorrectly filtered out unscheduled shifts for resources with no scheduled shifts. The fix ensures the dialog displays all relevant unscheduled shifts, improving the accuracy of resource scheduling and planning.
Original PR description
Steps to Reproduce --- 1. Open the Planning Gantt view. 2. Click a cell that belongs to a resource with no scheduled shifts. 3. The Plan dialog opens with an empty list. Issue --- In saas-19.2, the context field for the selected resource was renamed from resource_id to resource_ids. Hence it remained in the dialog context. Current Behaviour --- The Plan dialog is filtered by resource_ids, returning no results for unscheduled resources. Expected Behaviour --- The dialog should list all unscheduled shifts matching the resource's roles, or all unscheduled shifts if no roles are defined, while preserving the scheduling context once a shift is selected. Fix --- Set search_default_resource_ids to false in getSelectCreateDialogProps(). task-4922525
This update resolves an issue where transcription summaries were incorrectly duplicated across multiple chat records. The fix ensures summaries are now only posted to the relevant chatter, and also corrects a previous error that occurred when closing the composer window. This improves the user experience and prevents redundant notifications.
Original PR description
Before this commit, there was an issue where the message of the transcription summary would get posted to the chatters of all records of a given model. With this commit, the message is only posted on the current chatter. This commit also fixes a regression where closing the composer window would cause an exception to occur. task-6147951
This update resolves an issue where printers connected as IoT devices weren't correctly loaded within the Point of Sale system. Previously, these printers were unusable. This change ensures all printers, regardless of their IoT connection, are properly integrated into the PoS workflow.
Original PR description
preparation printers were not loaded in PoS as IoT devices making them unusable. Forward-Port-Of: odoo/enterprise#115768
This update adjusts the checksum calculation for the IoT scale certified module to align with recent changes in the related iot_drivers module. This ensures data integrity and stability for users relying on this certified version of Odoo Enterprise. It's a routine maintenance update.
Original PR description
This PR adapts the expected checksum for the scale certified module corresponding change in iot_drivers module Forward-Port-Of: odoo/enterprise#115771
A bug was causing the appointment builder to crash when editing appointments. This update corrects a misconfiguration that was sending incorrect data, preventing the builder from reloading properly after changes. This ensures a smoother and more reliable experience for users editing appointments.
Original PR description
'Reload' was wrongly passed as a prop to BuilderContext in 'Appointment Type' Option. This ended up in a traceback when user opened the builder on an appointment page. To see the issue: - Create an appointment, and go to its frontend page in debug mode - Start editing - Click anywhere on the page => Traceback We also replace `isReload` with `reload` in order to reload the page when applying the actions. task-6147936 opw-6144915 Forward-Port-Of: odoo/enterprise#115506
6 changes
Resolved issues and error corrections
This update resolves a minor configuration issue within Odoo's settings file (odoo.conf). Specifically, the way the Egyptian token is accessed has been corrected to use 'options' instead of 'default'. This change ensures proper functionality and avoids potential retrieval problems.
Original PR description
This PR fixes the section used to retrieve the egyptian token in odoo.conf file for it to be "options" instead of "default" Related PR: https://github.com/odoo/odoo/pull/255121 Forward-Port-Of: odoo/odoo#262006
This update resolves an issue where the 'PayableRoundingAmount' was incorrectly calculated as a cash rounding. The fix creates the invoice first and then applies post-fix adjustments to the untaxed amount, aligning with standard tax rounding methods. This ensures accurate invoice generation and compliance with UBL standards.
Original PR description
PayableRoundingAmount is not necessarily a cash rounding. It might also be the difference between the untaxed amount per line regarding the global untaxed amount due to the global tax rounding method. The idea in this commit is to create the invoice first and then, just like the code fixing the taxes, to post fix the untaxed amount after. opw-6151984 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260992
This update corrects a bug where changing a task's project would reset its state (done or canceled) unnecessarily. Now, when a task is marked as done or canceled, its state remains consistent even if the project is changed, ensuring accurate task tracking. This improves data reliability and workflow efficiency.
Original PR description
Before this commit, when the project of a task is changed, even if the state of that task is done or cancelled, the state is reset (except if the task is blocked by another one). This behavior is not expected for a task done/cancelled, we should not reconsider that task since it has been done/cancelled and so there is no reason to re-consider it once the project changed. This commit makes sure the state of the task is not reset when the project changed only if the state is a closed state or Waiting state. task-5361864 Forward-Port-Of: odoo/odoo#261648 Forward-Port-Of: odoo/odoo#252752
This update fixes an issue where invoices were incorrectly including non-validated timesheets in sales orders. The change ensures that invoices only reflect the quantity of timesheets that have been fully validated, aligning with the 'only validated TS' invoicing policy. This prevents over-invoicing and maintains accurate financial records.
Original PR description
**Steps to reproduce** - Settings: Timesheets > Invoicing policy = only validated TS. - Have a service product with an invoicing policy based on timesheets. - Create a sales order using this product.…
**Steps to reproduce** - Settings: Timesheets > Invoicing policy = only validated TS. - Have a service product with an invoicing policy based on timesheets. - Create a sales order using this product. - From the SO, click on the "Recorded" smart button and create 2 timesheets. Validate only one of them. - Invoice the SO, using a timesheets period that includes both TS. - Notice that the quantity of the invoice line includes the non-validated timesheet. **Cause** The domain excluding non-validated timesheets provided by `_timesheet_compute_delivered_quantity_domain` is not considered since c3b6053b09222d4bd2237e7de589a63fbef118f1 **Change** Since the purpose of the previous fix was to exclude timesheets linked to an invoice with a date before the "Invoicing Switch Threshold", this can be achieved by tweaking the `timesheet_domain` slightly, similar to the `_timesheet_domain_get_invoiced_lines` domain. opw-6116670 Forward-Port-Of: odoo/odoo#261621 Forward-Port-Of: odoo/odoo#259224
A technical bug was causing the appointment builder to crash when editing appointment types. This update corrects a mistake where unnecessary 'reload' information was being passed, preventing the builder from functioning correctly. This ensures a smoother experience for users editing appointment types.
Original PR description
'Reload' was wrongly passed as a prop to BuilderContext in 'Appointment Type' Option. This ended up in a traceback when user opened the builder on an appointment page. To see the issue: - Create an appointment, and go to its frontend page in debug mode - Start editing - Click anywhere on the page => Traceback We also replace `isReload` with `reload` in order to reload the page when applying the actions. task-6147936 opw-6144915 Forward-Port-Of: odoo/enterprise#115506
A recent issue causing the Enterprise portal's tour to fail has been resolved. The problem stemmed from errors with the worksheet's auto-saving and rendering, which disrupted the tour's functionality. This update ensures the tour operates correctly within the portal.
Original PR description
The worksheet is not auto saving and the worksheet is not rendering properly in portal, which caused the tour to fail. runbot error-242479 Forward-Port-Of: odoo/enterprise#115761
2 changes
Resolved issues and error corrections
This update resolves a bug that caused crashes when sending invoices with attached images. The system incorrectly synced orphaned attachments, leading to versioning conflicts and data loss. The fix ensures attachments are properly linked during the printing process, improving invoice reliability.
Original PR description
Steps to reproduce: - Set a journal with documents folder sync. - Create and post a customer invoice. - Add an image attachment via a log note. - Click Send & Print. -> KeyError:…
Steps to reproduce: - Set a journal with documents folder sync. - Create and post a customer invoice. - Add an image attachment via a log note. - Click Send & Print. -> KeyError: `proforma_pdf_attachment` Cause: Adding an image via log note sets it as the main attachment, but it is intentionally orphaned (res_model=False) to prevent UI clutter. `documents_account` incorrectly syncs this unlinked file, creating a workspace document with a missing model. During "Send & Print", the official invoice PDF replaces the image as the main attachment. The document versioning logic intercepts this swap and attempts to re-parent the new PDF to match the orphaned document. This destroys the PDF's linkage to the invoice, causing a crash when the system later attempts to fetch the PDF. Solution: Since the base module now suppresses premature document creation during the message post, we explicitly handle the sync ourselves. We override `_fix_attachments_on_record_from_files_data` to iterate over the validated attachments and trigger document creation only for files that retained their `res_model`. We also add a check inside `_update_or_create_document` to strictly block orphaned attachments. opw-5930888
This update resolves an error preventing the import of emissions data, specifically those linked to journal entries. The fix restricts imports to manual emissions (other.emission) to avoid database update conflicts. This ensures the emissions reporting functionality operates smoothly.
Original PR description
The import button is present in the Emitted Emissions menu, but it produces the following error: "cannot insert into view 'esg_carbon_emission_report' DETAIL: Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." => To fix this, we will only allow the insertion of manual emissions (model: other.emission) via import, not emissions related to journal entries. task-6168587 Forward-Port-Of: odoo/enterprise#115306
4 changes
Resolved issues and error corrections
This update stops invitations from being automatically sent when new people are added to events that have already occurred. This prevents unnecessary notifications and improves the user experience by only sending invitations for events that are currently happening or scheduled for the future. This was a previously reported issue (OPW-6125052) resolved by backporting a fix from the 19.0 release.
Original PR description
Backport of fix in 19.0 (https://github.com/odoo/odoo/pull/259844) Prevents invitations to be triggered when adding new attendees to an event in the past. OPW-6125052 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261825 Forward-Port-Of: odoo/odoo#260050
This update fixes a slow performance issue that occurred when searching for stock quantities with a large number of items. The change ensures that Odoo respects the specified limit during these searches, dramatically reducing the time it takes to retrieve data. This improves the responsiveness of key features like picking and barcode operations.
Original PR description
## Problem: During an `onchange` call, if a field is defined in the `fields_spec` with a `limit` attribute, the `fetch` method doesn't respect it, and will fetch all records satisfying the domain. In certain circumstances, this leads to slow requests. ## Solution: Enforce the `limit` when fetching if it is present. ## Steps to reproduce: - Have a product with many quant records 1. Open a picking for this product in Barcode 2. Change the lot/serial The frontend will send an `onchange` request that includes `product_stock_quant_ids` in the `fields_spec` (with default `limit` 40). Odoo will fetch all quants for this product regardless of the limit, and the request will take a while to resolve. ## Benchmark: <table> <thead> <tr> <th># of quants</th> <th>Before</th> <th>After</th> </tr> </thead> <tbody> <tr> <td>17193</td> <td>~9s</td> <td>~400ms</td> </tr> </tbody> </table> opw-6041705 Forward-Port-Of: odoo/odoo#259983
This update fixes an issue where invoices in multi-company branches weren't correctly calculating prices with taxes included. Previously, the unit price didn't adjust to exclude the original tax. This change ensures accurate pricing and tax calculations when using fiscal positions across different company branches.
Original PR description
When operating in a multi-company branch environment, the unit price of a product with price-included taxes is not correctly recalculated when applying a fiscal position. Steps to reproduce: - Create a tax that is included in the price (e.g., 10% incl). - Assign this tax to a product (e.g., Product A). - Create a fiscal position that maps this 10% tax to a different tax. - Create a branch (child company) of your main company. - Create an invoice in the new branch using the fiscal position and add an invoice line for Product A. Issue: The unit price of the product on the invoice line remains the full tax-included amount rather than being reduced to exclude the original 10% tax. opw-5931302 Forward-Port-Of: odoo/odoo#260840 Forward-Port-Of: odoo/odoo#256897
This update resolves an issue where the 'PayableRoundingAmount' was incorrectly calculated as a cash rounding. The fix creates the invoice first and then applies post-fix adjustments to the untaxed amount, aligning with standard tax rounding methods. This ensures accurate invoice processing and reporting related to UBL and CII standards.
Original PR description
PayableRoundingAmount is not necessarily a cash rounding. It might also be the difference between the untaxed amount per line regarding the global untaxed amount due to the global tax rounding method. The idea in this commit is to create the invoice first and then, just like the code fixing the taxes, to post fix the untaxed amount after. opw-6151984 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260992
1 change
Resolved issues and error corrections
This update fixes an issue where report data, particularly those using the 'From the very start' period, was not sorted correctly. The change ensures that string-type external values are properly ordered by date when using the 'most_recent' formula, improving report accuracy and reliability.
Original PR description
Ensure string-type external values are correctly sorted by date when using the "most_recent" formula. This resolves an issue where values appeared unordered, especially for expressions using the "From the very start" period. task-5951888 Forward-Port-Of: odoo/enterprise#114666 Forward-Port-Of: odoo/enterprise#113837
13 changes
Enhancements to existing features
This update streamlines the softphone interface by simplifying the pill design and improving clarity. The changes include a visual update to recording and transcription indicators, as well as a removal of the 'On hold' pill. This enhances the user experience and reduces confusion.
Original PR description
Before this PR, the design of the pills were not consistent and a bit confusing. Instead, the recording pill is replaced by a red recording circle, the transcribing pill is replaced by the…
Before this PR, the design of the pills were not consistent and a bit confusing. Instead, the recording pill is replaced by a red recording circle, the transcribing pill is replaced by the "Transcribing..." text and the On hold pill is taken out. In the active state of the Hold and Record/Stop button the text is changed respectively to text-warning and text-danger. Before, the "transcribing" status depended on the recording status to be displayed, now it can be displayed whether or not the call is being recorded. task-5882281 | | Before | After | |--------|--------|--------| | Hold | <img width="389" height="689" alt="Screenshot 2026-03-17 at 15 39 44" src="https://github.com/user-attachments/assets/27f3f08e-40ae-440d-8024-2f16484b8e32" /> | <img width="389" height="689" alt="Screenshot 2026-03-16 at 16 17 33" src="https://github.com/user-attachments/assets/4ff3e9ba-a2e4-4d0d-9e3d-eccc32c9e8c8" /> | | Hold + Transcribing | <img width="389" height="689" alt="Screenshot 2026-03-16 at 16 18 33" src="https://github.com/user-attachments/assets/96344c97-d56e-4887-bb16-94518b48faec" /> | <img width="389" height="689" alt="Screenshot 2026-03-17 at 15 38 01" src="https://github.com/user-attachments/assets/5246614b-d18e-42ef-b84e-1ed783a700d2" /> | | Hold + Record | <img width="389" height="689" alt="Screenshot 2026-03-16 at 16 25 01" src="https://github.com/user-attachments/assets/cde4cd38-9162-4f36-bd91-faba26d71556" /> | <img width="389" height="689" alt="Screenshot 2026-03-16 at 16 24 31" src="https://github.com/user-attachments/assets/af8fa55a-73cd-452d-924d-735d5ea2ff09" /> | | Hold + Record + Transcribing | <img width="389" height="689" alt="Screenshot 2026-03-16 at 16 18 38" src="https://github.com/user-attachments/assets/09dd22f6-c865-476e-8b02-1ffc92a0da1a" /> | <img width="389" height="689" alt="Screenshot 2026-03-16 at 17 36 08" src="https://github.com/user-attachments/assets/62d7bc4c-2912-4324-8736-e40627048c49" /> | | Record | <img width="389" height="689" alt="Screenshot 2026-03-16 at 16 24 59" src="https://github.com/user-attachments/assets/dc8672d9-a8ba-484e-a1f1-ce3789aaa688" /> | <img width="389" height="689" alt="Screenshot 2026-03-16 at 16 24 27" src="https://github.com/user-attachments/assets/102aea8f-98bf-4898-902f-7981fce37176" /> | | Record + Transcribing | <img width="389" height="689" alt="Screenshot 2026-03-16 at 16 18 50" src="https://github.com/user-attachments/assets/0e24d78a-0a43-4a8e-ab85-7fb5b059d959" /> | <img width="389" height="689" alt="Screenshot 2026-03-16 at 17 36 05" src="https://github.com/user-attachments/assets/d2f56fdf-ad6b-4aaa-9eeb-39c47407c903" /> | | Transcribing | <img width="389" height="689" alt="Screenshot 2026-03-17 at 15 39 00" src="https://github.com/user-attachments/assets/38ed1208-8b8c-4d34-89f9-e0c756bef49b" /> | <img width="389" height="689" alt="Screenshot 2026-03-17 at 15 37 54" src="https://github.com/user-attachments/assets/f0eb6ebd-6a51-49e0-ac74-44ebfed7a23b" /> | | Forced Record + Forced Transcribing | <img width="389" height="689" alt="Screenshot 2026-03-17 at 15 47 39" src="https://github.com/user-attachments/assets/57635d0d-60ac-4c2c-81b0-016dde2461a9" /> | <img width="389" height="689" alt="Screenshot 2026-03-17 at 15 44 27" src="https://github.com/user-attachments/assets/59cba9d5-5d4f-4589-a5f0-c9484007c618" /> |
This update adjusts the XLSX export reports to align with new Indonesian tax regulations (Act 2025). Previously, reports relied on specific tax sections, but now they utilize report line names and tax tags for accurate reporting. This ensures compliance with updated tax requirements.
Original PR description
In this commit, the XLSX export and report warning are adapted to support the newly introduced TDS/TCS reports as per Act 2025. Previously, the XLSX reports depended on TDS/TCS sections. However, with Act 2025, certain taxes no longer have associated sections. This dependency has been removed, and report generation now relies on report line names and tax tags instead. task-6124431 Forward-Port-Of: odoo/enterprise#115679 Forward-Port-Of: odoo/enterprise#113916
Resolved issues and error corrections
This update resolves a problem where the OCR success banner and 'Reload AI data' button disappeared after an invoice was reset to draft. It also corrects an internal error where an incorrect state was used, ensuring the document previewer boxes interface functions correctly. This improves the user experience when invoices are corrected.
Original PR description
When an invoice sent to the OCR was reset to draft after being posted, few UI problems were occurring: - The OCR success banner would appear, but couldn't be interacted with. It shouldn't appear at all as the results of the OCR were already fetched at this point. - The "Reload AI data" button wasn't showing. - The boxes interface wasn't available on the document previewer. This commit also fixes occurrences of extract state `validation_to_send` used instead of `to_validate` (the state `validation_to_send` never was a valid value for `extract_state`, so not sure where that came from). opw-none
This update corrects a calculation error in the 2033D-2 report for French tax filings. Specifically, the report was incorrectly summing the amounts of dynamic lines, leading to inaccurate totals. This fix ensures the report accurately reflects financial data for compliance purposes.
Original PR description
Fixed an issue where the total aggregation for line I-C in the 2033D-2 report didn't add the amount of dynamic lines. no task id Forward-Port-Of: odoo/enterprise#115434
This update ensures that missing payslip alerts are triggered only when the payroll closing date has passed. Previously, alerts were raised regardless of the closing date status. This change improves the accuracy of payroll reporting and helps ensure timely payment processing, particularly around end-of-period payroll runs.
Original PR description
In this commit, missing payslip in a payrun issue will be raised only if the payroll closing date is due (old conditions remains). task-6008297 Forward-Port-Of: odoo/enterprise#115646 Forward-Port-Of: odoo/enterprise#112182
This pull request removes a temporary workaround implemented to address an issue with insurance reporting in Spain. The change removes a conditional statement and associated TODO note that were introduced as a temporary fix. This improves the stability and accuracy of the Spanish tax reporting module.
Original PR description
Remove the TODO comment and if condition introduced [here](https://github.com/odoo/enterprise/pull/100413#pullrequestreview-3924342281) task-5214023
This update fixes an issue where byproducts added directly to manufacturing orders weren't correctly linked to stock movements. Now, byproducts added to MOs are accurately tracked, ensuring correct inventory updates and reporting. This improves the accuracy of production tracking and reduces potential discrepancies.
Original PR description
When we add a byproduct followed by SN directly in the MO it will not have the its location as production. Steps to reproduce: ------------------- * Create product tracked by Serial number * Create a…
When we add a byproduct followed by SN directly in the MO it will not have the its location as production. Steps to reproduce: ------------------- * Create product tracked by Serial number * Create a Manufacturing order * Add the Product tracked by serial number on the MO as byproduct * Confirm the MO * Go to shop floor * Add the by-product quantity and create a new serial number. * Close production and go back to the MO in manufacturing * Open stock moves -> the by-product does not have "production" for origin Observation: ------------- When we add the byproduct directly in the MO, they will be added to move_byproduct_ids in the MO but not in byproduct_ids on the stock.move because byproduct_ids it's a [link](https://github.com/odoo/odoo/blob/d14bf6289da21065860ff959185c47b947a7418c/addons/mrp/models/stock_move.py#L50-L52) between the stock.move and the BOM. When adding the byproduct in shopfloor, it will create the quant: https://github.com/odoo/enterprise/blob/06be616bb4d74f0a089e8e318d25c2424594f813/mrp_workorder/static/src/mrp_display/mrp_record_line/stock_move.js#L163-L171 Additionaly when creating the quant it will decide the source location depending if the product its a byproduct: https://github.com/odoo/enterprise/blob/1d10ee238a50e7bdb552efdeafc068c5127cd49a/mrp_workorder/static/src/mrp_display/mrp_record_line/stock_move.js#L189-L192 The issue arise because it check if the product it's a byproduct by checking byproduct_ids and since our product was added directly on the MO and not from the BOM it will not appear in byproduct_ids https://github.com/odoo/enterprise/blob/dc5bb0fe8e15063f977970841bdaf8aff1a61e41/mrp_workorder/static/src/mrp_display/mrp_record_line/stock_move.js#L108-L110 #### Additional notes: The default value for [byproduct_id](https://github.com/odoo/odoo/blob/abb5777cc8324cff0cdf841a8ae42413060dcf92/addons/mrp/models/mrp_production.py#L1263) when creating the stock move is false opw-5974582 Forward-Port-Of: odoo/enterprise#115548 Forward-Port-Of: odoo/enterprise#110122
A bug was causing timesheets to be incorrectly linked to other employees when created through the timesheet systray. This was due to a formatting error in how user IDs were passed during the timesheet creation process. This update corrects the issue, ensuring timesheets are accurately recorded for the intended user.
Original PR description
# Steps to reproduce: - Open a billable project and a task - Open the timesheet systray - Create timesheet # Current behaviour The timesheet is recorded for another employee. # Root cause This happens because the `user_id` passed to the record update was lacking the right `[id, name]` format. As a consequence, the timesheet was created without a user (`False`), thereby linking it to another employee than the current user. task-6169253 Forward-Port-Of: odoo/enterprise#115420
This update corrects a minor issue where the 'delete' option was missing from certain reports related to returns and checks. This was caused by lingering references to the default 'new' state value after a database optimization was implemented. The fix ensures the 'delete' option is consistently available, improving usability.
Original PR description
In odoo/enterprise#103149, the default value for the state of the returns and checks were removed to use False by default to reduce space in the database. However, a few reference were left using the default value which was 'new'. To reproduce (using working files): - Create a working files - Open the menu of the working file in the working files kanban view - The option delete isn't present Forward-Port-Of: odoo/enterprise#115513
This update resolves a problem where the size of the product search bar was incorrectly set, causing issues with a website tour. The change ensures the size attribute is only applied to the product search bar, preventing disruptions to other website search functionalities. This improves the stability and reliability of the website.
Original PR description
__Before commit__ odoo/enterprise@1111381c set the size attribute of the product search bar. However, the view inherits from `website.website_search_box`, which means that all search boxes on the website will have the size attribute set if `website_sale_renting` is installed. The tour `dropdowns_and_header_hide_on_scroll` fails in saas-19.3 because odoo/odoo@9394e17a added a step that depends on the size of the main website search bar, which may vary because of this. __After commit__ Only set the size attribute to the product search bar as intended. runbot-242449 Forward-Port-Of: odoo/enterprise#115433
This update adds a new test case to ensure that public employees can correctly access holiday information within the Gantt view. This fix addresses a previous issue and strengthens the overall reliability of the HR holiday scheduling functionality. It ensures consistent access for all employee types.
Original PR description
Add a test for the issue resolved in https://github.com/odoo/odoo/pull/261937 No related task Forward-Port-Of: odoo/enterprise#115593
This update resolves an issue where exporting VSME reports would fail if the base year was not a standard 4-digit year. The fix adds validation to ensure only valid years are used, preventing errors and ensuring report generation works correctly. This improves data reliability for VSME reporting.
Original PR description
Currently, an error occurs when exporting VSME reports if the base year is not a valid 4-digit year. **Steps to Reproduce:** 1. Install the `esg_csrd` module with demo data. 2. Create new "**VSME Reports**" with `Base Year = 1`. 3. Now, click on "**Print**". **Error:** `ValueError - Invalid isoformat string: '1-01-01'` **Cause:** The base year is directly used to build a date in [1], resulting in `datetime.date(1, 1, 1)`. In [2], this is formatted to **"1-01-01"** and used in a domain search, which raises a ValueError due to an invalid ISO date format. **Fix:** - Adds a **constraint on base year** to ensure only valid years (1000–9999) are allowed for new VSME Report records. - Adds a **helper validation method** to verify base year before performing computations on existing records. sentry-7419431039 Forward-Port-Of: odoo/enterprise#115725 Forward-Port-Of: odoo/enterprise#114453
Code cleanup and technical improvements
This update merges changes related to Dutch SBR tax reporting, previously handled through a bridge module. The changes streamline the process by integrating the functionality directly into the core `l10n_nl_reports` module, reducing complexity and improving efficiency. This enhances the accuracy and reliability of Dutch SBR tax reporting within the Odoo Enterprise system.
Original PR description
In version `19.0`, a bridge module was introduced (see a6a8d121bbf2044793df5211c5bdb18859a62152) to improve the Dutch SBR tax reporting process. This bridge module's sole purpose was to allow the addition of stored fields within a stable version. As we are now in master, these changes are merged directly into `l10n_nl_reports` to reduce module overhead.
6 changes
Resolved issues and error corrections
This update refines how Odoo automatically matches bank statements to invoices. Previously, it prioritized the closest date, which wasn't always accurate. Now, it only matches if there's one prior bank statement candidate, ensuring more reliable reconciliation and reducing potential errors.
Original PR description
Before this pr, we decided that when there was multiple candidates, we would take the one closer to the date of the statement line but it is not always what we want. We decided to change that so that it would match only if there is one candidate prior the date of the statement line. Exemple: Invoice 1 the 10/06 and invoice 2 the 20/06 → Payment the 05/06 → no matching (0 before) → Payment the 15/06 → match with invoice 1 (only 1 before) → Payment the 25/06 → no matching (More than 1 invoice open before) task-6143809
This update fixes an issue where financial reports (Balance Sheet, P&L, Tax Report) were printed with zoomed-in views due to a default paper format setting. The change ensures reports now use the standard Euro paper format, resolving the printing problem and improving report clarity.
Original PR description
for financial reports DIN 5008 paper format (dpi=70, postal margins) was applied to all reports because it is set as the company default by both the Swiss and German localizations. This caused financial reports (Balance Sheet, P&L, Tax Report) to appear zoomed in when printed to PDF. DIN 5008 is only appropriate for documents sent by post (invoices, credit notes, follow-up letters). Override `get_paperformat` in each localization to return the standard Euro format when rendering accounting reports. task-6053938
This update fixes a previous issue where users wouldn't receive any notification when their phone number country wasn't supported for SMS card details. Now, users receive an email notification, and a more robust error system is implemented for flows lacking email fallbacks, ensuring better user experience and troubleshooting.
Original PR description
When a user request the card details, if the country of the phone number of the user isn't supported by IAP, it would silently fail. Now, we are sending an email in case the phone number isn't supported. In case some flow don't/can't have any email fallback, we will add the a generic error and a more detailed one for the country not being supported. task-6065232
This update prevents users from accidentally modifying core return type settings within the master data. This change ensures that small adjustments don't disrupt critical business processes. Users can still add new return types without restriction.
Original PR description
Backport of [0a6328d](https://github.com/odoo/enterprise/commit/0a6328d4cecc1d931cd29f83a9d8efd6d32f19db) to resolve opw-6107995 Issue: - Users can easily edit return types coming from master data. - Even small experiments (e.g., changing category or states) may break critical behavior. Solution: - For such records, made critical fields (category and states) readonly in the form view. - User added records remain fully editable. Impact: - Prevents accidental or harmful changes to predefined return types. - Still allows users to add their own return types safely. TaskID-5060125 Part-of: odoo/enterprise#93874
This update fixes a technical issue that caused error tracebacks when users attempted to generate tax reports without a valid certificate. Now, users will receive a helpful message guiding them to set up a certificate, preventing the tracebacks and ensuring smooth report generation.
Original PR description
Description of the issue this commit addresses: When sending the tax report or ec sales list xbrl file via the wizard to the authority, if no certificate has been set, a traceback shows up. This happens because some processes try to use the certificate without checking its existence. Desired behavior after the commit is merged: When sending via the xbrl wizard, if no certificate has been set up, an error offering the user to go to the certificate set up shows up and no traceback. task-6065382
This update resolves an issue where the system incorrectly skipped remuneration declarations in certain payroll scenarios, particularly when employees had no worked days in a period but still received a bonus. The change ensures accurate calculation of all required remuneration declarations, improving payroll accuracy for Belgian businesses.
12 changes
Resolved issues and error corrections
The customer list view was displaying incorrect totals due to a missing currency field. This update ensures accurate calculations for 'Total Due' and 'Total Overdue' columns, resolving the issue of empty dashes appearing in the totals section. This improves the reliability of financial reporting within the system.
Original PR description
In the partner list view, enabling the "Total Due" and "Total Overdue" columns results in empty aggregates (—) at the bottom of the list. Steps to reproduce: - Navigate to Accounting -> Customers -> Customers - Add columns 'Total Due' and 'Total Overdue'. - Check the computed totals. Issue: The totals displays dashes (—) instead of the numbers. Analysis: The web client list renderer requires a currency field to be present in the view to correctly format and display aggregate sums for monetary fields, otherwise empty dashes are shown as fallback. opw-6169513
This update corrects a bug where B2C customer EDI invoices incorrectly prioritized the phone number over the mobile number. The fix ensures the mobile number is used as the primary contact information, improving data accuracy for electronic invoices and compliance with tax regulations. This change impacts how customer contact details are transmitted in EDI formats.
Original PR description
Current behavior: -- B2C partner type used `partner.phone` instead of `partner.mobile` for the `CustomerPhone` EDI JSON field, ignoring mobile even when present. Expected behavior: -- B2C prioritizes `partner.mobile`, falls back to `partner.phone` when mobile is absent. Steps to reproduce: -- 1. Create B2C partner with both mobile and phone set. 2. Generate EDI invoice JSON. 3. Observe `CustomerPhone` uses phone instead of mobile. If the `phone` field is instead empty for B2C, an error occurs Cause of the issue: -- B2C branch resolved `partner.phone` as primary instead of `partner.mobile`. Fix: -- B2C now resolves `partner.mobile or partner.phone` before calling `_reformat_phone_number`, ensuring mobile is prioritized with phone as fallback. opw-6120115 - I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a rounding issue that occurred when converting quantities between the same units of measure. Specifically, a discrepancy in the invoice line quantity was causing it to be rounded incorrectly, leading to an inaccurate billed amount. This ensures consistent and correct quantity calculations during import processes.
Original PR description
This function is meant to compute the quantity from one UoM to another UoM, the rounding method parameter is meant to be used in that context. If both UoM are the same, it should use the usual…
This function is meant to compute the quantity from one UoM to another UoM, the rounding method parameter is meant to be used in that context. If both UoM are the same, it should use the usual HALF-UP rounding method. Explanations regarding the bug occurring in the related ticket: - The OCR was matching a purchase order for which one of the lines had a quantity of exactly 6. - When this PO was matched and imported on the vendor bill, the quantity of the related invoice line was rounded to 6.00000000000001. Under normal circumstances, the value would have stayed at 6 after rounding, but because the OCR runs within the context of a `_disable_discount_precision`, this kind of rounding discrepancy is possible. - The billed quantity is then computed based on the quantity on the invoice line, 6.00000000000001. As it is rounded upwards to the nearest two decimals places, the final value is 6.01 instead of the expected 6. opw-[6113387](https://www.odoo.com/odoo/my-support-tasks/6113387)
This change fixes an issue where products were incorrectly displayed on the website when viewing from a company other than their designated one. The update ensures product searches respect the currently selected website company, preventing incorrect product visibility and potential sales order errors. This improves data accuracy and user experience.
Original PR description
# Setup Have 2 companies : A & B # How to reproduce - Set your website's company to Company B - Create product X : - Company : Company A - Published - Name : xyz - Go to Users > Any User > Acces…
# Setup
Have 2 companies : A & B
# How to reproduce
- Set your website's company to Company B
- Create product X :
- Company : Company A
- Published
- Name : xyz
- Go to Users > Any User > Acces Rights > Allowed Companies => leave only Company A
- Connect as that user on the website
- Go to the Shop tab and search xyz
# The problem
The product X is displayed, even though we currently use the company B's website and the product is limited to company A.
This causes problem later when Sales Order are created using that product.
If you set the Allowed Companies of the user to both Company A and Company B, then the product is correctly hidden
# Why
When you search something in the search bar, the server does a `_search_with_fuzzy()` that ends up calling a simple `model.search()`.
In our case, this search should not return product X because there is an `ir.rule` that hides product not in the current company :
https://github.com/odoo/odoo/blob/0bb5ac6c1a87367c1ebb343ad6e6e6e56188cf13/addons/product/security/product_security.xml#L34-L38
But the `website` module has some particular rule about setting the current company :
https://github.com/odoo/odoo/blob/0bb5ac6c1a87367c1ebb343ad6e6e6e56188cf13/addons/website/models/ir_http.py#L249-L261
So, in our case, since the user does not have company B in its allowed companies, then
`allowed_company_ids` = Company A. So `('company_id', 'parent_of', company_ids)` is trucy and the product is displayed
# Proposed solution
Doing the search with `with_company` raise an AccessError because the company is not present in the allowed_companies. Chaging the allowed companies logic seems risky because it
may lead to unintended side effects.
We instead enforce the website's company in the search's domain
opw-6115647
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves an issue where tax amounts were incorrectly being added to invoice base amounts when tax information was missing. This ensures accurate tax calculations and reporting for UBL invoices, improving financial data integrity. The change is a straightforward fix to the underlying code.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where discounts weren't correctly applied to vendor bills with products priced at $0.00, even when charges and allowances were present. The fix adjusts the discount calculation to accommodate zero prices, ensuring accurate totals and preventing discrepancies between the imported XML data and Odoo's calculations. This ensures proper financial reporting.
Original PR description
Allowances for Product with price as 0.00 aren't applied Step to reproduce: - import vendor bill from an XML having a product: - price: 0.00 - charge: any positive amount - allowance: any positive amount Current behavior: - allowance isn't apply resulting in a difference between the XML total and Odoo total Cause of the issue: Before this commit the discount was applied as a percent of price only. Having a price as 0 prevent doing so. opw-5499525 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures that when reserving stock for packaged products, the system correctly considers the available quantity of full packages. Previously, a large stock of full packages was incorrectly ignored, leading to inaccurate reservation calculations. This fix now accurately respects the 'Reserve Only Full Packagings' setting.
Original PR description
Issue ----- Forced full packaging reservation setting is ignored when there is a big quant in stock. Steps to reproduce ----- - Enable packagings - Create a product category "Super Category" -…
Issue
-----
Forced full packaging reservation setting is ignored when there is a big quant in stock.
Steps to reproduce
-----
- Enable packagings
- Create a product category "Super Category"
- Reserve Packagings: Reserve Only Full Packagings
- Create a stored product "AAA"
- Product Category: Super Category
- 50 units on hand
- Packaging: 6-Pack (6 units)
- Create a delivery for 15 units of AAA
> Reservation is made for 15 units
Cause
-----
The rounding to a multiple of the packaging quantity takes the stock quant into account. For our example case, we have 8 full 6-Packs on hand, so the `available_quantity` gets set to 48 when doing
https://github.com/odoo/odoo/blob/5e458236ca2ff2ab92c4893495e7a721be902c40/addons/stock/models/stock_quant.py#L923-L925
This leads to the reservation quantity being min(15, 48) = 15
https://github.com/odoo/odoo/blob/5e458236ca2ff2ab92c4893495e7a721be902c40/addons/stock/models/stock_quant.py#L927
-----
Ticket:
opw-5974333
Forward-Port-Of: odoo/odoo#257342This update corrects a visual issue where the Tax ID (DIČ) was incorrectly duplicated on Czech customer invoices. The fix removes a redundant VAT entry from the invoice template, ensuring accurate and professional invoice presentation for Czech businesses. This improves the user experience and compliance with Czech regulations.
Original PR description
**Steps to reproduce:** * Install the **l10n_cz** module. * Create a customer invoice for a Czech company. * Print the invoice. **Observed behavior:** * The **Tax ID (DIČ)** is displayed **twice** in…
**Steps to reproduce:** * Install the **l10n_cz** module. * Create a customer invoice for a Czech company. * Print the invoice. **Observed behavior:** * The **Tax ID (DIČ)** is displayed **twice** in the invoice header in default layout. * **VAT** is displayed **twice** in the invoice headed in folder layout. **Cause:** * The `registry_vat_external_layout` template adds `company.vat` to `company_address_list`. * Base external layouts already include `company.vat` in the same list. * This results in duplicated DIČ rendering. **Fix:** * Remove the redundant VAT `<li>` from `registry_vat_external_layout`. * Keep only the Czech-specific **Company ID** (`company_registry`) entry, which is not provided by base layouts. Before: <img width="900" height="261" alt="image" src="https://github.com/user-attachments/assets/9b5b81aa-a79d-4c93-8109-3c97d79356f4" /> After: <img width="804" height="221" alt="image" src="https://github.com/user-attachments/assets/4b62eddc-6117-4f52-a8fb-2b03812aad8b" /> opw-6125766
This update resolves an error preventing certain users (specifically those without full project access) from viewing project details within the timesheet interface. The fix uses `sudo()` to grant necessary permissions, ensuring these users can access project information as intended. This improves usability for a wider range of users.
Original PR description
### Steps to reproduce: - Download 'Sales', 'Project', 'Employees', and 'Timesheets' apps - Create an employee and link them to a user that doesn't have any access rights except to 'Timesheets =…
### Steps to reproduce:
- Download 'Sales', 'Project', 'Employees', and 'Timesheets' apps
- Create an employee and link them to a user that doesn't have any access rights except to 'Timesheets = User:own timesheets'
- In Sales, create a service with the following specifications:
- 'Create on Order' is 'Project'
- 'Invoicing Policy' is 'Based on Timesheets'
- Create a new quotation that requests this service and click 'Confirm'
- In 'Project' > 'Configuration' > 'Projects', choose the newly created project and add a line that has the new employee in the 'Invoicing' tab
- Log in as that employee and go to 'Timesheets'
- Create a new entry for the newly created project
- Click the project's name
> Access Error: You are not allowed to access 'Collaborators in project shared'
(project.collaborator) records.
### Cause of Issue:
This happens because the user doesn't have access rights to the 'Project' app, hence they don't have access to `collaborator_ids` which are retrieved here. https://github.com/odoo/odoo/blob/3dfb2849acd899ccbf4048f2a15dff3c74aed96d/addons/project/models/project_project.py#L1113-L1120
### Fix:
Since an access to the 'Projects' app isn't necessary to view a project assigned to you, `sudo()` is necessary for hr_timesheet users without project access rights.
opw-6074833This update fixes a slow performance issue that occurred when Odoo fetched inventory data based on 'onchange' events. Specifically, when a user changed a product's lot or serial number, Odoo was retrieving all related inventory records without a limit, leading to delays. This change ensures that Odoo respects the defined limit during these fetches, resulting in significantly faster response times.
Original PR description
## Problem: During an `onchange` call, if a field is defined in the `fields_spec` with a `limit` attribute, the `fetch` method doesn't respect it, and will fetch all records satisfying the domain. In certain circumstances, this leads to slow requests. ## Solution: Enforce the `limit` when fetching if it is present. ## Steps to reproduce: - Have a product with many quant records 1. Open a picking for this product in Barcode 2. Change the lot/serial The frontend will send an `onchange` request that includes `product_stock_quant_ids` in the `fields_spec` (with default `limit` 40). Odoo will fetch all quants for this product regardless of the limit, and the request will take a while to resolve. ## Benchmark: <table> <thead> <tr> <th># of quants</th> <th>Before</th> <th>After</th> </tr> </thead> <tbody> <tr> <td>17193</td> <td>~9s</td> <td>~400ms</td> </tr> </tbody> </table> opw-6041705 Forward-Port-Of: odoo/odoo#259983
This update resolves a technical issue where a duplicate XML ID was being used for a key component of the Kenyan payroll configuration. This duplication caused potential errors and inconsistencies. The fix ensures data integrity and stability for payroll processing within the Odoo Enterprise system.
Original PR description
This commit avoids duplicated xml_id for `hr.salary.rule` model. In commit https://github.com/odoo/enterprise/commit/a7d51fa2ee8b1af0e807b3e9cb6e313d8885ff67, key `l10n_ke_employees_salary_pension_contribution` (sequence 72) was deleted and added key `l10n_ke_employees_salary_pension_contribution` (sequence 35). In commit https://github.com/odoo/enterprise/commit/c23243be9ca833acea7089defadbe0eaf869051d, key `l10n_ke_employees_salary_pension_contribution` (sequence 72) was added again. Forward-Port-Of: odoo/enterprise#85723
This update corrects a bug where the tax amount on purchase bills was incorrectly reset to a default value. The issue stemmed from how the system recomputes taxes after price adjustments on bills, specifically during the bill confirmation process. This fix ensures the tax amount accurately reflects the manual setting.
Original PR description
**Steps to reproduce:** - create a storable product avco auto - make sure that a purchase tax is set in 'General Information' - create and confirm a PO for 30 quantities with a price of 0 - receive…
**Steps to reproduce:** - create a storable product avco auto - make sure that a purchase tax is set in 'General Information' - create and confirm a PO for 30 quantities with a price of 0 - receive the products - create and validate a delivery for 10 units of the product - from the PO create the bill - set a date and save - set a price of 100 - on the Bill set the total tax at 500 (it's bellow 'untaxed amount' on the bottom right of the bill and should be 450 before you change it, if the tax is 15%) - confirm the bill **Current behavior:** The total tax was reset to 450 **Expected behavior:** It should stay 500 as it was manually set **Cause of the issue:** The total tax amount is computed based on the tax lines in Journal Items https://github.com/odoo/odoo/blob/2744396733bb3ad60813e9e093d67192c0d38b36/addons/account/models/account_move.py#L1171 So the problem is actually that a recomputation of the balance of the tax account.move.line (the one with the account "tax paid" in journal items) is triggered when we confirm the Bill. That's because : When we confirm the bill, because the price is different than the one on the PO, _apply_price_difference does 2 things : (1) it creates an svl (with corresponding amls) for the quantities that are still in stock (here 20) (2) it adds amls on the bill (crediting stock interim received and debiting expense) to compensate the cogs deficit for the already out of stock quantities (here 10). cf https://github.com/odoo/odoo/pull/126536 for more details When we create those amls from (2), the create method from account.move.lines calls super() inside a context manager calling _sync_dynamic_lines(). https://github.com/odoo/odoo/blob/5583cbcebae00d8122dce5ce929b650929966a90/addons/account/models/account_move_line.py#L1628-L1635 the yield of sync_dynamic_lines() is inside a context manager calling _sync_tax_lines. https://github.com/odoo/odoo/blob/5583cbcebae00d8122dce5ce929b650929966a90/addons/account/models/account_move.py#L3250 Therefore, the first half of sync_tax_lines() (untill the yield) is ran before the call to super and the rest (from the yield) is ran after the call to super. Because we added two lines in the account.move, get_changed_lines will return those 2 new line and because there is a tax_ids on the new lines round_from_tax will be False. https://github.com/odoo/odoo/blob/5583cbcebae00d8122dce5ce929b650929966a90/addons/account/models/account_move.py#L3034-L3041 Therefore we won't reach continue. https://github.com/odoo/odoo/blob/73d73c5c6606e0b34c754bfc4de035840951dd3b/addons/account/models/account_move.py#L3055-L3059 And the tax line will be recomputed using _prepare_tax_line() https://github.com/odoo/odoo/blob/73d73c5c6606e0b34c754bfc4de035840951dd3b/addons/account/models/account_move.py#L3065 Here is why there is a tax_ids on the new lines : The field is precompute so if we don't set a value for it, _compute_tax_ids will be ran to compute it. As the account move on which the lines are added is a bill, the tax_ids will the supplier_tax_id of the product. https://github.com/odoo/odoo/blob/73d73c5c6606e0b34c754bfc4de035840951dd3b/addons/account/models/account_move_line.py#L898-L901 **Fix:** There is no need for a tax_ids on these lines as they are not meant to (and should'nt) impact the taxes. opw-5413798
2 changes
Resolved issues and error corrections
This update resolves an issue where stock synchronization with Amazon was failing due to incorrect fulfillment channel data. The system now uses a more reliable field from the Amazon Listings API to determine channel availability, defaulting to FBM when necessary to ensure stock remains synchronized. This change also improves the process of updating FBM stock configurations.
Original PR description
During the upgrade from XML-based feeds to the new JSON Listings API for stock management, we chose to use Amazon's API to fetch a listing's fulfillment channel information. However, Amazon does not…
During the upgrade from XML-based feeds to the new JSON Listings API for stock management, we chose to use Amazon's API to fetch a listing's fulfillment channel information. However, Amazon does not provide a clear answer for a given listing. After some research, we assumed an offer was FBM when the listing contained a `merchant_shipping_group`, because this setting is specific to FBM listings. See also e6d620e4b200cadabb00ce37ab03289cfeb4ae58. This assumption was flawed: Amazon can keep the shipping group even after a listing switches to FBA, which can block stock synchronization. This commit uses the `fulfillmentAvailability` field from the Listings API instead. This field stores the available quantity for each fulfillment channel in which the listing is sold. When multiple fulfillment channels are present, the offer defaults to FBM so stock synchronization can continue. The `sale_amazon_channel_management` module can then be installed to manually select and disambiguate the channel. This commit also upgrades the patching method used to update the FBM stock to ensure user specific configuration aren't overriden during the synchronization. opw-6064896 opw-5152359
This update adds logging of Amazon request IDs from the SP-API responses. Previously, these IDs were missing, making it harder for support teams to troubleshoot issues with Amazon integrations. This change improves support efficiency and reduces investigation times.
Original PR description
Each response from Amazon's SP-API includes a request identifier used by their support team for debugging. This identifier was not previously logged, making support investigations more difficult.