Daily updates from Odoo
Friday, May 29, 2026
16 changes · 19.0
New functionality added to Odoo
This update adds a new report to comply with Vietnamese Accounting Standards (VAS). It ensures the General Ledger accurately reflects counterpart accounts and balances, a key requirement for Vietnamese businesses. A custom SQL query and post-processor are used to handle complex transaction types and maintain report accuracy.
Original PR description
Vietnamese Accounting Standards (VAS) require businesses to generate their General Ledger following a specific format known as Form S03b-DN. A key compliance requirement of this report is the explicit display of the counterpart account for every transaction line, as well as maintaining strictly separated debit and credit balances. To achieve the counterpart mapping, a custom report handler and custom engine are introduced. Because standard journal entries do not strictly bind individual debit and credit lines together, a specialized SQL query was implemented. This query classifies moves by type (1-to-1, 1-to-many, many-to-many, sale/purchase) and uses proportional splitting and label matching to accurately determine the counterpart account for each line. A post-processor is also included to handle uncategorized lines where 1-to-1 matching isn't possible, ensuring the report remains balanced and transparent. task-6092253
This update expands the data sent to Pricer, including price before taxes, tax names, supplier product codes, and units of measure. This allows for more accurate pricing calculations and supports key business scenarios when using the Pricer integration. The update also ensures Pricer tags are automatically updated when related product information changes.
Original PR description
We are currently missing some fields which must be sent to Pricer for some basic use-case scenarios This PR adds - Price before taxes - Taxes name (ex: 21%) - Supplier product code - Supplier reference - Units of measure of the product The PR also triggers the update of the pricer tags when the models indirectly related to Pricer are modified (taxes name / supplier reference / supplier product code) + cleans up the code a bit task-4506260 Forward-Port-Of: odoo/enterprise#93330 Forward-Port-Of: odoo/enterprise#78009
Enhancements to existing features
This update clarifies payslip reports by separating full days from half days. Previously, both types were shown together, making it difficult to understand work hours. This change provides a clearer breakdown of employee work time reflected on payslips.
Original PR description
In order to clearly distinguish work days that extended full day or half day, the worked days under the payslips will not display both entries as separate types with the half days flagged Task: 5975762
This update enhances Odoo's compatibility with Swedish Point of Sale blackboxes. It now supports a faster data transfer rate (57600 baud) for these devices, improving the reliability and speed of data collection. This ensures accurate sales data is transmitted from the blackboxes to the Odoo system.
Original PR description
This commit adds support for Swedish blackboxes using a 57600 baud rate, as opposed to 9600 used by older models.
Resolved issues and error corrections
This update fixes an issue where selecting the start date first would incorrectly set both the start and end dates for deferred accounting periods. Previously, selecting the end date first resulted in dates appearing in reverse order. This change ensures the system correctly handles date selection for postponement periods, improving data accuracy and reducing potential errors.
Original PR description
The issue is when selecting deferred dates, if the start date is selected first, the system will set both the start and end dates. However, when selecting the end date first, the period appears backwards example ( 2026 - 2025 ). task: 6140024
This update fixes an issue where split orders sent to the preparation display incorrectly canceled existing items. The change prevents line cancellations and ensures that split orders create new preparation cards with accurate quantities, maintaining the integrity of the initial order and preventing quantity aggregation errors. This improves the reliability of the preparation display process.
Original PR description
*= pos_restaurant_preparation_display, pos_enterprise Steps to Reproduce ================== - Create an order with Product A ×2 and Product B ×2 - Send the order to the preparation display - Split…
*= pos_restaurant_preparation_display, pos_enterprise Steps to Reproduce ================== - Create an order with Product A ×2 and Product B ×2 - Send the order to the preparation display - Split the order and pay for one unit of each product - On the remaining order, add another product - Send the order to the preparation display - The preparation display incorrectly cancels previously sent products Fix === - Prevent cancellation of existing preparation order lines - Avoid duplication of preparation lines when split orders are sent to the kitchen Covered Scenario ================ 1. Send an order with Coca-Cola ×2, Minute Maid ×2, Water ×1 to the kitchen. 2. Split 1 qty of each product into a new order, increase split quantities, and send it. 3. Increase quantities on the original order and send it again. Expected Behavior ================= - Initial preparation order remains unchanged (no line cancellations) - Split order creates a new preparation card with only unsend split quantities - Original order creates a new preparation card with only newly added quantities - No preparation line incorrectly aggregates quantities across orders Task-5355899 Related Comm. PR: https://github.com/odoo/odoo/pull/244195
This update corrects a bug in the employee overtime calculation process. Previously, overlapping overtimes across days could lead to inaccurate interval calculations due to rounding errors. The fix ensures overtimes don't bleed into the previous day, preventing these calculation discrepancies.
Original PR description
**Problem:** When an attendance has overtimes across multiple days, those overtimes can overlap when calculating their intervals. There will always be rounding errors since only the durations are…
**Problem:** When an attendance has overtimes across multiple days, those overtimes can overlap when calculating their intervals. There will always be rounding errors since only the durations are saved to 3 decimals, but this is normally fine since the durations are accumulated when calculating the next interval. However, on a day boundary in the employee timezone, the end of the interval is forced to the end of day, which incidentally removes the rounding error. This causes the overlap when calculating the next interval since its start will be based on the rounded duration, not the actual end of day. **Steps to Reproduce:** - Configure an overtime rule where >8 hours is considered overtime, and a second rule applies to non-working days - Set Overtime Rule on employee "Anita Oliver" - Set employee work entry source to "Attendances" - Create an attendance that exceeds 8 hours in a day and crosses into a non-working day and creates enough of a rounding error (see unit test) -> Traceback error: `ValueError: Expected singleton: hr.attendance.overtime.line(1, 2)` **Solution:** Add an additional check to ensure the overtime cannot start on the previous day. opw-6067969
This update addresses an issue where test Odoo databases, mimicking production environments, were incorrectly identified as having valid subscriptions. By adding a specific check for neutralized SaaS databases, we ensure accurate subscription verification and prevent potential disruptions to users. This improves the reliability of the Odoo Enterprise platform.
Original PR description
Odoo.com does not create a distinction between a production and duplicated SAAS database. This allows test databases to pass the check for subscription. This commit adds an additional check for duplicated SAAS databases with a neutralised status. task-6249752
This update resolves an issue where PDF documents received via email were incorrectly displayed with a duplicate iframe preview. The fix ensures that the document preview accurately shows the PDF content, addressing a visual inconsistency. This improvement enhances the user experience when accessing documents from email attachments.
Original PR description
**Steps to reproduce:** - Install documents_account - Set up alias to catch incoming mails - Receive a mail with xml attachement which can be previewed as pdf - Go to Documents app - Click on the…
**Steps to reproduce:** - Install documents_account - Set up alias to catch incoming mails - Receive a mail with xml attachement which can be previewed as pdf - Go to Documents app - Click on the document preview - Preview is split in two iframes, both with the same content (pdf) **Issue:** Due to the `isPdf` patch the attachment can match multiple types for the preview (pdf and text) as both getter return `true`. ``` <iframe t-if="state.file.isPdf" ... <iframe t-if="state.file.isText" ... ``` It also seems that xml received by mail are imported as text, which is why the issue doesn't happen when manually uploading the same xml file. **Fix:** Ensure that if the document is matching `isPdf`, it doesn't trigger the second iframe with `isText`. Also it seems fixed in 19.0 as the text iframe is replaced by this xpath: `<xpath expr="//iframe[@t-if='state.file.isText']" position="replace">` which was added for https://github.com/odoo/enterprise/commit/de614ee5e9a087d49939c65c0118ae6164c7b31b related patch: https://github.com/odoo/enterprise/commit/ffcdd2275c8bf564e15151ccbcaf3965ed968450 opw-6018536 Forward-Port-Of: odoo/enterprise#114759 Forward-Port-Of: odoo/enterprise#112041
This update corrects a bug where paying with the 'customer account' method on a zero-priced POS order resulted in an incorrect payment calculation. The fix hides the 'pay_later' payment option in this scenario, aligning with business requirements and preventing inaccurate financial reporting. This ensures proper order settlement.
Original PR description
Step to reproduce: - install "pos_settle_due" - create a pos order, set order price = 0, select a customer - go to payment page, select "customer account" as payment method - here you can set any…
Step to reproduce: - install "pos_settle_due" - create a pos order, set order price = 0, select a customer - go to payment page, select "customer account" as payment method - here you can set any amount to pay, ex 100$ - fulfill the order. Observation: - the order amount is 0, if we pay 100$ using customer account, it is considered as change (which means we returned it to customer) - As per PO, this flow doesn't make sense Issue: - customer has 100$ due for this order, but he won't be able to settle this as fetch order to settle with amount != 0, after commit [1] - [1] https://github.com/odoo/enterprise/commit/12af23d5382e972facfaa999e4c5ab30c97e8d1f https://github.com/odoo/enterprise/blob/951e5f42884c898bc14d9c32ae6a8f08c31ff06d/pos_settle_due/static/src/app/screens/partner_list/partner_line/partner_line.js#L35 Fix: - we hide payment method of type "pay_later" in case of 0 price order opw-6123699 Forward-Port-Of: odoo/enterprise#118093 Forward-Port-Of: odoo/enterprise#116556
This update fixes an issue where mobile point-of-sale links to customer displays were inaccurate. By standardizing the URL generation process with the main POS system, the mobile app now correctly identifies and displays customer information, ensuring a consistent and reliable user experience. This resolves a technical inconsistency that could have impacted customer data tracking.
Original PR description
The `_showDisplayAndGoToUrl` method in the mobile navbar was manually constructing its own URL for the customer display. This hardcoded string incorrectly omitted the device UUID, which is required for proper display identification and tracking. By leveraging the new `customerDisplayURL` getter introduced in the parent `Navbar` component, the mobile implementation now utilizes the exact same URL logic as the standard point of sale. This resolves the inconsistency and ensures the customer display functions reliably on mobile devices. opw-6212067 Forward-Port-Of: odoo/enterprise#118602 Forward-Port-Of: odoo/enterprise#118458
This update resolves a critical issue where the Swedish SIE 4 report export would crash due to excessive memory usage. By optimizing the database query and using efficient data processing techniques, the export now handles large datasets quickly and reliably, significantly improving performance.
Original PR description
### Description of the issue/feature this PR addresses: Prevent Out of Memory (OOM) crashes and drastically improve execution speed when generating the Swedish SIE4 verification export for massive…
### Description of the issue/feature this PR addresses: Prevent Out of Memory (OOM) crashes and drastically improve execution speed when generating the Swedish SIE4 verification export for massive datasets. ### Current behavior before PR: When exporting a large volume of journal entries (e.g., 190,000+ account moves), the `_export_l10n_se_sie4_verification` method relies on iterating through heavy ORM recordsets and accessing relational child fields (move.line_ids) inside a loop. This triggers a severe N+1 query problem, maxing out server RAM and causing an OOM crash. ### Desired behavior after PR is merged: The method now utilizes a hybrid data extraction approach: - The ORM is used strictly to safely evaluate domains (multi-company rules, dates, states) and fetch a lightweight list of valid move_ids. - A single SQL query with JOIN statements fetches all parent moves, child lines, and account codes in exactly one database query. - itertools.groupby chunks the flat, lightweight dictionary results back into their respective journal entries. The export now handles massive datasets in seconds with minimal memory overhead, while remaining perfectly secure. ### Benchmark: For Memory: | # Input Data | Before PR | After PR | | -------- | -------- | -------- | | ~190,000 moves | MemoryError | 407MB| | ~200,000 moves | 1.8GB | 174.8 MB| For Speed: | # Input Data | Before PR | After PR | | -------- | -------- | -------- | | ~190,000 moves | MemoryError | 5.10s | | ~200,000 moves | 1m29s| 5.3s| ### Reference: opw-6067999 Forward-Port-Of: odoo/enterprise#117577 Forward-Port-Of: odoo/enterprise#113227
This update automatically adds the staff user to appointment attendee lists when creating new appointments through the Gantt view. Previously, staff members weren't automatically included, requiring manual addition. This change improves the user experience by streamlining appointment creation and ensuring staff are always part of the meeting.
Original PR description
### Steps to reproduce: - Install 'Appointment' app - Configure an Appointment Type with your user as staff member - Go to the Appointments Gantt view - Click on the 'New' button to create a new appointment > The staff member is not automatically added to the meeting's attendees (guests) list. ### Cause of Issue: When generating the default values for a new calendar event from the Gantt view (indicated by `booking_gantt_create_record` in the context), the base `default_get` method doesn't account for auto-adding staff members in obvious cases (when there's only one staff member available or the current user is one of the staff). ### Fix: Override `default_get` in `calendar.event` to automatically add these staff members when they are the only available option, providing a smarter and more seamless UX. opw-6181794
This update resolves an issue where appointment scheduling displayed 'no slots available' for future-starting appointments. The fix accurately calculates the displayed month based on the appointment's start date, ensuring correct slot availability is shown in the calendar. This improves the user experience for scheduling appointments that begin in a later month.
Original PR description
The "show only 1 month at a time" optimization computes the navigated month as datetime.now() + month_id, so the controller passes that (month, year) tuple to _get_appointment_slots:…
The "show only 1 month at a time" optimization computes the navigated month as datetime.now() + month_id, so the controller passes that (month, year) tuple to _get_appointment_slots: https://github.com/odoo/enterprise/blob/57ec37b74a60c7e879a8afa66df5ab22a92c5bcd/appointment/models/appointment_type.py#L833 For a punctual appointment whose Allow Bookings range starts in a future month, the first displayed month is start_datetime.month, so the (month, year) tuple doesn't match the month the visitor is looking at. The model fills an empty month and the recovery loop refills the first displayed month (where slots actually live): https://github.com/odoo/enterprise/blob/57ec37b74a60c7e879a8afa66df5ab22a92c5bcd/appointment/models/appointment_type.py#L973-L988 The calendar the visitor just navigated to comes back empty. Compute the navigation base from start_datetime when it lies in the future and keep datetime.now() otherwise. month_id is added on top of that base so it always matches the displayed month index. Introduced by https://github.com/odoo/enterprise/commit/664857dd2c4ae2bc0dde8f44cb94136659ed2fe2 Steps to reproduce: 1. Open the Appointments app 2. Open an appointment type and set Schedule to Weekly and Allow Bookings to On specific dates with a range starting in a future month (for example 1 September to 31 December) 3. Save and click the Preview button in the header 4. Pick a staff member to reach the calendar 5. Click the right arrow to navigate to the next month => the next month shows "Sorry, we have no more slots available for this month" opw-6206293
This update fixes an issue where global invoices created after a POS order at the end of the month were incorrectly displaying the following month. The system now accurately converts POS order dates to the correct Mexican timezone, ensuring invoices reflect the accurate order date and month.
Original PR description
**PROBLEM** When creating a global invoice, with the last order being at the end of the last day of the month, the month of the global invoice will not be correct. (e.g, order made at the end of May and global invoice created for June). date_order is stored in utc. To compute the day the order was made, we need to convert to a MX timezone. **STEP TO REPRODUCE** 1. Create an pos order at the end of the last day of a month (for example, at 10PM in local MX time). 2. Create a global invoice with this order. 3. Notice the global invoice month will be the month after the one of the order. opw-6221049 Forward-Port-Of: odoo/enterprise#118170
This update fixes a potential issue where users could incorrectly select inactive Intrastat codes when configuring products. The system now displays a warning message if an inactive code is chosen, ensuring data accuracy and preventing incorrect reporting. This improves data integrity for Intrastat compliance.
Original PR description
Problem: When choosing an intrastat code on a product, all the codes are shown, even the ones that are expired or not yet active. Users can select an intrastat code that is not active. Steps to reproduce: 1. Check the intrastat code list and find a code with a start date in the future or an expiry date in the past 2. Note the code description 3. Open a product form view and try to set/change the intrastat code 4. Search for the code description noted in step 2 5. Note that the code is proposed while it should not be proposed Solution: When an intrastat code is selected, if the code is not active, a warning message is shown to the user. opw-6217915 Forward-Port-Of: odoo/enterprise#118569 Forward-Port-Of: odoo/enterprise#117884