Daily updates from Odoo
Tuesday, June 30, 2026
43 changes · master
New functionality added to Odoo
Charts can now include an information note and/or a 'see more' link, shown through the chart info icon. This makes charts more useful by giving users extra context or a path to more details directly from the chart.
Original PR description
Possibility to add a note or a link in the chart side panel Task: [5365254](https://www.odoo.com/odoo/2328/tasks/5365254)
Enhancements to existing features
We updated the app name sent to Avalara to “Odoo SA” so these requests are easier to distinguish from other app store entries. This is a small behind-the-scenes improvement that helps avoid confusion in service reporting and identification.
Original PR description
To distinguish these calls from others in the app store, we change our app name to Odoo SA. task-6305073
Australian payroll calculations have been updated for the 2026-27 financial year. The change also corrects how Medicare exemptions are applied from 2024 onward, helping ensure payslips and corrections use the right tax amounts.
Original PR description
Update tax rates and formulas for the 2026-27 financial year in the Australian payroll module. This commit also amends the tax rates and formulas from 2024 onwards. The Medicare exemption is now properly factored into the tax rates from the 2024-25 fiscal year forward, with the revised formula applied accordingly. Data for pre-2024 remains supported to facilitate importing historical payslips for corrections, aligning with the ATO rule allowing amendments for up to 5 years after the original payslip date. 6252689 Forward-Port-Of: odoo/enterprise#121561
This update adds two additional food delivery providers, Food Zapp and Enqueue, to the Point of Sale delivery integration. It expands the available local options for businesses operating in the UAE and Saudi Arabia, making it easier to connect with region-specific delivery services.
Original PR description
In this commit: - We are introducing two new providers, FoodZapp and Enqueue, for the UAE and KSA, respectively. Task-6263190,6263310 Forward-Port-Of: odoo/enterprise#122001 Forward-Port-Of: odoo/enterprise#121461
The timesheet assistant manager now makes more reliable suggestions when helping users fill in timesheets. This improves day-to-day accuracy and reduces the chance of suggested entries needing manual correction.
Original PR description
This commit's purpose is to add a few bugprovement to the timesheet assistant manager. Those imp concerns mostly the timesheets suggested by the assistant manager. task-6179842 Forward-Port-Of: odoo/enterprise#121946 Forward-Port-Of: odoo/enterprise#118494
This update expands automated testing to cover how the New button works in list and kanban views. It helps ensure the expected create flow is correctly handled across different view configurations, reducing the risk of regressions for users adding new records.
Original PR description
…an views This commit expands the Clickbot's test coverage by simulating a click on the "New" button within list and kanban views. Depending on the view's configuration, this action will either open the corresponding creation form view, trigger editable mode for inline-editable lists, or launch the quick create interface in kanban views. task-6324762
The Point of Sale interface for Sweden has been updated to hide the Split Bill action when the Sweden blackbox is enabled. This keeps the POS aligned with the supported local setup and avoids showing an option that cannot be used.
Original PR description
The bill splitting configuration has been removed from PoS settings. Since bill splitting is not supported when using the Sweden blackbox, this commit adapts the localization by overriding the control button template to hide the Split Bill button in the POS UI when the Sweden blackbox is enabled. Task [link](https://www.odoo.com/odoo/project.task/6294276) task-6294276 Related PRs: - Community: https://github.com/odoo/odoo/pull/269442 - Upgrade: https://github.com/odoo/upgrade/pull/10465
The Belgian payroll settings now calculate the percentage option against withholding tax instead of taxable salary, making deductions more accurate. We also added clearer option labels, a way to set a total monthly tax target, and automatic limits so deductions cannot exceed what is available.
Original PR description
The percentage option was previously computed on the taxable salary instead of the withholding tax amount. Also, a total guaranteed tax ceiling option and a net salary safety cap were missing. - Change % option calculation to scale against withholding taxes (PP). - Rename '€/month' option to '€ extra/month'. - Add '€ in total /month' option to pay a target total tax amount. - Add descriptive help messages to clarify calculation methods for users. - Cap the deduction automatically to never exceed available taxable salary. Task-ID: 6326856
The Belgian payroll rules now use a single clear setting to determine Intellectual Property wage handling, instead of relying on a redundant separate field. This makes the payroll setup easier to maintain and reduces the risk of inconsistencies in contract and payslip calculations.
Original PR description
The current Intellectual Property (IP) setup for Belgian payroll is broken. The `ip` field is a redundant field which can be removed and replaced by the ip_wage_rate for computation making it much simpler. This commit cleans up the redundant schema and simplifies the workflow: - Removes the `ip` field. - Updates the payslip computation to rely solely on `ip_wage_rate` (if > 0, IP is applied). - Cleans up views and Python references where this field was utilized. Task: 6259513
This update adjusts how several enterprise features read and react to UI data in chatter, activities, and attachment previews. It helps these screens stay more reliable and consistent as information changes, with no expected impact on business workflows.
Original PR description
Enterprise counter-part: adopt the `propSignal`/`propComputed` hooks (and `props.static` for callbacks) across the chatter, activity and attachment patches. Every prop read gains `()`. https://github.com/odoo/odoo/pull/271518
Belgian payroll salary rules were updated so several deductions and insurance amounts now appear in the new complementary information section on payslips. A new meal voucher employer contribution line was also added, and one deduction label was clarified to make payslip information easier to understand for employees and payroll users.
The company switcher and mobile menu checkboxes now follow the Enterprise theme more consistently in their checked, focus, hover, and indeterminate states. This improves the visual consistency of the interface and makes these controls feel more polished across the web client.
Original PR description
This commit scopes the switch company and mobile burger menu checkboxes to use the Enterprise theme colors for checked, indeterminate, focus, and hover states etc. task-6236887
Belgian payroll calculations now apply the legally required gradual reduction of the company withholding tax exemption starting in 2027. This keeps the figures shown in the interface aligned with the amounts reported in the official declaration, while avoiding unnecessary database updates.
Original PR description
Belgian regulations require lowering the company withholding tax exemption starting in 2027 to increase state revenue. A centralized multiplier is introduced to apply these progressive yearly reductions (97% in 2027, 93.35% in 2028, 95.9% for 2029+). By applying this directly in-memory during the 274.XX compute loops and Finprof XML rendering, we ensure perfect alignment between the UI and the legal declaration while avoiding redundant database writes. task-6317135
This update makes record tracking more consistent by centralizing how tracking information is exposed and handled. It also cleans up a few outdated tracking settings in tests and related code, reducing confusion and avoiding unnecessary work during record creation.
Original PR description
This small code improvement PR serves two main purposes Serve field track info at fields_get level Override 'fields_get' to include tracking information when asked. That way there is a single entry point to fetch this information making it more standard. Track values in mail.track.mixin Currently, mail.track.mixin offers tools to enable tracking while actual automatic tracking is performed in mail.thread. It was planned but forgotten to move the value tracking in the track mixin, this is now done. Logging is still done by mail.thread but tracking itself is now better contained in track mixin. Cleanup some code bits / remove useless tracking keys notably in tests. Task-6274958
Users can now add an information text and an optional “see more” link to charts. The content is available from the info icon and can be edited in the spreadsheet design panel, making charts more informative and easier to explain.
Original PR description
It's now possible to add a information text and/or a see more link to a chart. Accessible with the info icon on the chart. Editable in the design side panel. Task: 5365254
The Belgian payroll rules now include the Flemish reduction for inexperienced employees. This applies automatically for eligible contracts and work locations, helping companies benefit from the correct payroll deduction for the first four quarters, with the right restart rules after interruptions.
Original PR description
Implement DMFA deduction code 6340 for the Flemish ONSS reduction for inexperienced employees. The reduction applies for the first four quarters starting from the employee's first contract date, provided that: * the contract version has the **Flanders Inexperienced** flag enabled; * the work address maps to a Flanders (`fl`) DMFA location unit. If the contract is interrupted for more than four quarters, the reduction period resets and is applied again upon resumption. If the contract is interrupted after the first two quarters and resumes within four quarters, the reduction continues for the remaining two quarters only (it does not reset). task-6149059
This update makes it easier to correct superannuation amounts after a payslip has already been submitted and paid. It also updates STP reporting so these corrections are recorded properly, reducing manual work and helping payroll reports stay accurate.
Original PR description
Amending STP creates an update action if full file replacement is not available. Amended STPs create delta superannuation stream lines. task-6245415 Forward-Port-Of: odoo/enterprise#119946
Turkey payroll users will now see missing field warnings directly on payslips instead of running into hard errors when generating reports. This makes it easier to fix incomplete company or employee information in advance, while also improving report naming, settings placement, and field guidance for a smoother payroll setup.
Original PR description
- Instead of raising hard errors during report generation, warnings and errors for missing required MUHSGK fields are now displayed directly on the payslips. - This allows users to identify and correct missing information (such as tax/SGK codes on the company or occupation/social insurance numbers on the employee) before generating the payment reports. - Additionally, the workplace agent sequence number on the report is now dynamically fetched from the company's configuration rather than being hardcoded to '000'. - Moves the Turkey payroll settings to the payroll section in settings. - Renames the report selection and downloaded files from "MUHSGK" to "1003B (MPHB)". - Adds clear descriptions/tooltips to the SGK registration number, unit codes, and intermediary code fields. Task-6284594
Odoo can now use email contact data captured by the Gmail browser extension to improve timesheet suggestions. When emails are read or composed, the related people can be matched to projects or tasks and added as helpful key suggestions, making it easier to find the right work items faster.
Original PR description
[IMP] timesheet_grid: Gmail watcher In this commit, Odoo now consumes data from the new Gmail Chrome and Firefox web extension, which captures the from, to, cc, and bcc fields of read and composed emails and sends them to Activity Watch. Odoo retrieves these events, extracts the emails, searches for partners linked to projects and/or tasks, and adds them to suggestions as keyEvents. task-5956040 Forward-Port-Of: odoo/enterprise#120727 Forward-Port-Of: odoo/enterprise#112014
Employers can now record transport subscriptions paid directly to a provider on Belgian payroll slips. This ensures the amount is reflected in the employee’s individual statement and the 281.10 tax report, while keeping the employee’s actual net pay unchanged.
Original PR description
Before this commit, when an employer paid an employee's transport subscription directly (e.g. a bus company billing the company), there was no way to record that amount on the payslip, so it never appeared on the individual account or the 281.10 fiscal report. After this commit, two CP200 salary rules handle it: an input rule (TRANSPORT_3P) adds the encoded subscription to the net, and a deduction rule (TRANSPORT_3P_DED) subtracts the same amount before the net, keeping real net pay unchanged. The declared amount now flows into 281.10 box 14a, alongside other public transport reimbursements. task-6293778
Users can now set a down payment as either a percentage or a fixed amount before an order is confirmed. The system keeps both values in sync automatically, and disabling prepayment is now done by setting the down payment to zero, simplifying the configuration.
Original PR description
Previously, we could only specify a down payment as a percentage. Now users can specify a fixed amount for the down payment required before confirming the order. When the amount changes, the percentage is automatically recalculated, and vice versa. When configuring the template, only a percentage can be set. We removed the online payment toggle and field. So now, to disable the prepayment feature, we have to set the down payment to 0. The **require_payment** field has been removed, and we now use _prepayment_percent = 0_ to indicate that _require_payment = False_. PR: https://github.com/odoo/odoo/pull/270071 Upgrade: https://github.com/odoo/upgrade/pull/10509 task-6293915
Resolved issues and error corrections
This update prevents errors when Shopee sends buyer IDs that are larger than the system’s original number limit. Instead of failing to create or match the contact, Odoo now stores those oversized identifiers in an alternate contact reference field so the connector keeps working reliably.
Original PR description
When the Shopee connector was introduced, Shopee documented `buyer_user_id` as an int32. We therefore store it in an `Integer` field, which maps to a PostgreSQL int32 column. However, feedback showed that Shopee can send ids exceeding the int32 bounds, leading to a traceback when creating new contacts. Shopee has since updated their documentation to confirm the field is actually an int64. Since we are in stable and cannot change the column type, this commit falls back to the `ref` field of the `res.partner` model to store and match Shopee contacts whose identifier doesn't fit within an int32. opw-6325948 See also: - master: https://github.com/odoo/enterprise/pull/121507 - upgrade: https://github.com/odoo/upgrade/pull/10578 Forward-Port-Of: odoo/enterprise#121707 Forward-Port-Of: odoo/enterprise#121498 Forward-Port-Of: odoo/enterprise#122028
This update prevents a brief access error that could appear when a user switches companies while viewing a payroll run. If the run is not available in the newly selected company, the system now redirects directly to the payroll run list instead of showing an error first.
Original PR description
Steps to reproduce: 1- Open a payrun 2- Switch companies Issue: You get an access error for a moment and then get redirected to payrun list view Cause: When switching companies, the payrun reloads but since it is in the context of a different company, you get an access error. Solution: First check in js before fetching that you have access to the payrun, if not, redirect to the list view instead. Task-6008140 Forward-Port-Of: odoo/enterprise#120004
This change updates automated map view tests so they no longer pause longer than necessary while waiting for data to load. It helps prevent test failures caused by slow execution, improving build stability without changing the user-facing map feature.
Original PR description
This commit replaces the waitFor timeout in map view tests with runAllTimers to cope with potential execution slowdowns and avoid waiting for too long while executing the tests. runbot-error-939600 Forward-Port-Of: odoo/enterprise#120618 Forward-Port-Of: odoo/enterprise#119654
This update fixes how basic salary is classified on the Philippine Form 2316 for regular employees. Salaries below the annual tax-exempt cap are now reported as non-taxable, while amounts above the cap are reported as taxable, which improves the accuracy of employee tax filings.
Original PR description
Previously, a regular (non-MWE) employee's basic salary was always reported as taxable (item 39), regardless of amount. This commit fixes that by checking the yearly basic salary against the tax-exempt cap. If it is below the cap, it is now reported as non-taxable (item 29) and when the amount is above the cap it will be taxable (item 39) task-6328424
This update fixes a problem in Planning where employees with the right skill could be missed in search results if they had no scheduled slots in the selected time range. The search now correctly keeps the skill-based filter, so employees are shown as expected when searching by skill.
Original PR description
Issue: ---------------------------------------- Doing a search on skills, the employees with the skill but no slot in the time frame aren't shown. Steps to reproduce:…
Issue:
----------------------------------------
Doing a search on skills, the employees with the skill but no slot in the time frame aren't shown.
Steps to reproduce:
----------------------------------------
- Install `planning_hr_skills`
- Make sure an employee has the skill "English" and no slots
- Open Planning and type "English" in the search bar, click to search on Skills
- The employee does not show up
Cause:
----------------------------------------
Using the search view on skills, a filter on `resource_ids` is in the domain with a `OR`:
https://github.com/odoo/enterprise/blob/5d6d16aae43ffda1532cfa4b06fdcddd7e5b0fcc/planning_hr_skills/views/planning_slot_views.xml#L9
Then a new filter on `resource_ids` is added [here](https://github.com/odoo/enterprise/blob/5d6d16aae43ffda1532cfa4b06fdcddd7e5b0fcc/planning_hr_skills/models/planning_slot.py#L14-L43) to do the search on the skill names: `[('resource_ids', 'in', matching_resource_ids)]`.
The domain is then something like this:
`['&', ('resource_ids', 'in', matching_resource_ids), '|', ('resource_ids', '=', False), ('employee_skill_ids', 'ilike', 'English')]`.
Since fbf8b2ac67c71ca0abfc75df543069696bd2d29b the resulting domain passes through `filter_map_domain()`. `filter_map_domain()` will only keep the leaves on `resource_ids` and the default `AND` will be used between them resulting in:
`['&', ('resource_ids', 'in', matching_resource_ids), ('resource_ids', '=', False)]`
which fetches no resources.
So `_group_expand_resource_ids()` doesn't expand.
Solution:
----------------------------------------
Instead of adding the new leaf to retrieve the resources with the right skills, we replace the leaf on `employee_skill_ids`. This ensures the `OR` operations are kept by `filter_map_domain()`.
opw-6296755
Forward-Port-Of: odoo/enterprise#120669This update fixes how net cost salary rules are calculated in the UAE and Saudi payroll localizations. It ensures company contribution items are handled consistently, preventing incorrect deductions and keeping payslip totals accurate.
Original PR description
Steps: - Add a new salary category with the parent_id of company contribution (COMP) in AE - Create a dummy salary rule of that category - Compute a payslip and see the net cost unchanged Or - Create and compute a payslip in SA - Company contributions will be subtracted from each other Issue: - In AE localization, the issue with the rule was dropping salary rules that have a parent of company contribution category - In SA localization, the issue with the NETCOST was the aggregation of individual rules could include negative values which is not the intended flow. Solution: A standardized approach was adopted in both localizations in order to match the calculation of the NETCOST across. This approach will account for the categories with company contribution parent as well as the positive values for the individual salary rules. Forward-Port-Of: odoo/enterprise#120780 Forward-Port-Of: odoo/enterprise#115499
This change fixes a crash that prevented the Master Production Schedule page from opening. It updates the page customization so it matches the current interface component name, restoring access to the MPS feature.
Original PR description
Issue Before This Commit: ------------------------------------------- Opening the Master Production Schedule (MPS) view caused the page to crash, preventing users from accessing the feature. Steps to…
Issue Before This Commit: ------------------------------------------- Opening the Master Production Schedule (MPS) view caused the page to crash, preventing users from accessing the feature. Steps to Reproduce: -------------------------------------- 1. Install the mrp_mps module. 2. Go to Manufacturing -> Planning -> Master Production Schedule. 3. Observe that the page crashes with the following error: Element '<xpath expr="//Dropdown/t[@t-set-slot='content']/t[node()]" position="before"> <GroupMenu items="this.env.model.data.groups[0]"/> </xpath>' cannot be located in element tree Cause of the issue: ---------------------------- The XPath override was targeting the `Dropdown` component. After the component was renamed to `SearchBarDropdown` in this [PR](https://github.com/odoo/odoo/pull/269592), the XPath no longer matched, causing the view inheritance to fail and the MPS page to crash. After This Commit: ------------------------------------ Update the XPath to target `SearchBarDropdown` instead of `Dropdown`, restoring the view inheritance and preventing the crash when opening the Master Production Schedule.
This update makes card layouts in the accounting and documents screens use the same spacing rules as other kanban cards. It helps the interface look more consistent and avoids layout differences between these views.
Original PR description
Rename and reuse the new generic card padding variables. Follow-up of https://github.com/odoo/odoo/pull/272083 Forward-Port-Of: odoo/enterprise#122037
This update fixes a Planning test tour that stopped working after a recent change to the gantt popover design. It helps ensure Planning’s automated checks continue to run reliably after interface updates.
Original PR description
PR [1] refactored the gantt popover API, and classname `.popover-footer` has been replaced by `.o_popover_footer` (i.e. we no longer use the bootstrap class for popovers). Tours that fail due to this change have been adapted accordingly. However, there was a planning tour that was temporarily deactivated and that we thus didn't spot. This commit fixes it. [1] odoo/enterprise#114328 runbot error~940279 Forward-Port-Of: odoo/enterprise#122048
This update corrects a test around tax rules so it only removes taxes that are actually tied to a fiscal position. Taxes that should remain available are now kept in the test, matching the intended behavior and preventing false failures.
Original PR description
map_tax on an empty fiscal position now preserves taxes with no fiscal_position_ids. Filter those out in test_tax_unit_auto_fiscal_position so the assertion only checks that taxes bound to a fiscal position are dropped by the unit FP. comunity PR: https://github.com/odoo/odoo/pull/268273 task-id 623151 Forward-Port-Of: odoo/enterprise#121889 Forward-Port-Of: odoo/enterprise#121525
GST return matching now correctly handles vendor bills issued in foreign currencies. This prevents bills from being incorrectly flagged as only partially matched when the GST portal reports amounts in INR, improving the accuracy of GST reconciliation.
Original PR description
**Steps to reproduce:** * Install the **l10n_in_reports** module. * Go to **Accounting → Configuration → Settings**, and enable **Multi-Currencies**. * Activate a foreign currency (e.g., USD) and set…
**Steps to reproduce:** * Install the **l10n_in_reports** module. * Go to **Accounting → Configuration → Settings**, and enable **Multi-Currencies**. * Activate a foreign currency (e.g., USD) and set an exchange rate. * Create a new vendor bill for an Indian vendor, setting the currency to USD. * Add lines to the bill and apply IGST/GST taxes, then confirm the bill. * Go to **Accounting → Reporting → GST Return Period** and initiate GSTR-2B matching for the period corresponding to the bill (using a valid JSON payload where the amounts are correctly reported in INR). **Observed behavior:** * The vendor bill is incorrectly marked as "Partially matched" instead of "Fully matched", accompanied by an exception stating that the total amount as per GSTR-2B does not match. **Cause:** * The GSTR-2B data fetched from the GST portal always reports values in the company's base currency (INR). * The `match_bills` method was directly comparing the GSTR-2B INR amounts ( `bill_total` and `bill_taxable_value`) against the bill's `amount_total` and `amount_untaxed` fields. * Because these fields return values in the document's foreign currency (e.g., USD), the mismatch triggers an exception and flags the bill as partially matched. **Fix:** * Modified the matching logic to compare GSTR-2B values against `abs(amount_total_signed)` and `abs(amount_untaxed_signed)`. * This ensures that the amounts evaluated during reconciliation are always correctly converted and compared in the company's base currency (INR). opw-6311097 Forward-Port-Of: odoo/enterprise#121837 Forward-Port-Of: odoo/enterprise#120967
This change corrects how the Intrastat report builds its database query when a company has no country set. It prevents the report from failing with an error, so users can generate Intrastat data reliably in those cases.
Original PR description
When there is no `country_id` on the company we get `False`. The generated query then fail at: ``` ... CASE WHEN (code.country_id IS NULL OR code.country_id = false) THEN code.code ELSE NULL END AS commodity_code, ... ``` with: ``` ERROR: operator does not exist: integer = boolean LINE 12: ... WHEN (code.country_id IS NULL OR code.country_id = false) T... ``` Forward-Port-Of: odoo/enterprise#121798 Forward-Port-Of: odoo/enterprise#121608
This update fixes the deadline rules used for Austrian VAT returns and EC sales lists. It now follows the real filing schedule instead of using the same fixed 15-day offset for both, helping users prepare and submit reports on time.
Original PR description
**[FIX] l10n_at_reports: correct Austrian return deadlines** The Austrian localization used a fixed `15 days` rule for both VAT returns and EC sales lists. This does not match the filing deadlines: the VAT return is due on the 15th day of the second following month while the EC sales list is due by the end of the following month (sources below). This fix replaces the hardcoded day offset with month-based deadline computation sources: https://www.usp.gv.at/themen/steuern-finanzen/umsatzsteuer-ueberblick/weitere-informationen-zur-umsatzsteuer/umsaetze-mit-auslandsbezug/zusammenfassende-meldung-zm.html https://www.usp.gv.at/en/themen/steuern-finanzen/umsatzsteuer-ueberblick/weitere-informationen-zur-umsatzsteuer/entstehen-der-steuerschuld-und-pflichten/umsatzsteuervoranmeldung.html opw-6147343 Forward-Port-Of: odoo/enterprise#117212 Forward-Port-Of: odoo/enterprise#116212
A test for WhatsApp channel “seen” updates was adjusted so the message notification is sent only after the browser connection is subscribed. This prevents the update from being missed, ensuring seen indicators appear correctly and the test no longer times out.
Original PR description
The "Allow SeenIndicators in WhatsApp Channels" test delivers the seen update over the bus with `_sendone`, but nothing waited for the websocket to subscribe to the channel first. When the notification was sent before the subscription landed it was dropped, the member's seen_message_id was never updated client-side and the seen indicators never rendered, so the assertion timed out. The current user is a member of the channel, so it is subscribed at connection time: wait for the subscription together with `start()` (listener registered first) before opening the channel and sending the notification. https://runbot.odoo.com/odoo/error/242021 Forward-Port-Of: odoo/enterprise#121857
Fixed an issue where the Time Spent cell in Timesheets could show the wrong status color when work schedules included fractional hours. This ensures the displayed color now matches the actual timesheet totals, avoiding misleading orange or red warnings for employees who have no overtime.
Original PR description
## Issue In the Timesheets app, the color of the *Time Spent* cell at the end of a row indicates the current status of the timesheets based on the expected number of working hours. The selected color…
## Issue
In the Timesheets app, the color of the *Time Spent* cell at the end of a row indicates the current status of the timesheets based on the expected number of working hours. The selected color (green/orange/red) is sometimes wrong when an employee has a work schedule with fractional hours.
## Steps to reproduce
1. Install *Timesheets* (`timesheet_grid`)
2. For an employee E, edit the *Standard 40 hours/week* schedule:
- Change *Monday Afternoon* "Work to" column from 17:00 to 17:20.
3. In Timesheets > All Timesheets, go back one week and fill the timesheet for the employee E. We need 8 hours everyday but on Monday, where we need 8 hours and 20 minutes.
4. __The background of the *Time Spent* cell is orange, even though there's no overtime anywhere, and the value in the cell is precisely 40:20, which is the expected amount of hours worked.__
## Cause
When comparing the amount of hours worked and the expected amount of hours, small rounding errors occur. At this point of the execution:
https://github.com/odoo/enterprise/blob/19b7f5a6961dbce7367c07fcc55eea1925832634/timesheet_grid/static/src/views/timesheet_grid/timesheet_grid_renderer.js#L157
We obtain the following values:
```js
> monday = section.cells[1]
> monday.value
8.333333333333336
> workingHours[monday.column.value]
8.333333333333332
> monday.value - workingHours[monday.column.value]
3.552713678800501e-15
```
This small difference differing from 0, the wrong color is selected by `_getSectionTotalCellBgColor`:
https://github.com/odoo/enterprise/blob/19b7f5a6961dbce7367c07fcc55eea1925832634/timesheet_grid/static/src/views/timesheet_grid/timesheet_grid_renderer.js#L160-L172
## Fix
The same issue was fixed elsewhere by https://github.com/odoo/enterprise/commit/3340c0610ae6d7d3087f20da04309512771cc4b7. The same fix is applied here for consistency.
opw-6193181
Forward-Port-Of: odoo/enterprise#121463This change separates the calculation of the worker-specific social contribution base into its own rule. It makes the payroll logic clearer and helps ensure the correct contribution amount is applied for worker employees in Belgium.
Original PR description
Add a new intermediary salary rule `ONSS_BASE_WORKER` that computes the ONSS base at 108% exclusively for worker employees. This rule is conditioned on `version.is_worker()` and replaces the inline `if` branch that was previously embedded in the main `ONSS` rule. A new salary rule category `ONSS_BASE_WORKER` is introduced to accumulate the worker-specific base, allowing the main `ONSS` rule to reference it via `categories['ONSS_BASE_WORKER']`. Task: 6253670
This change fixes an issue that could prevent appraisal email templates from being read correctly. As a result, automated appraisal messages should now send without errors, reducing disruptions for HR teams.
Original PR description
Task#6309699 Forward-Port-Of: odoo/enterprise#121115
This change stops an automated accounting test from failing when the ISO 20022 module is not installed. It keeps the test suite stable in environments where that optional payment setup is unavailable.
Original PR description
The test_batch_payment_deletion test is currently failing when `account_iso20022` is not installed because the sepa_ct payment method doesn't exists. Add a skipTest in case the module is not installed. runbot-940257 Forward-Port-Of: odoo/enterprise#121511
This fix lets the Barcode app correctly register several serial numbers or lots during one manufacturing session instead of keeping only the last one. It prevents validation errors and ensures the finished product is saved with the right production details, which makes manufacturing workflows more reliable.
Original PR description
Steps to reproduce ------------------ Serial-tracked finished product: 1. Create a serial-tracked finished product and an un-tracked component. 2. Create a Manufacturing Order with quantity 2 and…
Steps to reproduce ------------------ Serial-tracked finished product: 1. Create a serial-tracked finished product and an un-tracked component. 2. Create a Manufacturing Order with quantity 2 and confirm it. 3. Open the Barcode app, scan the MO, then scan a first serial number SN_X1. 4. Scan a second serial number SN_X2. 5. Validate. Lot-tracked finished product: 1. Create a lot-tracked finished product with a one-component BoM and an existing lot LOT_A. 2. Create a Manufacturing Order and confirm it. 3. Open the Barcode app, scan the MO, then scan the existing lot LOT_A. 4. Scan a different, not-yet-existing lot LOT_B. 5. Validate. Issue ----- Only the last scanned serial is registered on the MO, and validation then fails because the count of producing serials does not match qty_producing for a serial-tracked finished product. updateLine overwrote lot_producing_ids with [args.lot_id] on every scan, so the first serial was dropped when the second one was scanned, and the same branch never staged a freshly typed lot_name, so a brand-new serial typed on a serial-tracked MO was lost before reaching the backend. https://github.com/odoo/enterprise/blob/4a2f1da5466740b7758d1962e5241620845d616b/stock_barcode_mrp/static/src/models/barcode_mrp_model.js#L407 Two behaviours of the shared barcode dispatcher make a single accumulating branch insufficient. The final-product line must keep exposing a producing lot, otherwise the base hasUnassignedQty check counts a scanned serial as zero once a quantity is already set, leaving qty_producing stuck below the demand. https://github.com/odoo/enterprise/blob/f622064871bf55b93890606d16407c50cf4419a6/stock_barcode/static/src/models/barcode_model.js#L1446 But exposing a producing lot makes the dispatcher treat the next serial as a conflicting tracking number, since the base _canOverrideTrackingNumber considers a different lot name non-overridable. https://github.com/odoo/enterprise/blob/f622064871bf55b93890606d16407c50cf4419a6/stock_barcode/static/src/models/barcode_model.js#L796-L798 So the scan is diverted to a new line through the override gate instead of updating the header line. https://github.com/odoo/enterprise/blob/f622064871bf55b93890606d16407c50cf4419a6/stock_barcode/static/src/models/barcode_model.js#L1585 For a lot-tracked finished product the producing lot can be corrected by scanning a different value, but the lot branch only stored a freshly typed value in lot_name and overwrote lot_producing_ids with the single existing lot. https://github.com/odoo/enterprise/blob/4a2f1da5466740b7758d1962e5241620845d616b/stock_barcode_mrp/static/src/models/barcode_mrp_model.js#L404-L407 The header reads its lot from lot_producing_ids whenever that relation is set and only falls back to lot_name when it is empty. https://github.com/odoo/enterprise/blob/4a2f1da5466740b7758d1962e5241620845d616b/stock_barcode_mrp/static/src/components/header.js#L45-L58 The save path only promotes lot_name to a producing lot when lot_producing_ids is empty, so scanning an existing lot then a new one neither displayed nor recorded the new lot and the finished product was produced under the old lot. https://github.com/odoo/enterprise/blob/4a2f1da5466740b7758d1962e5241620845d616b/stock_barcode_mrp/static/src/models/barcode_mrp_model.js#L628 Solution -------- Accumulate scanned serials by appending to lot_producing_ids instead of replacing it, and stage a freshly typed lot_name as a new producing lot when the finished product is tracked by serial, so every serial reaches the backend. Keep the final-product line exposing the last producing lot so each scanned serial is still counted as one unit instead of resetting the quantity to zero once several serials are registered. Override _canOverrideTrackingNumber for the final-product line so a serial scan updates the header line rather than being diverted to a new line, which is the only valid path for the finished product since it is a single header line backed by the lot_producing_ids relation. Persist the producing serials with explicit x2many commands, separating already-existing lots from freshly typed ones, so both are written on the MO. Reject a serial that is already registered on the MO so the same number cannot be produced twice in one session. For a lot-tracked finished product, build a producing lot from the scanned value, using the existing lot or a freshly typed lot name, and store it in lot_producing_ids so the new lot is both displayed and persisted through the same x2many commands as the serial case. Leave the produced quantity unchanged when the scanned lot differs from the one already registered, since replacing the lot is a correction and not an extra unit, and keep incrementing it when the same lot is scanned again. opw-6189620 Forward-Port-Of: odoo/enterprise#121849 Forward-Port-Of: odoo/enterprise#116890
Code cleanup and technical improvements
The separate Mexico payroll EDI add-on was merged into the main payroll accounting module. This simplifies installation and maintenance while keeping payroll reporting and accounting behavior in one place.
Original PR description
Currently, l10n_mx_hr_payroll_account_edi is auto installed with l10n_mx_hr_payroll_account. We merged the first one into l10n_mx_hr_payroll_account. task-6226929
This change updates automated tests in Knowledge, Web Studio, and AI so they work with the latest plugin setup. It helps keep the test suite passing and ensures future changes in these areas are validated correctly.
Original PR description
\* = knowledge, web_studio, ai - Update tests to use withPlugins/basePlugins - Update manual plugin list usage Community PR: https://github.com/odoo/odoo/pull/259303 task-6014100
This change moves a shared address-splitting helper into a more central location used by several local reporting modules. It does not change business behavior, but it simplifies maintenance and keeps the affected country-specific reports aligned on the same logic.
Original PR description
https://github.com/odoo/odoo/pull/269676