Daily updates from Odoo
Tuesday, August 12, 2025
30 changes · saas-18.4
Resolved issues and error corrections
Project profitability figures now use the accounting line balance instead of recalculating amounts with current currency rates. This prevents incorrect project cost and profitability totals when vendor bills or other entries use historical or manually adjusted exchange rates.
Original PR description
Issue description: The profitability items for projects were not matching the numbers from analytic accounting reports due to discrepancies in currency rate calculations. This issue was traced to two…
Issue description: The profitability items for projects were not matching the numbers from analytic accounting reports due to discrepancies in currency rate calculations. This issue was traced to two main causes: 1. Profitability items were using the currency rate of today, even for old move lines. ```rates = self.env['res.currency'].browse(list(currency_ids))._get_rates(self.company_id, date.today())``` While this was deemed acceptable for performance reasons in #113146, it caused mismatches with analytic accounting reports. 2. Some move lines use a changed currency rate that differs from the rate stored in the currency table for the same date (due to manual change in the currency rate), leading to further mismatches. To resolve this: - The `balance` is now used instead of `price_subtotal` for calculations. This ensures accurate amounts without relying on conversion rates when the project currency matches the company currency. Steps to Reproduce: 1. Create a project with an associated analytic account. 2. Enable any foreign currency and add different rates for it for today and yesterday. 3. Create a new vendor bill with: - Date = yesterday - Currency = the new foreign currency - Analytic distribution set to the created project's analytic account. 4. Check the project dashboard profitability. You will see the numbers are incorrect because it uses the currency rate of today. opw - 4881380 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222462 Forward-Port-Of: odoo/odoo#217337
Marketing card previews and test mailings now use the right preview card, avoid recording preview interactions as real clicks, and show translated default content. Campaigns linked to removed business models are also cleaned up automatically, while field selection controls are easier to clear and display more consistently.
Original PR description
- Avoid counting "clicks" on archived (implicitly preview) cards - Pick the preview card when building the default mailing body - Translate the default mailing body - If a card targets a model that has been uninstalled, remove the campaign as is done for mailings task-4247003 Forward-Port-Of: odoo/odoo#222383 Forward-Port-Of: odoo/odoo#214315
This update adds automated checks to protect a previous fix in the website editor. It helps ensure drag-and-drop editing does not incorrectly mark unrelated page elements as changed, reducing the risk of accidental save issues in future updates.
Original PR description
As a follow-up of commit [1] (then modified by [2]), which prevented the drag and drop to mark unwanted elements as dirty, this commit adds tests to make sure the fix is okay and to secure this behavior so nothing else can break it. [1]: 6fdf188fdf5cfdc11e5e1a8429d0a652054344de [2]: 42f14bf17042d6b53858e362eea7f06aacf49702 task-4367641
This fixes an issue where certain website elements, such as the shopping cart icon in the header, lost their media editing controls while editing a page. Users can now replace those media elements without accidentally making the icon text-editable.
Original PR description
Following this [commit], in some cases we need to have .o_editable_media class while the element is not editable itself. In order to do this, we shouldn't filter out elements again based on `force_not_editable_selector`s, but rather just not set element's contenteditable to true, when the element matches those selectors, then the .o_editable_media will be added successfully. To see the issue: - open website and start editing - inspect the cart icon in the header => It's missing the .o_editable_media class. Related to task-4367641 [commit]: https://github.com/odoo/odoo/commit/b455ea85853df
Point of Sale now correctly opens the product configuration popup when a combo item includes products with special variant settings. It also avoids asking cashiers to choose variant options that were already selected in the combo flow, reducing confusion and checkout errors.
Original PR description
When a combo contained a product that had variant with type 'no_variant' and 'always', if you added the product to the cart the product configuration popup would not open. Also, in the combo you can…
When a combo contained a product that had variant with type 'no_variant' and 'always', if you added the product to the cart the product configuration popup would not open. Also, in the combo you can only select product_product and not product_template, so the product configuration popup should not propose the variant linked to the 'always' type, as you already selected a product template in the combo configuration popup. Steps to reproduce: ------------------- * Create a product attribute PA1 with type 'no_variant' and 2 values V1 and V2 * Create a product attribute PA2 with type 'always' and 2 values V3 and V4 * Create a product template PT1 with PA1 and PA2 * Create a combo choice PC1 with the 2 variants of PT1 * Create a combo product CP1 with PC1 * Open PoS and add CP1 to the cart * The combo configurator popup opens, click on the version with V2 > Observation: The product configurator popup does not open > Second fix: The product configurator allows you to select the variant linked to the 'always' type, which is not correct as you already selected it through the combo configurator popup Why the fix: ------------ The first fix just make sure that the product configuration popup opens when it is necessary. The second fix filters the variants proposed in the product configuration popup to only show the variants that are not linked to the 'always' type. But this only happens when we do it from the combo configuration popup. opw-4719258 Forward-Port-Of: odoo/odoo#222252 Forward-Port-Of: odoo/odoo#215603
Website popup tests now wait for the actual show and hide events instead of relying on animation timing. This reduces false test failures and helps keep website changes safer to release.
Original PR description
The tests for showing and hiding popups were prone to failure as they relied on timing for the animation to complete. With this commit, we properly wait for the bootstrap event that is triggered when the popup is shown/hidden before continuing with the test task-4367641
Invoice PDFs sent by email now use the same customized file name as invoices printed manually. This avoids confusion for customers and keeps emailed documents consistent with the company’s report settings.
Original PR description
**Steps to reproduce**: - install the `accounting` module. - Go to `Settings -> Technical -> Actions -> Reports -> Invoice or Invoice without payment` - Change the printed report name - Try to print…
**Steps to reproduce**:
- install the `accounting` module.
- Go to `Settings -> Technical -> Actions -> Reports -> Invoice or Invoice without payment`
- Change the printed report name
- Try to print the report via the print menu (gear icon -> print) -> The report is shown with the new updated name.
- Try sending the invoice the regular way -> the attached invoice has the default name, Odoo ignores the changes.
**Observation**:
When printing the invoice manually, the file name correctly reflects the custom name configured in the report action. However, when sending the invoice by email, the attachment file name does not match the updated name and remains hardcoded.
**Issue**:
The email attachment file name is hardcoded in the mail sending logic. in the method:
```python
def _get_invoice_report_filename(self, extension='pdf'):
self.ensure_one()
return f'{self.name.replace('/', '_')}.{extension}'
```
It does not dynamically fetch the updated report name from the configured report action.
**Solution**:
When a custom report template is configured on the customer on field `(invoice_template_pdf_report_id)`, the system now dynamically uses the corresponding name from the report action for the email attachment.
opw-4923035
Forward-Port-Of: odoo/odoo#219279This update fixes access problems that could prevent HR users from creating employees or employee versions when restricted payroll-related fields were involved. It also tightens visibility of contract and payroll information so only authorized HR manager or payroll users can see sensitive employee details.
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
Paid time off in the French localization now uses the employee’s actual working schedule when calculating hours, instead of defaulting to the company schedule. This keeps timesheets accurate when employees work different daily hours while preserving the legally required day count rules.
Original PR description
With the French fiscal localization: When an employee has a different working schedule than the company’s default one. If the employee’s daily working hours are greater than the company’s default…
With the French fiscal localization: When an employee has a different working schedule than the company’s default one. If the employee’s daily working hours are greater than the company’s default hours. The timesheet for paid time off only displays the company’s default hours instead of the employee’s actual hours. Steps to reproduce: ------------------- * Install l10n_fr_hr_holidays * Set the French fiscal localization * Working schedule of the company -> 7:30 per day * Working schedule of the employee -> 8 per day * Create a paid time-off with this employee * Check the Timesheet of this employee > Observation: Timesheet shows 7:30 instead of 8 Why the fix: ------------ We needed to ensure the hours are always calculated correctly (using the employee’s or company’s calendar when appropriate) while still forcing the correct day count (1 or 0.5) and extending it according to French law. ✅ Day count is forced (0.5 or 1) depending on the leave type. ✅ Hours are fetched from `super()._get_durations()` so the timesheet keeps accurate hours. This prevents timesheets from showing incorrect hours when the employee's work schedule differs from the company's work schedule. opw-4744516 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220511
Quotation PDFs now correctly show zero values for custom number fields instead of leaving those fields blank. This prevents confusion for customers and sales teams when a quoted value is intentionally set to zero.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Using Studio, add an integer or float field to the sale order form; 2. upload a PDF using forms as a quotation header[^1]; 3. add a mapping of the form field to the studio field; 4. create a quoation using the header; 5. have the studio field be 0; 6. print quotation. [^1]: e.g. `tests/files/test_forms.pdf` Issue ----- The form field where the zero should be displayed is empty. Cause ----- When formatting values, it returns an empty string for any falsy value whose field isn't of type boolean or monetary. Solution -------- If the value is falsy, only return the empty string if the field type is not integer or float, this way, the zero value will get formatted in the final `else` as a string value (same as non-zero numeric values). opw-4937052 Forward-Port-Of: odoo/odoo#222487
This update corrects dependency declarations for the website and HTML builder areas so related features load with the components they need. It helps prevent setup or runtime issues in the website editing experience caused by missing or incorrect module dependencies.
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
Manufacturing unbuild operations now respect the decimal precision configured for the product's unit of measure. This prevents quantities with more than two decimals from being rounded or blocked, improving accuracy for products measured with finer precision.
Original PR description
Steps to reproduce the bug:
- Set the decimal precision and rounding accuracy for the unit of measure to more than 2 digits (e.g. 3)
- Create a storable product “P1”
- Create a manufacturing order to produce 1.234 units
- Confirm and validate it
- Try to unbuild the MO
Problem:
The unbuild form does not respect the product's UoM decimal precision, allowing only 2 digits for product_qty.
opw-4818591
Forward-Port-Of: odoo/odoo#220308
Forward-Port-Of: odoo/odoo#211944This fix ensures live chat visitors see the correct sender name in mail and chat messages. It prevents blank or missing names by using the live chat-friendly display name consistently.
Original PR description
Before this commit, using author.name directly could lead to not showing anything to livechat visitors. This is because the information is not send to the visitor. By using the authorName getter, we leverable the override in livechat and correctly use the livechat_username. task-4965911 Forward-Port-Of: odoo/odoo#221761 Forward-Port-Of: odoo/odoo#220104
This fixes a website editor issue where changing an image's position in a parallax cover section could distort the image size and placement. Business users editing website pages should now get predictable visual results when adjusting image positioning with scroll effects enabled.
Original PR description
Following the [html_builder refactoring], we had the issue with image's background overlay when we were changing its background position, which happened because the parallax interaction would change image's dimensions. To reproduce the issue: - open website, start editing - drop the `s_cover parallax` snippet and click on it - change its Scroll Effect option to "Zoom In" - Click on the Image Position option's crosshair => Observe that the image's dimensions and position are messed up. [html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb
Creating or editing a milestone from the All Tasks screen now automatically keeps the related project information. This prevents an unnecessary required-field error and lets users save milestones without extra manual steps.
Original PR description
### Steps to Reproduce: - Install sale project - Go to All Tasks - Open any task create and edit a new milestone and click on save ### Issue: - A required field error is raised because `project_id` is not set by default. - It should not be the case. ### Cause: - The `milestone_id` field's attributes are overridden in `sale_project`. - The context is missing `default_project_id` when accessing the milestone from the "All Tasks" view. ### Fix: - Passed project_id as default_project_id when opening milestone form. task-4953620 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220735
This update corrects outdated field references in the employee work entry module after HR contract data was renamed during the saas-18.4 migration. It prevents upgrades from being blocked, helping customers move to the new version without this migration error.
Original PR description
- When migrating from `saas~18.3` to `saas~18.4` upgrade is blocked. Issue - - The model `hr.contract` was…
- When migrating from `saas~18.3` to `saas~18.4` upgrade is blocked.
Issue
-
- The model `hr.contract` was [renamed](https://github.com/odoo/upgrade/blob/815644044a3cf9ec41b2cf7580da47abdf6d3553/migrations/hr/saas~18.4.1.1/pre-migrate.py#L25) to `hr.version`. The fields `date_start` and `date_end` were also [renamed](https://github.com/odoo/upgrade/blob/815644044a3cf9ec41b2cf7580da47abdf6d3553/migrations/hr/saas~18.4.1.1/pre-migrate.py#L30-L31) to `contract_date_start` and `contract_date_end` in the hr.version model.
- These fields were still referenced in this module, causing issues.
Solution:
-
- Updated the references from `date_start` and `date_end` to `contract_date_start` and `contract_date_end` to resolve the issue.
- Reference [PR](https://github.com/odoo/odoo/pull/202869/files)
Traceback:
-
```python3
Traceback (most recent call last):
File "/home/odoo/src/odoo/saas-18.4/odoo/service/server.py", line 1410, in preload_registries
registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update'])
File "<decorator-gen-6>", line 2, in new
File "/home/odoo/src/odoo/saas-18.4/odoo/tools/func.py", line 89, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/saas-18.4/odoo/orm/registry.py", line 175, in new
load_modules(
File "/home/odoo/src/odoo/saas-18.4/odoo/modules/loading.py", line 450, in load_modules
load_module_graph(
File "/home/odoo/src/odoo/saas-18.4/odoo/modules/loading.py", line 201, in load_module_graph
registry.init_models(env.cr, model_names, {'module': package.name}, new_install)
File "/home/odoo/src/odoo/saas-18.4/odoo/orm/registry.py", line 719, in init_models
model._auto_init()
File "/home/odoo/src/odoo/saas-18.4/odoo/orm/models.py", line 2908, in _auto_init
new = field.update_db(self, columns)
File "/home/odoo/src/odoo/saas-18.4/odoo/orm/fields_relational.py", line 284, in update_db
return super().update_db(model, columns)
File "/home/odoo/src/odoo/saas-18.4/odoo/orm/fields.py", line 1120, in update_db
self.update_db_notnull(model, column)
File "/home/odoo/src/odoo/saas-18.4/odoo/orm/fields.py", line 1173, in update_db_notnull
model._init_column(self.name)
File "/home/odoo/src/odoo/saas-18.4/addons/hr_work_entry/models/hr_work_entry.py", line 82, in _init_column
self.env.cr.execute("""
File "/home/odoo/src/odoo/saas-18.4/odoo/sql_db.py", line 426, in execute
self._obj.execute(query, params)
psycopg2.errors.UndefinedColumn: column hc.date_start does not exist
LINE 14: hwe.date_start >= hc.date_start AND
^
HINT: Perhaps you meant to reference the column "hwe.date_start".
```
- OPW - 4996246
- UPG - 3056379
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-prA scheduled accounting task now stops retrying journal entries that fail during automatic posting. This prevents repeated error messages and excessive record creation, helping keep accounting operations and system performance stable.
Original PR description
**Steps to reproduce:** - For simplicity, create a new account. - Create a new journal entry, with one line on the newly created account. - Set the date to today or older. - Set auto-post to "At…
**Steps to reproduce:** - For simplicity, create a new account. - Create a new journal entry, with one line on the newly created account. - Set the date to today or older. - Set auto-post to "At date". - Make sure the journal has autocheck_on_post set to True. - Keep the journal entry in draft, and duplicate it until you have 100 copies. (Make sure auto-post is set to "At date" on all of the copies aswell) - Set the newly created account to 'Deprecated'. - Manually execute the scheduled action "Account: Post draft entries with auto_post enabled and accounting date up to today" **Issue:** The scheduled action fails and then falls into an infinte loop, and logs an error on the chatter every minute, which could lead to thousands of mail_message records beign created. **Cause:** If the autopost scheduled action fails on a certain move, it marks it as 'move.checked = False'. So that when it is calls itself again (if the number of moves to post is greater than or equal to 100), it won't fetch the same move and fail again. But having 'journal_id.autocheck_on_post = True' in the search domain allows autopost to fetch the same move it marked before (if the journal allows it), which leads to an infinite loop. **Solution:** If autopost fails on a move, set 'auto_post' to 'no' so it won't be fetched again. opw-4815790 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214946 Forward-Port-Of: odoo/odoo#213642
A flaky automated test in the barcode stock transfer flow was stabilized by waiting for the destination location update to appear on screen before continuing. This reduces random test failures and helps keep stock barcode releases more reliable without changing user-facing behavior.
Original PR description
A non-deterministic error has been occurring across all versions starting from 18.0 when running the `test_split_line_on_destination_scan`. problem: The issue lies in one of the steps of the tour,…
A non-deterministic error has been occurring across all versions starting from 18.0 when running the
`test_split_line_on_destination_scan`.
problem:
The issue lies in one of the steps of the tour, where the destination location of the remaining quantity is changed from WH/Stock to shelf1 (LOC-01-01-00). Right after this change, the test proceeds to assertLineDestinationLocation. However, the test step was previously waiting for the presence of the .o_validate_page.btn-primary element — an element that is already visible before the destination location update is actually applied. As a result, the tour sometimes skips to the next step prematurely, without ensuring the location change has occurred, leading to test failure.
Fix:
We replaced the trigger .o_validate_page.btn-primary with a more reliable condition: waiting for an element containing the destination text .../Section 1 (.o_line_destination_location:contains(".../Section 1")). This ensures that the step only proceeds once the destination update has been reflected in the UI.
Runbot-145458
Forward-Port-Of: odoo/enterprise#92006
Forward-Port-Of: odoo/enterprise#91927The Approvals app now handles cases where the same person appears more than once as an approver on a request. This prevents a traceback when users open My Requests and keeps approval workflows accessible.
Original PR description
#### Reproduce Approvals app -> My Approvals -> My Requests (Traceback Error) #### Issue The demo data contains a duplicate record for an approver (the user is set as default approver for the approval category and added again as record in xml data), so the request had 2 approvers with the same user. #### Fix Get the first record of filtered approvers for current user if there are many. task-4984137
This fix prevents French FEC file imports from incorrectly replacing account names when multiple accounts share similar codes. Businesses can import accounting files with greater confidence that existing account labels will remain accurate.
Original PR description
Steps to reproduce: - import a fec with different account 164*** with different names Issue: All the account's name will be overriden Cause: Before 18.0, apparently, code and name were joined and was not an issue solution: update the code to the new logic by filtering out the name from the override (`_apply_template`) opw-4690284 Forward-Port-Of: odoo/enterprise#89194 Forward-Port-Of: odoo/enterprise#86809
New salary offers now appear correctly when users return to applicant or employee offer lists. When creating an offer from an employee record, the employee field is filled in automatically, reducing manual entry and confusion.
Original PR description
…ee field - = hr_contract_salary Steps: - Navigate to Recruitment > Job Positions > Applications> Offers - Now, create a New offer using the New button, and go back to offer list view - Navigate to Employee > Select an employee > Contract > Offers - Now, create a New offer using the New button, and go back to offer list view - Navigate to Employee > Select an employee > Contract > Offers - Now, click on New button to open offer form. Issues: - New offer is not included in list for applicants when returning via breadcrumb - New offer is not included in list for employees when returning via breadcrumb - Employee field is not pre-populated when creating a new offer for employee Fix: - Modified smart button action for applicants - Modified smart button action for employees - Computed the employee field to be autofilled Task - 4787302 Forward-Port-Of: odoo/enterprise#86160
This fixes a refund issue in the Italian Point of Sale where fiscal printers could block because required refund details were no longer sent before printing. The change restores the needed refund information so businesses can process refund receipts reliably with Italian fiscal printers.
Original PR description
The refund are bugged after PR #89419 . That PR removed the header but in the header are passed the refund information needed by italian fiscal printer to print the refund. Without this PR the fiscal printer is blocking. The printRecMessage on the receipt is required before the beginfiscalreceipt Forward-Port-Of: odoo/enterprise#91042 Forward-Port-Of: odoo/enterprise#91007
The Spanish VAT record book export now recognizes the 0.26% and 1% equivalence surcharge purchase taxes. This prevents an error when exporting VAT books for invoices using these rates, helping Spanish companies complete tax reporting reliably.
Original PR description
Added to SURCHARGE_TAX_EQUIVALENT taxes 0.26% SE and 1% SE When using the Odoo VAT book (location Spain) and we have an invoice with the taxes 0.26% SE (0,26% Recargo Equivalencia Compras) 1% SE (1%…
Added to SURCHARGE_TAX_EQUIVALENT taxes 0.26% SE and 1% SE When using the Odoo VAT book (location Spain) and we have an invoice with the taxes 0.26% SE (0,26% Recargo Equivalencia Compras) 1% SE (1% Recargo Equivalencia Compras). a KeyError error occurs <img width="1147" height="517" alt="Captura desde 2025-07-30 09-37-13" src="https://github.com/user-attachments/assets/771fcf6e-efed-4e79-a1d4-a133c7072c2a" /> Steps to Reproduce this error: 1. Create a new database using Odoo version 18. 2. Activate the module: “Spain - Accounting (PGCE 2008)” (l10n_es). 3. Create a new company and set Spain as the country. 4. In the company’s “Sales & Purchase” tab, set the Fiscal Position to "Equivalence surcharge". 5. Create a new quotation and select the company created in step 3. 6. Add a product with the following taxes: 0.26% and 2% VAT (G). 7. Add another product with the following taxes: 1% (SE) and 7.5% VAT (G). 8. Confirm the invoice generated from the quotation. 9. Go to Accounting → Reporting → Tax Report and select "Generic Tax Report". 10. Click the gear icon and select "VAT Record Books (XLSX)". OPW https://www.odoo.com/es_ES/my/tasks/4981807 @jco-odoo please review. Thank you! MT-10457 @moduon Forward-Port-Of: odoo/enterprise#92116
This fix prevents one employee from being automatically clocked out when another employee clocks in from a different point-of-sale device. Businesses using Belgian POS certification can now keep accurate simultaneous staff attendance records across synchronized devices.
Original PR description
- Fixes an issue where clocking in a second employee on a different device would automatically clock out the first one. This was due to `self` being unset during POS session leading to incorrect loading of `users_clocked_ids` and `employees_clocked_ids`. - The issue was appearing when `pos_session._post_read_pos_data` is triggered from `pos_config.notify_synchronisation`. task-id: 4902090 Forward-Port-Of: odoo/enterprise#89273
Subscriptions that were paused and then manually invoiced now clear the pause state when that invoice is posted. This prevents resumed subscriptions from using an already-invoiced date and helps keep billing periods accurate.
Original PR description
Version: - saas-18.4 Before: - If a subscription was paused and a manual invoice was created, resuming the subscription would set the next invoice date incorrectly. - It would often pick a date that had already been invoiced manually, skipping over the pause period. - This happened because the user_pause_start is not reset after posting the manual invoice. After: - Now, when a manual invoice is posted during a pause, the pause state is cleared right away. - This makes sure the next_invoice_date is calculated properly when the subscription is resumed, without missing the pause period. Impact: - Fixes issues where subscriptions skipped billing periods after a manual invoice during a pause. - Keeps the billing period accurate when pausing and resuming subscriptions. Steps to reproduce: - Create and confirm a subscription. - Pause the subscription. - Post a manual invoice. - Resume the subscription. task-4946268
Rental orders now show the correct remaining availability when rental transfers are disabled. This prevents products from appearing unavailable after another rental is picked up, helping sales teams confidently confirm valid rental orders.
Original PR description
Steps to reproduce: - Do not enable “Rental Transfer” in settings - Create a storable product “P1”: - Enable “Can be rented” - update available quantity to 10 units - Create a first rental order for…
Steps to reproduce:
- Do not enable “Rental Transfer” in settings
- Create a storable product “P1”:
- Enable “Can be rented”
- update available quantity to 10 units
- Create a first rental order for 24h:
- 9 units of P1
- Confirm the order
- Create a second rental order for the same 24h period:
- 1 unit of P1
-> Expected: The availability widget is green and indicates 1 unit available (correct).
Problem:
After picking up the first order, the widget on the second order turns red and incorrectly shows no availability.
The current logic checks virtual_available (1 unit) and subtracts rented_qty_during_period (9 units), resulting in -8. It then takes max(0, -8) → 0. However, the actual picked quantity should be taken into account, regardless of whether “Rental Transfer” is enabled, since disabling it merely omits the creation of a picking—not the move itself.
opw-4901017
opw-4906162
Forward-Port-Of: odoo/enterprise#92056
Forward-Port-Of: odoo/enterprise#91155The Spanish VAT books export now avoids a technical error when the company’s IAE Group or Heading is missing. Instead, users are guided to update the company settings, making the issue easier to resolve and reducing disruption during tax reporting.
Original PR description
**Steps to reproduce:** 1. Install the `l10n_es_reports` module. 2. Remove the value from the `IAE Group or Heading` field in company settings. 3. Navigate to `Accounting -> Reporting -> Tax Report -> Generic Tax Report`. 4. Click the down arrow and select `VAT Record Books (XLSX)`. **Observed behavior:** * A traceback error occurs when attempting to export the VAT books. **Root cause:** * The system attempts to traverse the `IAE Group or Heading` field, which is empty, causing the traceback. **ref**: https://github.com/odoo/enterprise/blob/d8539dff5f3dcecfeb99fd7fc22a6915aaa02c4b/l10n_es_reports/models/libros_export.py#L126-L138 **Solution:** * If field `IAE Group or Heading` not configured, a RedirectWarning is raised to guide the user to the company form view for proper setup. opw-4981531 Forward-Port-Of: odoo/enterprise#92049 Forward-Port-Of: odoo/enterprise#91607
The US Payroll leave type setup screen now includes the intended fields and uses the correct label. This helps payroll administrators see and configure the required leave information without missing options.
Original PR description
Before this commit, the modification of the leave type views was not introduced in the manifest, resulting in the fields being absent from the view. This commit corrects the label as well as introduces that view in the manifest Forward-Port-Of: odoo/enterprise#87423
Automatic currency rate updates from the UAE Central Bank now include the Sudanese Pound. This ensures businesses using SDG receive current exchange rates without manual correction.
Original PR description
**Steps to reproduce**: 1. Install the `account` and `l10n_ae` modules. 2. Go to `Invoicing → Configuration → Currencies` and activate the `Sudanese Pound (SDG)` currency. 3. Navigate to `Settings → Invoicing → Currencies → Automatic Currency Rates`. 4. Select `[AE] Central Bank of the UAE` as the currency provider and manually fetch rates. <img width="463" height="181" alt="image" src="https://github.com/user-attachments/assets/31257e2e-8360-4cdb-877e-2ea41487ddea" /> 5. Return to the Currencies list. **Observed behavior**: - The rate for the `Sudanese Pound (SDG)` is not updated. **Root cause**: - The `SDG` currency is missing from the `MAP_CURRENCIES` dictionary, so the provider doesn't fetch its rate. **Solution**: - Add the missing `SDG` currency mapping to `MAP_CURRENCIES`. opw-4869204 Forward-Port-Of: odoo/enterprise#91790
UPS commercial invoices generated from deliveries now show the same currency as the related customer order instead of defaulting to the company's currency. This helps avoid incorrect customs paperwork and reduces confusion for international shipments.
Original PR description
The automatically generated UPS Commercial Invoice is using the company's currency instead of the currency of the invoiced order. ### How to reproduce: * Setup UPS Delivery Method. * Create a sale order with a currency different from the company's. * Assign a customer in a different country. * Validate the delivery. * Check the UPS Commercial Invoice — it shows the company's currency. opw-4973217 Forward-Port-Of: odoo/enterprise#92065 Forward-Port-Of: odoo/enterprise#91883