Thursday, March 5, 2026
23 changes · 19.0
Resolved issues and error corrections
This fixes an issue where some themes could block users from changing rounded corners in the website editor. The editor now handles zero-value styling consistently, so design changes can be made without an error interrupting the workflow.
Original PR description
**Problem:** When using themes that define border-radius as unitless `0` (e.g., Anelusia theme) and attempting to modify the "Rounded Corners" value of any element through the website editor, the…
**Problem:**
When using themes that define border-radius as unitless `0` (e.g., Anelusia theme) and attempting to modify the "Rounded Corners" value of any element through the website editor, the following error occurs: "Cannot convert 'px' units into '' units !"
**Steps to reproduce:**
1. Install and activate the Anelusia theme (or any theme with unitless border-radius: 0)
2. Open the website editor
3. Select any element (e.g., a table in the footer)
4. Try to change the "Rounded Corners" field to any non-zero value
5. Observe the error: "Uncaught Promise > Cannot convert 'px' units into '' units !"
**Current behavior:**
The website editor throws a JavaScript error and prevents changing rounded corners.
**Expected behavior:**
Users should be able to modify rounded corners values without errors, regardless of whether the theme uses unitless or unit-based zero values.
**Cause of the issue:**
Some themes define border-radius variables as unitless `0` (e.g., `$border-radius: 0`). When the website editor's areCssValuesEqual() function in utils_css.js compares the new value (e.g., "10px") with the existing computed value ("0" - unitless), it attempts to convert between units. The getNumericAndUnit() function extracts the unit from "0" as an empty string "", then convertValueToUnit() tries to convert "10px" to "" unit. Since there's no conversion defined for "px" to "" (empty unit), convertNumericToUnit() throws the error.
**Fix:**
Add a special case in areCssValuesEqual() to handle unitless zero values before attempting unit conversion. When the first value is unitless "0", we compare the numeric values directly using Number.EPSILON, avoiding the unit conversion entirely. This allows proper comparison between unitless "0" and values like "10px" or "0px" without errors, while maintaining correct equality checks (0 equals 0px, but 0 does not equal 10px).
opw-5412414
Forward-Port-Of: odoo/odoo#246335This fix lets users reply to task-related messages from another company when they have access to that company. It removes a workflow-blocking error in multi-company setups, helping teams collaborate through notifications and chatter as expected.
Original PR description
Before these changes, messages from other companies were received, but when trying to reply to them, an error occurred that prevented the response. Steps to reproduce the issue in runbot: 1. In one tab, log in as admin, and in another incognito tab, open demo. 2. Make sure demo has Handle Notifications in Odoo enabled. 3. Set admin in one company and demo in another company. 4. Assign a task to demo. 5. Click on the notification to open the chatter and try to reply. An error is thrown With these changes, the response can be logged when the user has access to the company from which the task was assigned. cc @Tecnativa TT61176 ping @pedrobaeza --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251327 Forward-Port-Of: odoo/odoo#250677
Users can now send follow-up reports by post without hitting an access error when they lack company administration rights. This keeps customer follow-up mailings working reliably for regular staff while preserving the intended permission model.
Original PR description
Issue: Before this commit, when sending a follow up report by post, an access error is thrown if the user doesn't have enough access to modify the res.company model Fix: modifying the external_report_layout_id as sudo opw-5482855 Forward-Port-Of: odoo/odoo#248677
This fix prevents large decimal currency values from showing tiny unwanted extra digits, such as displaying 700.000000000001 instead of 700. It improves confidence in financial data shown in the web interface while keeping backend precision unchanged.
Original PR description
Steps to reproduce: - activate a second currency - define the currency rate at 700 Issue: You will get 700.000000000001 Cause: In 18.0 we used to use toFixed, it changed…
Steps to reproduce: - activate a second currency - define the currency rate at 700 Issue: You will get 700.000000000001 Cause: In 18.0 we used to use toFixed, it changed https://github.com/odoo/odoo/commit/5c51a3f0d5569a53c050cf515e4d19eaf409faec For digits="[12,12]" such as defined in the [ `res_currency_views`](https://github.com/odoo/odoo/blob/0d489940ed0da4c8fdcf0b18446ec3beab8933cd/odoo/addons/base/views/res_currency_views.xml#L21-L22), for values above a certain threshold ( >=563)* the epsilon becomes higher than 0.5 > Math.log2(Math.abs(562000000000000)) 48.99756345886927 > Math.log2(Math.abs(563000000000000)) 49.00012825072858 Solution: Make sure the epsilonMagnitude always stays <=48 so it's not unintentionally rounded up Note: Actually there is a rounding issue on the python side due to the double inversion https://github.com/odoo/odoo/blob/a641275f162778aaaff7b21074915bd700296a39/odoo/addons/base/models/res_currency.py#L444 Which is why the client is complaining about the 500 threshold. Python small float error + JS amplifying it => 0.0....01 But we won't correct this on the python side as we want to keep this value as precise as possible and round it at the latest stage of the business flow opw-5966597
Batch transfer reports now list items by location and product instead of splitting the same product across different deliveries. This makes printed picking documents easier for warehouse operators to follow, reducing search time and the chance of missed items.
Original PR description
Issue Before This Commit: ======================= In the `batch transfer report`, move lines are ordered by the `picking's batch sequence` (picking_id.batch_sequence). When operators use the document…
Issue Before This Commit: ======================= In the `batch transfer report`, move lines are ordered by the `picking's batch sequence` (picking_id.batch_sequence). When operators use the document to pick items, they have to scan through the report to find all lines for the same product. As a result, operators `lose time scanning the document` and `risk of missing lines`. Steps to Reproduce: ======================= - Install the `stock_picking_batch` module. - Create `multiple deliveries` with several `common products`. - Add these deliveries to a batch transfer and print the batch transfer report. - Observe that product lines are ordered by location and then by picking. Cause of the issue: ======================= The batch transfer report currently sorts move lines by picking in the report `(picking_id.batch_sequence)`. When the same product exists in another picking, This causes lines for the same product to be scattered across the report instead of being grouped together, causing the product to appear in multiple places in the document. After This Commit: ======================= In the report, move line sorting by picking (picking_id.batch_sequence) has been replaced with sorting by product `(product_id.id)`. Move lines are now ordered by product, so similar products are displayed together in the document. This helps operators find products more quickly, reduces scanning effort, and makes the process more reliable. TaskID-5379367 Forward-Port-Of: odoo/odoo#241809
Vendor bills for purchase orders containing kits now allocate the kit cost correctly across its components. This prevents inflated inventory valuation for kit components under average cost and FIFO costing, improving financial accuracy after bills are posted.
Original PR description
**Issue**: Billing a PO containing kit with several components can lead to incorrect valuation of its components **Steps to reproduce**: - Create a kit product (by creating a BOM with 2 components)…
**Issue**: Billing a PO containing kit with several components can lead to incorrect valuation of its components **Steps to reproduce**: - Create a kit product (by creating a BOM with 2 components) with AVCO valuation - Create a PO for 1 unit at unit price 10 - Confirm PO and validate the receipt - Go to the BOM of the kit product and check BOM overview -> The cost of the two components are 5, which is correct - Go to Accounting > Vendors > Bill - Create a new bill by indicating the PO in "Auto-Complete" field and validate - Go back to the BOM of the kit product and check BOM overview -> The cost of the two components are 10, which is correct This also occurs with FIFO valuation **Cause**: While computing the value of the move: https://github.com/odoo/odoo/blob/2e4a4f2d063f9b09263e6c137e1c04358020c668/addons/stock_account/models/stock_move.py#L282 https://github.com/odoo/odoo/blob/2e4a4f2d063f9b09263e6c137e1c04358020c668/addons/stock_account/models/stock_move.py#L313-L314 It checks the value of the Bill: https://github.com/odoo/odoo/blob/2e4a4f2d063f9b09263e6c137e1c04358020c668/addons/stock_account/models/stock_move.py#L357-L358 Which relies directly on the AML price of the kit: https://github.com/odoo/odoo/blob/a2b3a10255dba290ea462b9193ae11c54d8dd5e0/addons/purchase_stock/models/stock_move.py#L170 This ignores the `cost_share` of each BOM component. As a result, each component receives the full kit value instead of its proportional share This means that the value of the move is 10 instead of 10/2=5, which makes the valuation computation wrong: https://github.com/odoo/odoo/blob/2e4a4f2d063f9b09263e6c137e1c04358020c668/addons/stock_account/models/product.py#L393 **Aditionnal note** The computation of the quantity is also incorrect: https://github.com/odoo/odoo/blob/a2b3a10255dba290ea462b9193ae11c54d8dd5e0/addons/purchase_stock/models/stock_move.py#L169 since it assumes the quantity of component of the kit is the same than the quantity of the kit itself, which is not true in the general case. opw-5924940
Filtering records by whether an analytic distribution is set now returns the correct results in Accounting and related purchasing flows. This prevents users from seeing all records or no records when they expected only items with or without analytic distribution information.
Original PR description
**Problem:** When filtering by "Analytic Distribution" in views, using "is set" or "is not set" filters (or searching for False) returns incorrect results. When the filter is 'set' it returns all…
**Problem:** When filtering by "Analytic Distribution" in views, using "is set" or "is not set" filters (or searching for False) returns incorrect results. When the filter is 'set' it returns all records (even the ones without an analytic distribution) and when the filter is 'not set' it returns no records (even the ones without an analytic distribution). **Steps to reproduce:** 1) Go to Accounting > Journal Entries. 2) Apply a filter for Invoice lines > Distribution Analytic Account. 3) Select "is set" or "is not set". 4) Check records. Issue is also reproduceable on Purchase Orders. **Cause:** The `_search_analytic_distribution` method did not correctly handle the case when the value is [False], so it results in an invalid Query. **Solution:** - We need to handle the case when we have False in the value on it's own. opw-5478688 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251816 Forward-Port-Of: odoo/odoo#247777
Point of Sale combo orders now keep the correct total when the same combo item is selected multiple times. This prevents small undercharges, such as a 50.00 combo incorrectly totaling 49.98, improving checkout accuracy and consistency.
Original PR description
**Steps to reproduce:** - Create a combo, set the free and max to 3 - Create the product combo and set it's price to 50 - Go to PoS, order said combo and chose the same product 3 times - The price is…
**Steps to reproduce:** - Create a combo, set the free and max to 3 - Create the product combo and set it's price to 50 - Go to PoS, order said combo and chose the same product 3 times - The price is 49.98 instead of 50 **Problem:** When ordering a combo and taking the same product multiple times, the method to adjust the price does not work as it should. In this case, the method would subtract too much from the total, leading it to be only 49.98 instead of 50. **Why the fix:** This happens because when ordering a combo, each line will get it's price_unit from the combo's price divided by the number of lines. In the case where we have 3 different products, hence 3 different lines, the first two would have a unit_price of 16.67 and the last line will be adjusted as to make it equal to the combo's price, so the last line would be 16.66, making the sum 50. But in the case where there is only one line, the last line is still adjusted, making all the lines 16.66, introducing this error. The solution would be to take the line's qty into account when computing how much we should subtract. Unfortunalty, doing so will, in some cases, introduce a rounding error. If the new unit_price does not round up well (like in this case where it is 16.666668 before rounding and 16.67 after), the rounding will cause a difference between what's shown in the frontend and what's written on the lines in the backend, as the lines are rounded up again before being saved to the backend. The introduced solution is to split the lines, and each have a quantity of 1. With this solution, we can have a different price_unit for each line, which resolves our problem, as the first two lines will have 16.67 and the last one will have 16.66 as price_unit. This is how it was done up until version 18.0, showing every line with a quantity of 1 instead of grouping them. As the grouped lines are now single, some rounding with taxes might differ from what it was before, which is why a test was altered. opw-4931215 Forward-Port-Of: odoo/odoo#221189
This fix keeps manufacturing orders aligned when a bill of materials is changed after the order has already been confirmed. Components that are no longer tied to a specific operation are no longer incorrectly treated as manually consumed, preventing orders from getting stuck at closing.
Original PR description
Steps to reproduce the issue:
- Create a storable product P1 with the following BoM:
- A component consumed in an operation.
- Create a MO to produce one unit of P1 and confirm it.
- Modify the BoM so that the component is no longer consumed in the operation.
- Update the BoM on the MO.
- Start and finish the operation.
Problem:
The MO cannot be closed because the component is not consumed.
The `manual_consumption` field on the stock move is set to True when the move is linked to a BoM line consumed in an operation. However, when the BoM is modified so that the component is no longer consumed in the operation, this field should be updated to False when the MO is updated from the BoM.
https://github.com/odoo/odoo/blob/1305c7262fff762c00159377a9ce1ca09d423625/addons/mrp/models/mrp_production.py#L1193
https://github.com/odoo/odoo/blob/1305c7262fff762c00159377a9ce1ca09d423625/addons/mrp/models/stock_move.py#L611-L612
opw-5993652This fix ensures orders shared between trusted point-of-sale locations always have the right active register assigned before they are displayed. It prevents a crash on the ticket screen, helping staff continue serving customers smoothly when working across trusted PoS setups.
Original PR description
Steps to reproduce: ------------------- 1. Create 2 PoS and make them mutually trusted. 2. From PoS 1, make an order, save it, and go to backend. 3. Open PoS 2, and navigate to ticket screen -> Crash: cannot read property `iface_tax_included` of undefined. Reason: ------- When first loaded, in the `loadServerOrders` method, the "trusted" order coming from PoS 1 has the `config_id` of PoS 1; then in `_loadData`, its `config_id` is set to `undefined` since the config record of PoS 1 is not loaded. Note that we are also explicitly assigning `order.config_id` to the current config in `loadServerOrders` after `callRelated`, but before doing that, we are trying to read from `config_id` in `sendOrderToCustomerDisplay` of `Chrome`, which causes the crash. The fix: -------- In the `setup` of the `Order` model, assign the default (current) `config` to `config_id` if it's undefined. This fix was backported from 6d81f669915408dbd35973fd7a83308134c42547. opw-5946365
This fix prevents checkout failures with payment providers that need customer details, such as an email address, before processing an online POS payment. Cashiers are now guided to select a customer and warned if the customer has no email, reducing failed payments and confusing provider errors.
Original PR description
Currently some providers require a customer to be registered on the order because the email address needs to be sent with the request. We the order does not have a customer the payment cannot be made…
Currently some providers require a customer to be registered on the order because the email address needs to be sent with the request. We the order does not have a customer the payment cannot be made using that provider. Step to reproduce: ------------------ - Set up Amazon payment services on a online pos payment method - Set this method as the online payment method for a self and also set is as payment method of the pos - Place an order in the self or without a customer on the normal pos - Try to pay it > Observation: When the page is redirected to provider's checkout page, an error occurs: Signature mismatch Why the fix: ------------ On a normal pos shop we are simply ensuring that a customer with an address mail is registered on the order if the provider of an online payment method requires customer identification. - When selecting the payment method on the payment screen if the payment method is online, requires customer identification and there's no customer on the order, the validate order button will be unavailable and the customer button is highlighted. - When there is a customer the validate button is highlighted - When validating the order if the customer does not have an email it will not go through and warn the cashier that the customer needs an email. This behavior is similar to the present "Delivery" which, if the cashier disregarded all popups, will not have the validate button available until a cashier is registered. Also if the selected customer doesn't have an address it will show a popup upon validation. We are not doing anything regarding the self order as using presets like "Delivery" is compatible since the information required filled by the customer creates a partner in the db and sets it on the order. This preset ensures we always have a partner. Other preset don't but we don't want to block flows that are currently working. The list of providers requiring customer identification can be extended. opw-5406501
This fix makes Croatian e-invoicing credential errors easier for users to understand and correct. It also improves invoice XML generation when a partner does not have an explicit OIB, reducing failed or incorrect electronic invoice submissions.
Original PR description
- Credentials errors have a separate format in MER, they should now be displayed in a more user-fiendly manner - Correcting XML generation for partners with no explicit OIB provided - Adding tests for both changes task-none --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251308 Forward-Port-Of: odoo/odoo#249448
Calendar events synced with Google or Microsoft now still send SMS reminders from Odoo. Email reminders remain delegated to the external calendar services, avoiding duplicate email notifications while ensuring SMS alerts are not missed.
Original PR description
SMS reminders are not sent for calendar events synced with Google, even though only email reminders should be delegated to Google. Reproduction steps: * Create a calendar event in Odoo with an SMS…
SMS reminders are not sent for calendar events synced with Google, even though only email reminders should be delegated to Google. Reproduction steps: * Create a calendar event in Odoo with an SMS reminder. * Sync the calendar with Google. * Wait for the reminder to trigger. * Observe that no SMS is sent by Odoo. Cause: The event reminder scheduled action groups events by alarm type and calls `_get_events_by_alarm_to_notify`. For Google-synced events, `_get_notify_alert_extra_conditions` blindly excludes any event with a `google_id`, assuming Google will manage all reminders. This exclusion is incorrect for non-email alarms (e.g. SMS), which must still be handled by Odoo. Fix: The alarm type is propagated through the context so Google-specific exclusions only apply to email reminders. This restores SMS notifications while preserving the existing behavior for emails. A context key is used for stability; a proper method argument will be introduced in master. opw-5172958 Forward-Port-Of: odoo/odoo#251742 Forward-Port-Of: odoo/odoo#241026
Employees with flexible work schedules will no longer see regular working days incorrectly grayed out in Gantt views. The calendar now treats flexible employees as available throughout the week, excluding public holidays and approved leave, improving planning accuracy across affected apps.
Original PR description
### Issue: When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible…
### Issue:
When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible calendar should not have any grayed out days other than public holidays.
### Steps to reproduce:
- Create a new work schedule:
- Flexible Hours
- 24 hours per week
- 8 average hours per day
- Create an employee with this work schedule
- Open Planning app
- Only the three first days of the week are not grayed out
### Cause:
With 24 hours per week, the worked time can be done in three days. Odoo considers that the first three days of the given time frame are worked, but the others aren't. This result is returned by `_work_intervals_batch()`. In `_unavailable_intervals_batch()` we then build the unavailabilities by taking the inverse of the work intervals. The only exception was for fully flexible resources (i.e. without a calendar).
### Solution:
The case we need to consider is for flexible resources: they are available anytime, all week long except on public holidays and leaves.
To do this we fix the method `_unavailable_intervals_batch()` which is then called by each module. If the resource is flexible, then we only return the interval of the public holidays overlapping with the time frame.
Works in `appointment`, `hr_holiday_gantt`and `project_enterprise`.
In `planning`, we need to skip the case where nothing is returned in `leaves_mapping` otherwise it will consider the `company_leaves` during weeks with no public holiday or leaves.
In `hr_attendances_gantt`, `_unavailable_intervals_batch()` is not called. So we change the way the unavailabilities were computed to call `_unavailable_intervals_batch()` instead.
opw-4879481
Forward-Port-Of: odoo/odoo#251817
Forward-Port-Of: odoo/odoo#245741This fix prevents chatbot conversations from causing an error when the website editor is open. It makes the chatbot data available in the right parts of the system, so users can continue interacting with the chatbot without interruptions.
Original PR description
Using a chatbot while the website editor is active triggers a traceback. The issue occurs because bus notifications containing `Chatbot` model data are also received by the backend bundle. In the backend bundle, the `Thread` model did not define the `chatbot` field, so the inverse thread relation on the `Chatbot` model could not be resolved, leading to a crash. This commit adds the chatbot field to the core bundle so it is available in all contexts and prevents the traceback. Steps to reproduce: - Goto localhost:8069/@/contactus - Start chatbot - Answer any question -> traceback task-5924295 Forward-Port-Of: odoo/odoo#251775 Forward-Port-Of: odoo/odoo#248216
Users who accidentally close the full mail composer can now choose to reopen it and keep their formatting, instead of losing rich text when content is restored in the smaller composer. This reduces frustration and helps preserve drafted messages as intended.
Original PR description
Before this commit, when using the full composer and accidentally closing it with some content, the composer content was recovered on the basic composer and formatting was lost. This happens because…
Before this commit, when using the full composer and accidentally closing it with some content, the composer content was recovered on the basic composer and formatting was lost. This happens because restore of content only works in the basic composer, and basic composer does not support rich HTML like the full composer. This commit adds a new UX/UI to restore formatting when accidentally leaving the full composer: When some content has been restored from full composer, opening the chatter composer momentarily disables everything but the full composer button, in addition to show a popover suggesting the user to decide to either continue with Full Composer and restore formatting, or restore content in the small composer without the formatting. Most of the time people want to restore formatting from the full composer, but at the same time the full composer can be a frustrating experience that may incite to just continue with the more reliable small composer. This new popover support both use-cases. Task-5910961 <img width="1219" height="175" alt="Screenshot 2026-02-26 at 17 28 06" src="https://github.com/user-attachments/assets/13d8e1ca-4186-445e-8422-a14c31f8570f" />
This fixes an issue where rounded corners and background colors on column cards in mass mailing emails did not match the editor preview after sending. Email layouts using equal-height columns should now render more consistently for recipients.
Original PR description
**Steps to reproduce:** - Go to mass_mailing app - Add Columns block with multiple content size - Increase Round Corners (e.g. 20 px) - In "Vert. Alignment" field > Select the "Stretch to Equal…
**Steps to reproduce:**
- Go to mass_mailing app
- Add Columns block with multiple content size
- Increase Round Corners (e.g. 20 px)
- In "Vert. Alignment" field > Select the "Stretch to Equal Height" option
- Add color background for the columns
- Save the record and send test mail
- Round corners are not applied
- Background color doesn't expand to the bottom of the body
**Issue:**
Default table style used for the inline conversion of
`await toInline($(editableClone), { $iframe: $(iframe), wysiwyg: this.wysiwyg });` in `mass_mailing_html_field`,
has its 'border-collapse' attribute set to 'collapse' by default in `enforceTablesResponsivity`.
This attribute doesn't work with `border-radius` and the resulting display differs from the preview of the editor.
Relevant links:
https://stackoverflow.com/questions/628301/the-border-radius-property-and-border-collapsecollapse-dont-mix-how-can-i-use https://stackoverflow.com/questions/36035461/what-is-the-difference-between-border-collapse-collapse-and-border-spacing-0
**Fix:**
Use `'border-collapse': 'separate'` and `'border-spacing': 0` but this can
introduce border stacking inside the table element where the original collapse
was needed.
Add back the `overflow` inherited by the card attributes to ensure
inside border are visually properly contained inside the border (but not
sure as to why it was removed 4 years ago).
Also set the height of table sub-elements to `100%` to ensure background
property is properly applied on the whole card body.
opw-5218581
Forward-Port-Of: odoo/odoo#242001This update corrects a bug that caused duplicate Dimona activities to be created in the payroll system. Specifically, when updating employee versions or running automated tasks, the system was incorrectly generating multiple activities for the same employee. This fix ensures that only one Dimona activity is created, streamlining payroll processing and preventing data inconsistencies.
Original PR description
This pr restores the previous behaviour of the dimona and part-time activities creation when the cron is ran or when a version or employee is updated. The original bug was: create an instance on…
This pr restores the previous behaviour of the dimona and part-time activities creation when the cron is ran or when a version or employee is updated. The original bug was: create an instance on saas-18.4 with l10n_be_hr_payroll settings > company > my company > update infos > country: Belgium employee > new > payroll > contract > start_date: any date (this should create a first dimona activity) settings > technical > automation > scheduled actions > "HR Employee: Update Current Version" > run manually `_trigger_l10n_be_next_activities` in `hr.version` of `l10n_be_hr_payroll` is duplicating Dimona activities on records that already have one. We check if a dimona activity already exists for a given `hr.employee` before creating the new activity. Same is done for dimona declaration of part times. The activity now redirects to the employee form (instead of the version form) and appears in it. [tasks-5134380](https://www.odoo.com/odoo/project/1251/tasks/5134380) Forward-Port-Of: odoo/enterprise#96423
This update corrects inaccuracies in the XML files used for processing Swedish payments (SEPA). Specifically, it ensures the correct BIC number is used, removes a misleading placeholder value, and allows users to select the appropriate payment version for 'iso_se' even without a SEPA payment method configured. This improves the accuracy and reliability of Swedish payment processing.
Original PR description
We currently have customizations for the iso20022 xml file for payments in Sweden. But those customizations aren't correct. This commit fix multiples issues: 1) In DbtrAgt, we sometimes have bankgiro information. But this node should always contain the BIC number for Swedish payments. 2) The _get_cleaned_bic_code method was replacing the real bic code with a fake value like 'SE:Bankgiro', but this seems to be wrong. None of the SE banks ask for this BIC, so we remove it. 3) The sepa_pain_version field is supposed to tell Odoo which pain version to use. But the problem is this field is computed, and only editable once the user set the SEPA payment method, but for iso_se, we want to let the user choose as well, even if he didn't add SEPA as payment method. This commit change the invisible on the field, so it can be edited as soon as iso_se is in the journal payment methods. task-5427570 Forward-Port-Of: odoo/enterprise#105536
This update resolves a crash occurring when posting expense entries with the Avalara Avatax integration. The change adjusts how Avatax handles expense move types, specifically addressing a 'KeyError' related to 'in_receipt'. This ensures smoother expense processing for US-based employees using Avatax.
Original PR description
Currently, the expenses flow with Avatax integration crashes when posting the expense entry. Steps to reproduce: - Have an employee with an address in the US. - Enable 'Detect Automatically' in the Avalara fiscal position. - Create an expense for the employee, paid by Employee. - Submit > Post Journal entry > Post Expense. Action will be blocked by a traceback reporting error `KeyError: 'in_receipt'` Analysis: After [1] expense journal entries are now 'in_receipt'. The dictionary in account_avatax does not take into account this move type. This provides a fallback to 'Any' for any other move types [1] https://github.com/odoo/odoo/commit/f835ac0c8adb49d04bed746fd624b8976cc32991 opw-5872768
This update fixes an issue where flexible calendar employees were incorrectly displaying unavailable days in planning and related modules. The change ensures that only public holidays and leaves are reflected as unavailable, providing a more accurate representation of employee availability. This improves the planning process for teams using flexible work schedules.
Original PR description
### Issue: When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible…
### Issue:
When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible calendar should not have any grayed out days other than public holidays.
### Steps to reproduce:
- Create a new work schedule:
- Flexible Hours
- 24 hours per week
- 8 average hours per day
- Create an employee with this work schedule
- Open Planning app
- Only the three first days of the week are not grayed out
### Cause:
With 24 hours per week, the worked time can be done in three days. Odoo considers that the first three days of the given time frame are worked, but the others aren't. This result is returned by `_work_intervals_batch()`. In `_unavailable_intervals_batch()` we then build the unavailabilities by taking the inverse of the work intervals. The only exception was for fully flexible resources (i.e. without a calendar).
### Solution:
The case we need to consider is for flexible resources: they are available anytime, all week long except on public holidays and leaves.
To do this we fix the method `_unavailable_intervals_batch()` which is then called by each module. If the resource is flexible, then we only return the interval of the public holidays overlapping with the time frame.
Works in `appointment`, `hr_holiday_gantt`and `project_enterprise`.
In `planning`, we need to skip the case where nothing is returned in `leaves_mapping` otherwise it will consider the `company_leaves` during weeks with no public holiday or leaves.
In `hr_attendances_gantt`, `_unavailable_intervals_batch()` is not called. So we change the way the unavailabilities were computed to call `_unavailable_intervals_batch()` instead.
Forward-Port-Of: odoo/enterprise#109422
Forward-Port-Of: odoo/enterprise#105521A recent update caused a disruption in our SEPA direct debit payment processing. Customers were unable to complete payments using this method due to a technical error. This fix resolves the issue, restoring reliable SEPA direct debit functionality.
Original PR description
Issue: --- The SEPA direct debit is broken. Steps to reproduce: --- 1- Enable SEPA direct debit in payment providers. 2- Add something to cart and try paying using SEPA direct debit. You get the error: `payment.provider object has no attribute company.` Cause: --- This is introduced after #250326. opw-5993720 Forward-Port-Of: odoo/enterprise#109672
This update resolves an issue where by-products tracked by serial numbers were incorrectly showing extra lines in the shop floor manufacturing order view. The change ensures that by-products only display lines that have been manually added, aligning with the intended workflow. This improves the clarity and accuracy of shop floor data.
Original PR description
When the "pre fill lot/serial numbers in shopfloor" setting is enabled on the manufacturing operation type, by-products tracked by serial number were incorrectly showing extra empty lines in…
When the "pre fill lot/serial numbers in shopfloor" setting is enabled on the manufacturing operation type, by-products tracked by serial number were incorrectly showing extra empty lines in shopfloor MO cards (both in overview and work center views). Steps to reproduce: 1. Create a bill of materials for a final product 2. Add a consumable component 3. Create an operation without steps 4. Add a by-product tracked by serial number 5. Specify that the by-product is produced in the operation above 6. In Inventory > Configuration > Operations Types, open the Manufacturing operation type, go to the Traceability section and enable "Pre fill lot/serial numbers in shop floor moves" 7. Create a manufacturing order for the BOM and confirm it 8. Open the Shop Floor view from the MO 9. Observe the extra line for the by-product in both overview and work center views Root cause: The visibleMoveLines getter in stock_move.js was showing ALL move lines (including unpicked ones) when picking_type_prefill_shop_floor_lots was enabled, without distinguishing between raw materials/components and by-products. By-products should never show pre-filled lines since users must register them manually by clicking the + button. Solution: Modified the visibleMoveLines getter to always filter by-products to show only picked move lines, regardless of the prefill_shop_floor_lots setting. This ensures by-products only display lines that have been explicitly registered by the user, while regular components continue to show pre-filled lines when the setting is enabled. Task-5431295 Forward-Port-Of: odoo/enterprise#109574 Forward-Port-Of: odoo/enterprise#103260