Daily updates from Odoo
Thursday, May 7, 2026
30 changes · master
New functionality added to Odoo
This update simplifies and expands Odoo's reporting capabilities. It removes a technical limitation forcing the use of a single reporting engine and introduces a new Paper-Muncher engine. Users can now choose their preferred reporting engine based on the report type, offering greater customization and control over financial reporting.
Original PR description
Description of the issue/feature this PR addresses:
We currently force the use of WKHTML, since it's hardcoded we can't add new reporting engines easily.
The main goal of this PR is to be able to :
modularize the reporting engines
make accounting use the same generation pipeline
add a new reporting engine for paper-muncher
allow user to choose their reporting engine by company/action report/accounting reportThis update introduces the ability to track and manage company versions within the Odoo Enterprise HR Payroll module. This enhancement allows for more accurate payroll calculations and reporting, particularly when dealing with multiple company structures or changes in company status. It resolves a previous data handling issue related to incorrect payslip versions.
Original PR description
Task: 6111217
Enhancements to existing features
This update simplifies the product list view used by sales teams, making it easier to understand key information. Specifically, irrelevant fields have been hidden and aggregation on the 'version' field has been disabled to prevent misleading totals. This change improves clarity and usability for sales users.
Original PR description
Simplify product views by hiding non-relevant fields and improving clarity for sales users. - Disable aggregation on version field to avoid misleading totals task-6131606
This update simplifies the duplication list view, making it easier to understand merge status and quickly access related deduplication rules. Key changes include clearer visual indicators, a streamlined interface, and enhanced filtering options, ultimately improving the efficiency of data cleanup tasks.
Original PR description
Before this commit, In the duplication list view: - It was not clear which records were merged within a group - Discarded records had no option to reconsider - No quick access to the related Deduplication Rule - Many unnecessary fields were visible by default - Search bar was unstructured and missing useful filters - Archieved and Discarded both similar type of filters After this commit, - Removed Delete action from duplication list view - Added highlight effect on Merge hover to show impacted records - Replaced Merge / Discard with **Unarchive** button for discarded records - Added direct access to Deduplication Rule from group menu - Simplified list view fields (only essential fields visible by default) - Improved search bar structure and added date filters - Remove Archieved filter Impact: - Clearer merge and discard visibility - Faster navigation to deduplication rules - Better filtering and overall usability Taskid-5896560
This update enhances the visual design of UrbanPiper notifications within the point-of-sale system. The changes create a more organized and user-friendly experience, making it easier for staff to manage UrbanPiper-related alerts and updates. This improves the overall efficiency of operations.
Original PR description
In this commit: ------------------- - We have enhance the UrbanPiper notification popup to make it visually appealing and well-structured. | Before | After | |-----------|--------| | <img width="310" height="224" alt="image" src="https://github.com/user-attachments/assets/14bf3700-919d-46fb-b625-c2b935bf9603" /> | <img width="351" height="235" alt="image" src="https://github.com/user-attachments/assets/2b7a291e-222a-4a08-ac60-18264df356cd" /> | task: 5448621
This update simplifies how variable salary losses are calculated in payroll, addressing previous complexities with work day lines. By separating public holiday and sick time off loss calculations, the system now provides clearer and more accurate results, reducing user verification challenges. This change improves payroll reporting and compliance.
Original PR description
Currently loss on variable salary are managed with worked day lines which is a problem as: - it's not an occupation - the computation of the loss differs for public holiday and for sick time off, grouping them makes the verification very complex for the user - loss for public holiday and loss for sick time off are grouped on the same work day line but should not because the computation of the loss for the public holiday must take into account the loss for sick time off of the last year but not the loss for public holiday This commit refactors the work entry type into two distinct salary rules. task-6152041
This update adds a new field to the call database to differentiate between production and demo calls. Currently, the system doesn't track whether a call is for live use or a demonstration. This change improves reporting and analysis by allowing us to better understand call usage in different environments.
Original PR description
…guish production and demo calls Currently, the database does not differentiate between production and demo calls. This commit adds an is_prod boolean field to preserve this metadata. Task-[6116478](https://www.odoo.com/odoo/5778/tasks/6116478)
This update enhances the visual experience of Odoo's spreadsheet dashboards by adapting colors to dark mode. Specifically, the dashboards now remove a default white background and utilize a new color scheme, resulting in a cleaner and more professional look in dark mode without impacting light mode.
Original PR description
See https://github.com/odoo/odoo/pull/263272
This update enhances how rental prices are calculated by considering the full rental duration and applying prices at regular intervals (hourly, daily, etc.). This change introduces a slight complexity in price calculations due to rounding, and also optimizes the shop page performance by disabling search-based rental price computations.
Original PR description
With the replacement of rental rules by price rules in 2a934b799eb5f6d774ff6de86726b3887f1d8dab, we allowed users to use Availability dates to set specific prices for rental based on the rental…
With the replacement of rental rules by price rules in 2a934b799eb5f6d774ff6de86726b3887f1d8dab, we allowed users to use Availability dates to set specific prices for rental based on the rental period.
Doing so, we introduced a limitation as we currently take only the rule that matches the starting date/time of the rental.
This commit updates rental price computation to sum the price at each `rent_periodicity` step (hour/day/night/week) over the full rental duration.
Two drawbacks to this changes:
1. Formula-based rules may now behave differently. Rounding is applied per periodicity. For example, with a product priced at $99.99/day and a rule applying a 10% discount rounded to the nearest .99, starting on Monday till Tuesday (included). The price for a rental from Monday to Wednesday becomes:
```python
# Monday to Tuesday (included) + Wednesday
(round($99.99 - 10%) - $0.01) * 2 + $99.99
= $89.99 * 2 + $99.99
= $279.97
```
2. The shop page previously computed rental prices of each products based on the current search query. If the base loading times without rental was already slow, adding rental products won't help. An `ir.config_parameter` was added to disable the computation of rental prices based on the search query.
task-6020137
See also:
- https://github.com/odoo/odoo/pull/257618
### Bench
- Best of 5 GET request times on a 1096 days period (maximum allowed by the rental date picker on the shop)
- 21 products (5 by hours, 15 by days/nights, 1 by weeks)
- Hardware: MacBook M4 Pro (so very fast, much faster than SaaS in single core perf)
- Script to generate the DB can be found in [POC](https://github.com/odoo/enterprise/pull/110156)
- Command: `for i in {1..5}; do curl 'http://localhost:8069/shop?start_date=2026-03-23+17%3A00%3A00&end_date=2029-03-22+18%3A00%3A00' -o /dev/null -s -w "%{time_total}\n"; done | sort -g | head -n 1 | awk '{print "best: "$1"s"}'`
| No pricelist | Empty pricelist | Complex pricelist
-- | -- | -- | --
POC approach (diff [here](https://github.com/odoo/enterprise/pull/110693#issuecomment-4178075093)) | 3.841549s | 37.388301s | 126.696783s
Final approach | 1.835127s | 1.837871s | 1.913034sResolved issues and error corrections
This update resolves issues with how tracking information is embedded in messages, particularly within emails and notifications. The changes improve the reliability of tracking data and ensure consistent display of tracking values, leading to more accurate reporting and data analysis. The team has addressed formatting inconsistencies and test failures related to tracking message types.
Original PR description
Since [1] trackings are embed in message body. This PR provides various fixes and improvements following the merge of the revamped implementation. See commits for more details. Task-6128706 [1] See odoo/odoo#235719 and odoo/enterprise#99500 Forward-Port-Of: odoo/enterprise#115664
This update resolves an issue causing incorrect rounding when importing purchase orders processed through OCR. The fix restores the original rounding precision, which was designed for EDI, rather than the OCR process. This ensures accurate financial calculations for purchase order imports.
Original PR description
Since commit odoo/odoo@86463ce, there could be rounding issues when importing a purchase order matched through the OCR. A first attempt at fixing this was done in commit odoo/odoo@5dbb814, but it was eventually reverted as deemed too risky for a stable branch. More information about how the rounding error occurred is available in that commit description. This second fix should be much safer, we simply don't disable the rounding precision when the OCR is used, as this was intended for EDI in mind in the first place, not the OCR. opw-[6113387](https://www.odoo.com/odoo/my-support-tasks/6113387) Forward-Port-Of: odoo/enterprise#116141 Forward-Port-Of: odoo/enterprise#116021
This update ensures that barcode validations in the stock picking process correctly check if a destination has been scanned, even when 'Force a destination' is enabled. Previously, the validation wasn't triggered, now it will confirm a destination was set before validating the picking, ensuring accurate inventory tracking.
Original PR description
### Steps to reproduce: - In the settings: Enable "Storage Locations" - Inventory > Configuration > Warehouse Management > Operation Types - On receipts, in the Barcode App tab enable: "Force a…
### Steps to reproduce: - In the settings: Enable "Storage Locations" - Inventory > Configuration > Warehouse Management > Operation Types - On receipts, in the Barcode App tab enable: "Force a destination on all products" - Open the barcode app, create a new receipt - Scan a product > Validate #### > You are not blocked by the fact that you did not scan any destination even just to validate the default one ### Cause of the issue: The `barcode_validation_after_dest_location` operation type setting is not used at any point in the barcode app. ### Note: Line in the barcode app are always created a with a `location_dest_id`: https://github.com/odoo/enterprise/blob/a220fc61d9076decdb987421df9330a1c2c20546/stock_barcode/static/src/models/barcode_picking_model.js#L1310-L1322 In particular, even if the setting says: Force a destination on all products. It should rather be interpreted as force a destination scan before validation. Note that a destination scan will not necessarily update a single line but rather all concerned lines at once: https://github.com/odoo/enterprise/blob/a220fc61d9076decdb987421df9330a1c2c20546/stock_barcode/static/src/models/barcode_picking_model.js#L1558-L1576 It is therefore a valid call to check if a location dest was scanned to determine if the a destination was set on each product before validation of the picking, even if it is just to confirm the default destination. ### Note 2: We modify the `_get_barcode_config` to only provide a `barcode_validation_after_dest_location` if locations re enabled otherwise users enabling the option without the ability to scan locations would be soft lock and unable to validate their picking. That same logic already being applied to the `restrict_scan_dest_location` config parameter: https://github.com/odoo/enterprise/blob/6afe02e3e836df2822d7cae8aebbd5bdde6b34cc/stock_barcode/models/stock_picking_type.py#L109 opw-6110690 Forward-Port-Of: odoo/enterprise#115723 Forward-Port-Of: odoo/enterprise#114429
This update fixes 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 availability, defaulting to FBM when necessary to ensure continued synchronization. The update also improves the process of updating FBM stock to respect user-specific 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 Forward-Port-Of: odoo/enterprise#116285 Forward-Port-Of: odoo/enterprise#114473
This update corrects a calculation issue related to Pay-For-Account (PFA) and Daily Pay Value (DPV) in the Belgian payroll module. Separating these calculations ensures more accurate payroll processing and compliance with Belgian tax regulations. This change improves the reliability of payroll reports and reduces potential errors.
Original PR description
Forward-Port-Of: odoo/enterprise#116236 Forward-Port-Of: odoo/enterprise#113385
This update ensures Odoo's Dutch reporting modules (SBR) correctly submit data to the new Digipoort infrastructure, effective May 1, 2026. The change updates URLs and clarifies certificate requirements, preventing submission failures. This is crucial for accurate reporting and compliance with Dutch regulations.
Original PR description
*: l10n_nl_reports_sbr{,_icp,_status_info}
---
Description of the issue this commit addresses:
The Dutch Digipoort endpoint infrastructure is being migrated from procesinfrastructuur.nl to digipoort.logius.nl effective May 1, 2026. Odoo's SBR modules need to use the new endpoints or submissions will fail.
---
Desired behavior after this commit is merged:
This commit updates all Digipoort endpoint URLs (delivery and status services) from the old domain to the new logius.nl domain, and clarifies that valid PKIoverheid certificates are required for both environments. Reports now submit to the new Digipoort infrastructure correctly.
---
task-6171403
Forward-Port-Of: odoo/enterprise#115668This update fixes an issue where list header labels in Odoo's spreadsheet edition stopped translating correctly. The change allows for more flexible header labels, defaulting to translated display names when needed, ensuring consistent and accurate translations across different languages for spreadsheet pivots.
Original PR description
**Description** With odoo/odoo#247578, we were storing static column names in the list definition during migration and list insertion. As a result, list header labels stopped being translatable. This…
**Description** With odoo/odoo#247578, we were storing static column names in the list definition during migration and list insertion. As a result, list header labels stopped being translatable. This was originally done because spreadsheet pivots created from list ranges can break when translated headers change from one language to another. In this commit: - make `string` optional in list column definitions so headers fall back to the translated field display name when no explicit label is stored - keep explicit/custom labels by storing `string` only when a stable header is really needed - update list migration, insertion, and reinsertion flows so they no longer force static labels by default - simplify the list side panel so users can choose between the automatic translated label and a custom stored label - when creating a spreadsheet pivot from a list range in multi-language mode, automatically store the current displayed labels only for the list columns used by that pivot so the pivot stays stable across languages Task: 247578 Forward-Port-Of: odoo/enterprise#115411
This update resolves an issue where multiple users were incorrectly added to Whatsapp discussion channels after a message was sent. The fix ensures that only the user who initiated the conversation is added, preventing unnecessary notifications and channel clutter. This improves the user experience and channel management efficiency.
Original PR description
…ser sends a template message when creating discussion channels after the partner sends a message back. Issue: Currently, When there are multiple users listed under whatsapp.account.notify_user_ids no matter what, when creating a new discuss channel it will add all users in that list. Even when a single user inside that list initiated the conversation with a template. To replicate in runbot add multiple users to whatsapp.account.notify_user_ids, make a partner with a number, send a template, then have the partner send a message back. All users will be notified and added to the channel. There was an unformatted number being passed to a function that required the formatted number. This caused _find_active_channel to find 0 active channels. Fix: Format the number received from the message values inside WhatsAppAccount._process_messages opw-5349138 Forward-Port-Of: odoo/enterprise#114912 Forward-Port-Of: odoo/enterprise#102452
This update resolves an issue where the Mod347 BOE export incorrectly included Spanish companies with invoices below a certain amount. The fix removes a redundant search that was adding these companies to the export, ensuring the BOE only contains partners as defined by the primary reporting requirements. This prevents inaccurate reporting to the Spanish tax authority.
Original PR description
Fix a bug in mod347 BOE export. Steps to reproduce: 1- Create an invoice with a spain Company, with an amount lower than 3 005,06€ 2- Add a Type for mod347 3- Create a cash payment 4- Export the mod347 BOE The partner will appear in the BOE with all line at 0. But this partner shouldn't be in the export. This is due because of a search on account.partial.reconcile, which add partners to the export if a cash payment is found in the period. But this search is not usefully as there is no legal indication that these partners should be in the export in this case, as the partners should only be returned by the main queries. Backport of PR #84317 opw-5960226 Forward-Port-Of: odoo/enterprise#116387 Forward-Port-Of: odoo/enterprise#110947
This update resolves an issue where adding certain attachments (like images) to invoices caused a system crash during the 'Send & Print' process. The fix prevents the system from incorrectly syncing orphaned attachments, ensuring invoices can be printed without errors. This improves invoice processing 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 Forward-Port-Of: odoo/enterprise#116397 Forward-Port-Of: odoo/enterprise#115065
This update resolves a bug that prevented the balance from being displayed correctly when reconciling foreign currency invoices. Specifically, a problem with how the system handled multiple currency lines led to incorrect balance calculations and hidden displays. The fix ensures accurate balance calculations and visibility during reconciliation processes.
Original PR description
### Issue: When reconciling an invoice in a foreign currency with multiple bank statement lines in the same foreign currency, the balance becomes hidden after selecting the second transaction…
### Issue: When reconciling an invoice in a foreign currency with multiple bank statement lines in the same foreign currency, the balance becomes hidden after selecting the second transaction Additionally, after selecting and unselecting a line with another currency, the balance can remain hidden even when no lines are selected ### Cause: In `changeInSelectedMoveLine(selectedLines),` when the currency differs from the company currency, `selectedLineCurrencies` is built as a simple mapped array This array may contain duplicate currencies, which should not prevent computing the balance but incorrectly impacts the logic that determines whether to display it There is no reason to block the sum of lines with the same currency When there is no selectedLines, the function returns early and doesn't unhide the balance ### Steps to reproduce: - Install `account_accountant` with demo data - Enable a foreign currency like EUR - Create and confirm 2 invoices (Customer: Acme Corporation, Currency: EUR, Add a line for 100€) - Go to the Dashboard, and select Bank - Create a new transaction (Label: Multi-currencies, Partner: Acme Corporation, Price: 500$) - Switch to the List View, and display the 2 columns `Foreign Currency` and `Amount in Currency` - Modify the line Multi-currencies (Foreign Currency: EUR, Amount in Currency: 300$) - Switch to the Kanban View and Reconcile the line Multi-currencies - Select your 2 invoices one by one Before the fix, after selecting the second invoice, the balance is displayed as `/` For the additional case: - Unselect all lines - Select a line in another currency (e.g., USD), then unselect it The balance remains hidden opw-6063366 Forward-Port-Of: odoo/enterprise#115101
This update clarifies how customer credits are displayed and used during invoicing. Previously, credits weren't shown on the PaymentScreen and invoices incorrectly reflected total due. Now, the system automatically reconciles credits in invoices, ensuring accurate payment tracking and a clearer view of customer balances.
Original PR description
Before this commit: =================== - There were no details of customer credits on the PaymentScreen - Also, when we use the customer credits and print an invoice, it shows that amount paid as `Total Due` instead of `Paid using Customer Account.` After this commit: ================== - In the PaymentMethod Section, for the `pay_later` type payment methods, if the order has a partner, we will display their current balance in their customer account. - If the customer has credits and uses those credits in the same session, while invoicing in a future session, we will use the reversal entry of that order. - If the customer doesn't have credits and use customer account, the invoice will be due. - If the customer has credits from the past session and uses those credits in the current session, and generates an invoice in the same session, we will auto-reconcile those credits in this invoice and mark the invoice as paid. Task: 5243233
This update fixes an issue where bank statement imports were failing due to incorrect partner name matching. The system now prioritizes using the 'UltmtDbtr' name when available, ensuring accurate reconciliation and preventing import errors. This improves the reliability of bank statement data within the accounting system.
Original PR description
Steps to reproduce: 1- Create a Swiss company and switch to it 2- Go to [Accounting -> Configuration -> Journals] and create a Bank journal 3- Go to the Accounting dashboard, click on the three dots on the Bank journal and click import records 4- Upload a CAMT file with a record that has both a value for "Dbtr" and "UltmtDbtr" (file can be found in the ticket chatter) Issue: The added record uses the "Dbtr" `name` value for the partner name. As a result, reconcilation matching fails Expected behavior: If exists, should use the "UltmtDbtr" `name` value opw-6024860 Forward-Port-Of: odoo/enterprise#113560
This update fixes an issue where invoices for recurring subscriptions weren't accurately reflecting the billing period. The change ensures that invoices now correctly align with the subscription's billing period value, regardless of the period's length (e.g., 3 months, 6 months). This prevents under-billing and ensures accurate revenue tracking.
Original PR description
## Issue When creating an invoice for a sale order with a recurring plan using a `billing_period_value` >= 1 and aligning, that value is not taken into account, and the invoice only covers one unit…
## Issue
When creating an invoice for a sale order with a recurring plan using a `billing_period_value` >= 1 and aligning, that value is not taken into account, and the invoice only covers one unit of time (week/month/year).
## Steps to reproduce
1. Install *Subscriptions* (`sale_subscription`)
2. Create a Recurring Plan RP:
- *Billing Period*: 6 Months
- *Align to Period Start*: Checked
3. Create a Subscription Product P
4. Create a Subscription SO:
- Any Customer
- Recurring Plan RP
- Product P (any quantity/price)
5. Confirm the SO and create the invoice
6. **In the line of the SO, only one month is covered by the invoice. If we generate the next invoice, only one month will be covered as well.**
## Cause
Since https://github.com/odoo/enterprise/commit/45f28f6c288f5213a4e29c816ec68d2c3966b55f, the `next_date_1st` is evaluated by taking the last day of the month/year and incrementing it by one day, to reach the first day of the next month/year.
https://github.com/odoo/enterprise/blob/2d2056766441157dc45ebc37b677841c44e5c513/sale_subscription/models/sale_order_line.py#L377-L382
This is inaccurate when working with recurring plan which are not monthly/yearly, as it will always set the `next_date_1st` to the next month/year, without taking in account the `billing_period_value`.
## Fix
There are two ways to align dates to the period start. Given a subscription starting on January 15, with a billing period of 3 months, we could:
1. Invoice from January 15 to January 31, then from February 1 to April 30. This aligns the invoice to the closest month, then apply the 3 months period for the next invoices.
2. Invoice from January 15 to March 31, then from April 1 to June 30. This applies most of the billing period for the first invoice, while still aligning it to the start of the month, then apply the 3 months period normally for the next invoices.
**Here, we chose the second option** to avoid making the code more complex and keep the diff minimal.
opw-6151530
Forward-Port-Of: odoo/enterprise#115830This update enhances the accuracy of seniority calculations within the Odoo Belgian payroll module. It now correctly considers the end date of each payroll version, ensuring that seniority is calculated based on the most current data, regardless of the version being used. This prevents potential discrepancies and maintains reliable reporting.
Original PR description
Correct date handling in seniority computation taking into account the end date of the version, min(today, version.date_end). task-6179468
This update enhances the automatic closing of expiring subscriptions by now considering outstanding upsell invoices. Previously, subscriptions would close prematurely even if the customer could still pay the upsell. This change ensures subscriptions are only closed when all invoices, including upsells, are within the payment timeframe, improving customer experience and payment processing.
Original PR description
Before this commit, if a subscription reached its due date but its upsell invoices didn't, the cron would close it anyway. This is not ideal because the customer might be willing to pay the upsell invoice. From now on, we will also consider upsell invoices in the EARLIEST closing date calculation for expiring subscriptions. After this commit, we don't let the cron auto-close the subscription if its upsell invoice is within the payment limit for its invoice lines. We are explicitely using the 'date_maturity' field of the invoice lines to calculate this due date range extension (as done before). task-4164026
This update fixes an issue where payment reminders weren't being sent to newly duplicated subscriptions. The root cause was a shared 'last_reminder_date' field preventing new reminders from triggering. The fix sets this field to 'false' for copied subscriptions, ensuring reminders are sent as expected.
Original PR description
Payment reminders are not sent to the duplicate of a subscription when a reminder has already been sent for the original subscription Steps to reproduce: 1. Install Subscriptions 2. Create a new…
Payment reminders are not sent to the duplicate of a subscription when a reminder has already been sent for the original subscription Steps to reproduce: 1. Install Subscriptions 2. Create a new subscription for customer Acme Corporation with product Office Cleaning Service (SUB), a Monthly recurring plan and in the Other Info tab, set the subscription Start Date to one week ago 3. Confirm the subscription 4. Go to Scheduled Actions and run the action "Sale Subscription: send reminder for subscriptions with no token" 5. Go back to the previously created subscription (see that a reminder email has been added in the chatter) 6. Duplicate the subscription and confirm the duplicate 7. Run the action "Sale Subscription: send reminder for subscriptions with no token" again 8. There are no reminder for the duplicate subscription Issue: The copy of a subscription uses the same `last_reminder_date`, preventing payment reminders to be sent here https://github.com/odoo/enterprise/blob/5a2ab62254cd5f684a3b1a0d7c0001b888c70d08/sale_subscription/models/sale_order.py#L2114-L2120 Solution: Set `copy=False` on the field `last_reminder_date` opw-6167356 Forward-Port-Of: odoo/enterprise#116335 Forward-Port-Of: odoo/enterprise#115509
This update fixes an error in the manufacturing report that incorrectly calculated quantities and costs when products were produced in different units of measure (e.g., Kg vs. Ton). The fix ensures accurate reporting by correctly converting quantities from move UoM to product UoM, leading to consistent and reliable cost data.
Original PR description
Steps to reproduce:
- Create a product W1 with UoM = Kg with the following BoM:
- Component C1: 1 unit, cost = $1
- Create and confirm MO1:
- Produce 1 Kg of W1 → total cost = $1
- Create and confirm MO2:
- Produce 1 Ton of W1 → total cost = $1000
- Open the Manufacturing Report and group results
Problem:
- qty_produced ≈ 1.001 instead of 1001
- unit_cost average ≈ 1000 instead of 1
Expected behavior:
- qty_produced = 1001
- unit_cost average = 1 (consistent across MOs)
The manufacturing report (`mrp.report`) incorrectly converts quantities from move UoM to product UoM, leading to wrong `qty_produced` and `qty_demanded` values when different units of measure are used
The current implementation uses:
sm.quantity / uom.factor * uom_prod.factor
This inverts the conversion ratio. As a result:
- 1 Ton is converted to 0.001 Kg instead of 1000 Kg
opw-6097098
Forward-Port-Of: odoo/enterprise#116322
Forward-Port-Of: odoo/enterprise#113979This update resolves an issue where invoices were incorrectly assigned to lower follow-up levels in reminder attachments. The change ensures that invoices are always linked to the appropriate follow-up level, improving the accuracy of reminder processes. This prevents mismatched follow-up levels and ensures timely invoice reminders.
Original PR description
Previously(https://github.com/odoo/enterprise/commit/105d3bff49d486b8ecd943e77d635fe011b5e361), `_update_followup_line_on_move_lines` could downgrade AMLs when executed with a lower follow-up level, as all lines were recomputed without considering their current level. Additionally, invoices with a higher follow-up level were also included in lower level reminder attachments. With this commit, `unreconciled_aml_ids` are filtered to exclude lines that already have a higher follow-up level, preventing downgrade and aligning the attachments with the triggered follow-up level. Forward-Port-Of: odoo/enterprise#114566
This update resolves an issue preventing correct submission of Dutch VAT returns (SBR) when using multiple companies within a single VAT unit. The fix ensures that only the relevant return company's closing entry is used, avoiding an error that previously blocked the process. This improves the reliability of the Dutch VAT reporting functionality.
Original PR description
In a multi-company/multi-branch setup where multiple entities form a single VAT unit, Odoo generates a closing entry for each branch/company during the tax closing process. When attempting to submit the Dutch VAT return via Digipoort (SBR), the wizard gathers these entries via `closing_move_ids`. However, the code subsequently tries to set the resulting recordset as `closing_entry_id` on `l10n_nl_reports.sbr.status.service`, which results in a traceback: `ValueError: Expected singleton: account.move(id1, id2, ...)` This occurs because `closing_entry_id` is a `Many2one` which requires a single record (singleton), but the system provides all closing moves from the tax group. This commit fixes the issue by filtering the closing moves to only target the one associated with the return company, ensuring a singleton is passed to the message posting logic. Issue introduced by: 647699eeb4b8a1cc37ca074fa57844871c5086c1 opw-6106081 Forward-Port-Of: odoo/enterprise#116237
Code cleanup and technical improvements
This update modernizes Odoo's reporting engine by making it more adaptable and user-friendly. Previously, a single engine was hardcoded, limiting the ability to add new reporting options. Now, users can select their preferred reporting engine for various reports, enhancing flexibility and future expansion.
Original PR description
We currently force the use of WKHTML, since it's hardcoded we can't add new reporting engines easily. Here, we : - modularize the reporting engines - make accounting use the same generation pipeline - allow user to choose their reporting engine by company/action report/accounting report https://github.com/odoo/odoo/pull/259626