Saturday, September 12, 2026
36 changes · master
Resolved issues and error corrections
The attendance Gantt test setup now limits its data to the company created for the test. This prevents unrelated demo company records from affecting results, making quality checks more stable without changing business features.
Original PR description
Some tests in `hr_attendance_gantt` could include employees from other companies, making their expected employee counts depend on unrelated demo data. This commit adds the test company to the common domain so the gantt data only includes employees created for the test case. [error-945955](https://runbot.odoo.com/odoo/error/945955) Forward-Port-Of: odoo/enterprise#128108
The invoice form now hides Ecuador reimbursement details from users who do not have accounting access. This prevents access errors when non-accounting users open invoices, improving reliability without changing accounting workflows.
Original PR description
The reimbursement lines are added to the invoice form without any group restriction, while their model can only be accessed by accounting users. As a result, opening an invoice form as a user without accounting rights can raise an AccessError when the form view tries to retrieve the reimbursement subview. This commit restricts the reimbursement page to the groups allowed to access reimbursement lines. [error-946579](https://runbot.odoo.com/odoo/error/946579) Forward-Port-Of: odoo/enterprise#129981
Card payments no longer fail when a previous expense created from the same card is missing a date. Undated expenses are now only included in all-time checks, helping employees continue using their cards while keeping spending limits accurate.
Original PR description
Fix a traceback preventing card users to make any payment with their card if at least one expense created by said card has no date Steps to reproduce: - Install hr_expense_stripe_demo (to access the test wizards) - Setup the stripe (demo) account with a valid card and funds - Create one transaction with the card - Remove the date of the generated expense -> Any further transaction with that card will fail After this commit: An expense with no date is considered only in the 'all time' Ticket [link](https://www.odoo.com/odoo/project.task/6326124) opw-6326124 Forward-Port-Of: odoo/enterprise#130337
Website forms now ignore fields without a name when saving page settings. This prevents confusing repeated error popups caused by invalid form markup while keeping normal form saves working as expected.
Original PR description
On save, the form option collects the `name` of every non-custom form input on the page and sends the list to `formbuilder_whitelist`. An input with an empty name (hand-edited or generated markup) yields '', which the server rejects with a ValueError since it matches no field of the model. As the whitelist RPC is fired without being awaited, the save itself succeeds and the broken field persists in the page, so every subsequent save of that page then raises the same unexplained RPC error dialog, forever. Skip nameless inputs: a field that doesn't post anything has nothing to whitelist. task-6251785
The Contracts page under Employee Records no longer offers a Kanban view option that was not actually available. This prevents users from selecting a view that would not work and keeps the page choices clearer.
Original PR description
We don't have a Kanban view for contracts, but we still allow users to select that view type. After discussion with the team, we've deemed that view unnecessary. Instead of implementing the Kanban view, we'll just remove that option from the "Employee Records" (Contracts) page. opw-6475797 Forward-Port-Of: odoo/odoo#284829
German point-of-sale sessions using Fiskaly can now close successfully when an order customer is an address contact without its own name. The system uses the displayed contact name as a fallback for required compliance export data, preventing session-closing crashes.
Original PR description
Steps to reproduce: - German PoS with Fiskaly TSS configured - Set a customer that is an address contact (type invoice/delivery/other) on an order; such a contact has no name of its own, it is…
Steps to reproduce: - German PoS with Fiskaly TSS configured - Set a customer that is an address contact (type invoice/delivery/other) on an order; such a contact has no name of its own, it is displayed with its parent's - Close the session Issue: Closing crashes with "TypeError: 'bool' object is not subscriptable" and the session cannot be closed at all. Cause: _get_dsfinvk_cash_point_closing_data builds the DSFinV-K buyer block from partner.name, which is only guarded by "if partner := o.partner_id". res.partner.name is not required: the res_partner_check_name constraint only enforces it for type='contact', so an address contact stores NULL there and partner.name reads as False, which cannot be sliced. Fix: Fall back on complete_name - what the UI displays for those contacts, "Parent Company, Delivery" - and on a literal when even that is empty, since the buyer name is mandatory in the export. Reading name first leaves the exported value untouched for every partner that has one. opw-6518336 Forward-Port-Of: odoo/enterprise#131212 Forward-Port-Of: odoo/enterprise#129709
Odoo now processes official Flow 10 response messages for French PDP reporting instead of only storing them as files. Rejected reports are marked correctly, users can see the rejection details, and corrected reports can be resent with a new transmission reference.
Original PR description
Flow 10 PPF responses were stored as attachments without being processed. Consequently, rejected reports remained marked as sent, the rejection reason was not shown to users, and corrected reports could not be submitted again. Process the PPF response codes, update the flow state, and log the returned details in the chatter. Keep response attachments separate from the outgoing payload and allow rejected reports to be manually resent with their original moves and a new transmission identifier. no task id Forward-Port-Of: odoo/odoo#287737 Forward-Port-Of: odoo/odoo#287338
The Timesheets Assistant sample data generator now selects regular project tasks instead of template tasks. This ensures generated sample activities can be linked to tasks correctly, making demo or onboarding data more useful and accurate.
Original PR description
The Timesheets Assistant sample data generator searches project.task with `is_template != False`, so it collects template tasks instead of regular ones and the generated activity never links to a task. Task-6566451 Forward-Port-Of: odoo/enterprise#131248
Updated the point of sale and stock-related test coverage so product loading limits are checked consistently when stock features are installed. This reduces false test failures and helps keep checkout product loading behavior reliable across module combinations.
Original PR description
## Context: When all references to stock functionality were extracted from point_of_sale in this PR: #241368, we decoupled the query ordering logic from the rest of our product.template data-fetching…
## Context: When all references to stock functionality were extracted from point_of_sale in this PR: #241368, we decoupled the query ordering logic from the rest of our product.template data-fetching code: https://github.com/odoo/odoo/blob/1170bafbd7d9461d13ba1d6020d6f8487660763c/addons/point_of_sale/models/product_template.py#L190 This allowed us to completely override (not extend) the ordering of the loaded products in our new pos_stock module: https://github.com/odoo/odoo/blob/1170bafbd7d9461d13ba1d6020d6f8487660763c/addons/pos_stock/models/product_template.py#L42-L65 Notice the difference in point_of_sale: https://github.com/odoo/odoo/blob/1170bafbd7d9461d13ba1d6020d6f8487660763c/addons/point_of_sale/models/product_template.py#L403-L416 This was causing problems with our existing test for this feature in point_of_sale because we were explicitly examining the ordering of the products; obviously this ordering would be different when pos_stock is installed alongside point_of_sale. Thus, we must decouple our original test for this feature so that ordering can be examined independently in each module's tests. ## Now: We have one test in point_of_sale that just makes sure our limited products loading feature actually caps the number of products loaded. This test will work correctly whether or not pos_stock is installed. In addition, we have one more test in point_of_sale and pos_stock that explicitly examines the ordering of the products in these limiting conditions when both modules are installed. The point_of_sale test will be skipped when pos_stock is installed because the latter module defines conflicting ordering. runbot-243064 Forward-Port-Of: odoo/odoo#283621
This fix prevents scheduled Chilean electronic invoicing status checks from failing when the tax authority returns an empty response. It helps keep automated invoice processing running reliably without manual intervention.
Original PR description
When checking the status of a DTE, sometimes the response will have no `text`. This causes a traceback error that halts execution of the cron `cron_run_sii_workflow`. opw-6322106 Forward-Port-Of: odoo/enterprise#130873 Forward-Port-Of: odoo/enterprise#129582
This fixes SEPA credit transfer export files so they no longer include an address field that some European banks reject. Businesses using Austrian, German, or similarly strict banks should be able to submit batch payment files successfully again.
Original PR description
### Issue before this commit: Generating a SEPA Credit Transfer XML for certain European banks (e.g., Austrian and German banks) fails because the generated XML contains an unexpected `<CtrySubDvsn>`…
### Issue before this commit: Generating a SEPA Credit Transfer XML for certain European banks (e.g., Austrian and German banks) fails because the generated XML contains an unexpected `<CtrySubDvsn>` tag inside the `<PstlAdr>` node, leading to the rejection of the batch payment file. ### Steps to reproduce the issue: 1. Download Accounting and l10n_at 2. Go to settings and activate SEPA Credit Transfer / ISO20022 3. Go to Journals > Bank > set an account number 4. Create an austrian contact (ex. FK Austria Wien AG) and set in the invoicing tab a bank (ex. AT526000071856851733) and set it trusted 5. Go to Bills, create a new one with the contact created and confirm it 6. Then click 'PAY' and select SEPA Credit Transfer 7. Go to Vendors > Batch Payments 8. Create a new one with: 1. Bank as bank 2. SEPA Credit Transfer as Payment Method 3. Add the bill just created 9. Validate and download the XML 10. See that a wrong tag <CtrySubDvsn> is added. This makes some banks refuse it ### Cause of the issue: External commit 30b023d394a5e4de64873188aa1d5961fecccb10 introduced the `<CtrySubDvsn>` tag to support US and CA requirements. However, the change was incorrectly applied to the common `account_iso20022` file, making it leak into standard European SEPA exports where the tag is not compliant with certain strict banking validation rules. ### Reason to introduce the fix: Revert the generic addition of the `<CtrySubDvsn>` tag in the common ISO20022 XML generation and restrict it only to the specific localizations (US/CA) that require it. This brings the `<PstlAdr>` node back to compliance, allowing Austrian, German, and other European banks to successfully process the files. opw-6523035 Forward-Port-Of: odoo/enterprise#131156 Forward-Port-Of: odoo/enterprise#131090
Image fields now apply an Android camera compatibility workaround only for Chromium-based Android browsers that need it. This prevents other browsers and the Odoo mobile app from showing unnecessary or confusing file picker options while preserving camera access where it was missing.
Original PR description
Since Android 14, Chromium sends a file input accepting only images straight to the photo picker, which has no "Camera" entry. The image fields work around it by appending `dummy/allowAndroidCamera`…
Since Android 14, Chromium sends a file input accepting only images straight to the photo picker, which has no "Camera" entry. The image fields work around it by appending `dummy/allowAndroidCamera` to their accept attribute: a mimetype which is not an image is enough to get the generic chooser, and its camera, back. https://issues.chromium.org/issues/40937303 That invalid mimetype was appended for everyone, while only the browsers based on Chromium on Android need it: - the issue is an Android one, the desktop file dialogs are not concerned - the native app builds its own file chooser out of the accept attribute, and the invalid mimetype makes it offer the document picker on a field which only accepts images - Firefox and Safari are not based on Chromium and are not affected The workaround is now limited to the browsers needing it, and the expression moved from the template to a getter, since it is no longer a simple concatenation. Code made by Claude Supervised by RFR --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287923 Forward-Port-Of: odoo/odoo#285643
Payslips now only include public holidays for the employee version's own company, even when multiple companies are selected. This prevents holidays from one country or company appearing incorrectly in another company's payroll calculations.
Original PR description
Issue: - Create a public holiday in France, and generate a payslip in Belgium, with both companies selected. - French public holidays will appear in the belgian worked day lines. Fix: replace `self.env.companies.ids` -which returns all selected companies- in `_get_leave_domain` with `self.company_id.ids` to match the company of the current version in the payslip. task-id: 6425963 Forward-Port-Of: odoo/odoo#287638
Fixed an issue where saving a message after opening edit mode could incorrectly mark it as edited, even when no content was changed. This keeps chatter message history more accurate and avoids confusion for users reviewing communication records.
Original PR description
Steps to reproduce: ------------------------------------- 1. Open the chatter of any record 2. Open the full composer for the Log Note 3. Add some text and paste some images > Post the log note 4.…
Steps to reproduce: ------------------------------------- 1. Open the chatter of any record 2. Open the full composer for the Log Note 3. Add some text and paste some images > Post the log note 4. Click on the Edit option 5. Save the message without editing anything Observation: ------------------------------------- You will notice that the (edited) label appears even though the message wasn't edited at all, only the edit mode was made active. Issue: ------------------------------------- When a message is posted via the mail composer, the email conversion pipeline injects MSO conditional comments like `<!--<![endif]-->` and `<!--[if mso]>...<![endif]-->` into the HTML body. These comments are added by the `_hideForOutlook` and `createMso` https://github.com/odoo/odoo/blob/083e091eaa7d983f6c826c02b0d0652a821227fb/addons/mail/static/src/views/web/fields/html_mail_field/convert_inline.js#L1978-L1988 https://github.com/odoo/odoo/blob/083e091eaa7d983f6c826c02b0d0652a821227fb/addons/mail/static/src/views/web/fields/html_mail_field/convert_inline.js#L1699-L1707 functions to ensure Outlook compatibility, they wrap responsive elements so that Outlook receives simplified table-based fallbacks while modern clients see the original layout. The stored message body on the server retains these comments. When a user clicks "Edit" on such a message, the body is loaded into the OdooEditor. The browser's DOM parser treats `<!--<![endif]-->` as standard HTML comment nodes, which are not preserved in `innerHTML` serialization. So the editor returns the body without these comments, even if the user made no changes. The `edit()` method in then compares `updatedBodyEl.innerHTML` (from editor, no comments) against `messageBodyEl.innerHTML` (from server, has comments), finds a difference, and sends a update to the backend, which stamps the message with the (edited) label. Solution: ------------------------------------- Before comparing innerHTML, strip all HTML comment nodes from both the original and updated body elements. This is done on throwaway DOM elements created solely for comparison. The actual body sent to the server (`body` parameter) is never modified. Note: ------------------------------------- An alternative approach would be to strip comments at the string level using a regex (`html.replace(/<!--[\s\S]*?-->/g, '')`) before creating the DOM elements. This is valid since HTML comment syntax `(<!--...-->)` is strictly defined and no nesting is allowed, so the regex is reliable. This commit also preserve images while trimming empty message boundaries. Newer test covers this issue. opw-6328529 Forward-Port-Of: odoo/odoo#287502 Forward-Port-Of: odoo/odoo#274927
User role changes now correctly update the related access groups, even when the role is not tied to a specific functional access. This prevents mismatches between what administrators see in the user form and the permissions actually applied after saving or reloading.
Original PR description
It is a functional request to add him to the groups even if he is not involved by a functional access. [FIX] base: prevent group desync in user onchange When editing a user in the web client, the…
It is a functional request to add him to the groups even if he is not involved by a functional access. [FIX] base: prevent group desync in user onchange When editing a user in the web client, the onchange mechanism creates a virtual record using `new(values, origin=record)` to build the baseline snapshot used for field diff tracking. In `res.users.new()`, logic automatically adjusts `group_ids` (adding or removing `base.group_multi_company` depending on the number of companies on the user) as a side effect. When `new()` was called with an `origin`, this side effect corrupted the reference snapshot. Consequently, the onchange return value failed to detect or report the real delta to the web client, leaving the UI in an incorrect or desynchronized state (e.g. `role` radio buttons or access right checkboxes out of sync with actual groups). Fix this by skipping the automatic group adjustment in `new()` when `origin` is present, keeping the reference snapshot clean. Add tour tests to ensure `role` and group checkboxes stay synchronized across saves and page reloads in the web client.
This fixes a display issue where mega menu content could touch the edge of the mobile website preview. Mobile menus now keep the expected spacing, making navigation look cleaner and easier to read.
Original PR description
Steps to reproduce: - Open a website in mobile preview. - Add a mega menu and select the "Odoo Menu" template. - Open the mega menu. => Its content touches the left edge of the mobile panel. Before this commit, the mega menu rework [1] removed the horizontal padding override required by nested `.container` elements. After this commit, mega menu containers keep the expected grid gutter on mobile. [1]: https://github.com/odoo/odoo/commit/ff5423bc3aa75e47b210ce98f3efba8c75459a5a
Website theme previews now adjust text and icon colors when users choose darker color palettes. This prevents hard-to-read elements in the configurator, making theme selection clearer and more reliable.
Original PR description
Steps to reproduce: - Open the website configurator. - Select a dark color palette. - Preview the "Eclipse" theme. => The shaped icons in the Features section are hard to see. Before this commit, static theme previews kept the text colors compiled for their original palette when `bg-o-color-X` backgrounds changed. This could result in dark text on a dark background. After this commit, configurator previews recompute the text color for each palette background and keep shaped icons readable. task-6485048
This change fixes how the mail app tracks whether a conversation is currently in focus when it is open in more than one view. It prevents one view losing focus from incorrectly marking the whole conversation as unfocused while another view is still active.
Original PR description
Before this commit, the Thread component writes isFocusedByThread on the record it displays and the record turns that flag into isFocusedCounter. The problem is that two views of the same thread share the one flag, so the first to lose the focus clears it while the other still has it. This commit keeps the focus in the component and lets each view hold its own share of the counter, so a thread is focused as long as one of its views is.
The quotation document form now clearly shows that an attachment must be selected before saving. This prevents confusion when creating quote documents by highlighting the required step directly on the attachment field.
Original PR description
When trying to save an empty quotation document from the form view, the save is blocked because the `name` field is required. However, `name` is readonly when no attachment has been selected. As a result, the form doesn't display the required-field decoration on that field, which is confusing. The attachment field should be marked as required in the view instead. This makes it clear that an attachment must be selected first, after which the `name` field becomes available and can be filled in. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287400
Fixed an issue where reusing the calendar multi-create popover could incorrectly limit available Time Type options after creating and deleting working-time entries. Users can now continue adding schedule entries without needing to refresh the page to restore the full list of allowed choices.
Original PR description
Issue: The calendar multi-create popover retains its form values so they can be reused when adding entries to another selection. In a variable working schedule, this retained state incorrectly…
Issue: The calendar multi-create popover retains its form values so they can be reused when adding entries to another selection. In a variable working schedule, this retained state incorrectly restricted Time Type to the first allowed value after mass creating entries and deleting one occurrence. Refreshing the page restored all Time Type options because the form was then rebuilt from the complete backend value of `allowed_work_entry_type_ids`. Steps to reproduce: - Open a working schedule and switch it from Fixed to Variable. - Select multiple days and mass add working-time entries. - Select one of the created days and delete its entry. - Select that day again and open the Add popover. - Open Time Type and observe that only the first allowed type is available. - Refresh the page and observe that all allowed types are available again. Cause: `work_entry_type_id` is filtered by the computed `allowed_work_entry_type_ids` relation. The relational model keeps every relation ID in `StaticList.currentIds`, but only materializes the loaded page in `StaticList.records`. Since this invisible domain dependency has no related display fields, its loaded page is limited to one record. When the multi-create popover was submitted or closed, https://github.com/odoo-dev/odoo/blob/23266b3a3bf0856dc147e3780e5ac54469bbcc53/addons/web/static/src/views/view_components/multi_selection_buttons.js#L169-L180 serialized x2many values from `StaticList.records`. This reduced `allowed_work_entry_type_ids` to its first loaded ID in the retained `multiCreateValues`. Reopening the popover reused that incomplete relation, so the Time Type domain correctly evaluated against only one ID. Solution: Serialize x2many values from `StaticList.currentIds` so every related ID is preserved. For loaded records, merge the cached record data to retain edited or display values, for unloaded records, retain an ID-only value. This keeps the complete domain dependency across calendar multi-create popovers without changing the backend Time Type computation. opw-6398706 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#280391
Employee availability is now shown consistently across Time Off and Attendance, including days outside contracts and flexible schedules. This prevents misleading calendar views by greying out unavailable periods and improves reliability for workforce planning.
Original PR description
purpose: 1- We should have a consistent way to compute `_gantt_unavailability` of employees in time off and attendance. Currently, some cases have inconsistent behavior such as out of contract days,…
purpose:
1- We should have a consistent way to compute `_gantt_unavailability` of employees in time off and attendance. Currently, some cases have inconsistent behavior such as out of contract days, flexible and fully flexibe employees. 2- In time off calendar view, if the employee does not have a contract at all, the current working schedule will appear in the calendar and it will not be greyed out. This is inconsistent with the behavior of the attendance application.
Fix:
1:
- implemented `_get_employee_unavailable_intervals` in employee model to be used in both time off and attendance.
- more optimized than the old implementation in time off as it calls `_work_intervals_batch` once per calendar instead of calling it for each contract in `_unavailable_intervals_batch`
- greys out "out of contract" periods
- for flexible and fully flexible employees, the whole period is considered available except leave periods
- for duration based calendars, morning and afternoon map to 12 hours of availability and full day maps to 24 hours of availability
- made `_get_calendar_periods` use version date start instead of contract date start and corrected a bug in tz conversion 2:
- made `_get_unusual_days` return True for all the days outside of contracts for the employee instead of not returning anything for them or getting values from the working schedule of the employee (means that they will be greyed out in the callendar view) and added a test for it
task-id: 5473055
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#287019
Forward-Port-Of: odoo/odoo#258604This fixes a problem where the HTML editor could stay stuck with outdated content after a newer save happened elsewhere. The editor now uses the latest version stored on the record, helping users see the correct server-saved document and avoid stale edits.
Original PR description
Before this commit, an editor recovering from a stale document could stop on this error and keep the stale content:
```
Error: Concurency detected while recovering from a stale document. The
last history id of the server is different from the history id received
by the html_field_write event.
at CollaborationOdooPlugin.resetFromServerAndResyncWithPeers
```
This happens because the recovery compares the history id of the record with the one the html_field_write event carried. A write keeps only the last step id in the field, so an event handled after a later write names an id the record no longer holds. As a result, the recovery stops there and the document stays stale.
This commit fixes the issue by taking the history id read from the record as the new server reference, so the editor converges on the document the server holds.
https://runbot.odoo.com/odoo/error/944595
Forward-Port-Of: odoo/odoo#287523
Forward-Port-Of: odoo/odoo#287408This fix ensures automatic period-change entries are properly balanced and reconciled. It prevents leftover accounting lines from cluttering records and helps keep financial data accurate.
Original PR description
The previous code wasn't reconciling the destination and accrual moves, leaving potentially non-neutral journal items and their counterpart polluting the DB. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287524 Forward-Port-Of: odoo/odoo#279766
The certificate setup screen no longer shows an error banner simply because no password was entered for a key file. Users will only see the warning when they provided a password and it is incorrect, reducing confusion during certificate configuration.
Original PR description
When adding a key file without entering a password, an error banner is immediately displayed, incorrectly suggesting that the password may be invalid. Only show the error banner when a password was provided and is incorrect. Also refactored the compute function to avoid repeated try-except blocks. task-6299175 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286307 Forward-Port-Of: odoo/odoo#283589
This update corrects a small configuration screen issue in Belgian payroll settings caused by improperly closed fields. It helps ensure the settings page loads and displays as intended for users managing payroll configuration.
Original PR description
Found some fields that has closed bracket too soon in payroll_config_settings_views.xml. This PR expected to remove too son '/>' closures. task-6522569
Payslip summary cards now keep wage and worked-days values inside their borders on smaller screens or when amounts are long. This improves readability and avoids broken layouts for payroll users reviewing payslips.
Original PR description
The worked days/wage stat cards on the payslip form used flex-basis-*/bg-100 utility classes but no min-width guard, so the monetary fields (basic_wage, net_wage, sum_worked_days) could overflow past the card's border on narrower screens or with large amounts. Add min-w-0 on the cards so they can shrink within their flex row, and text-break on the big-number fields so long values wrap inside the card instead of spilling out of it. Forward-Port-Of: odoo/enterprise#131031
This fix stops the system from creating exchange difference entries when users reconcile journal items on accounts where reconciliation is not allowed. It ensures accounting records stay cleaner and avoids unexpected extra entries in this specific workflow.
Original PR description
Repro steps: 1) Create two misc entries with different foreign currency amount and different company currency amounts, on an account with "Allow Reconciliation" disabled (one debit, one credit). 2) Go to Journal Items, select both lines and click Reconcile. Issue: An exchange difference entry is generated. Fix: Move the control of the exchange difference moves creation to the account.reconcile.wizard instead of controling it inside action_reconcile of account.move Related PRs: https://github.com/odoo/enterprise/pull/130541 https://github.com/odoo/enterprise/pull/108362 Forward-Port-Of: odoo/enterprise#131145
Employee availability is now shown consistently across Attendance and Time Off planning views. Days outside an employee contract are clearly greyed out, while flexible schedules and leave periods are handled more accurately, helping managers plan with fewer misleading calendar gaps.
Original PR description
purpose: 1- We should have a consistent way to compute `_gantt_unavailability` of employees in time off and attendance. Currently, some cases have inconsistent behavior such as out of contract days,…
purpose:
1- We should have a consistent way to compute `_gantt_unavailability` of employees in time off and attendance. Currently, some cases have inconsistent behavior such as out of contract days, flexible and fully flexibe employees. 2- In time off calendar view, if the employee does not have a contract at all, the current working schedule will appear in the calendar and it will not be greyed out. This is inconsistent with the behavior of the attendance application.
Fix:
1:
- implemented `_get_employee_unavailable_intervals` in employee model to be used in both time off and attendance.
- more optimized than the old implementation in time off as it calls `_work_intervals_batch` once per calendar instead of calling it for each contract in `_unavailable_intervals_batch`
- greys out "out of contract" periods
- for flexible and fully flexible employees, the whole period is considered available except leave periods
- for duration based calendars, morning and afternoon map to 12 hours of availability and full day maps to 24 hours of availability
- made `_get_calendar_periods` use version date start instead of contract date start and corrected a bug in tz conversion 2:
- made `_get_unusual_days` return True for all the days outside of contracts for the employee instead of not returning anything for them or getting values from the working schedule of the employee (means that they will be greyed out in the callendar view) and added a test for it
task-id: 5473055
Forward-Port-Of: odoo/enterprise#130714
Forward-Port-Of: odoo/enterprise#113498This fix prevents Saudi electronic invoices from being reset to draft while they are being submitted to ZATCA. It helps avoid accidental duplicate submissions in production, reducing the risk of taxpayer compliance issues while still allowing test workflows in sandbox and simulation modes.
Original PR description
Bulk sending is queued: the batch wizard stamps sending_data on the moves and lets the send cron do the work. Before this commit: Reset to Draft stayed available while the moves were being sent, so…
Bulk sending is queued: the batch wizard stamps sending_data on the moves and lets the send cron do the work. Before this commit: Reset to Draft stayed available while the moves were being sent, so the user could reset an invoice mid-submission. The invoice then ended up draft with an accepted submission and could be sent to ZATCA a second time, which ZATCA treats as a taxpayer compliance issue. After this commit: The records are locked on both sides, the way l10n_jo_edi does. Reading the state instead would not help, as a transaction only sees the snapshot taken when it started, in which the move is still posted. 1. When submitting, the moves that cannot be locked are skipped, as another transaction is already working on them. 2. When resetting to draft, the reset is refused if the records cannot be locked, otherwise it applies once the submission it races with committed. Reset to Draft stays available for invoices accepted in Sandbox and Simulation, as deleting or resubmitting test invoices is the point of those modes. Production remains covered by the l10n_sa_edi_is_production check. Steps to reproduce: 1. Install l10n_sa_edi and onboard a sales journal in Sandbox mode. 2. Create and post two invoices. 3. Select them, Action > Send & Print. 4. Select them again, Action > Reset to Draft. task-6267293 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284107
Colombian child contacts linked to a company with a NIT are no longer incorrectly treated as separate companies. This restores the expected company-and-contact display and makes those contacts show up when users search by the parent company name.
Original PR description
Issue: Colombian child contacts linked to a NIT company are displayed with their standalone name instead of "Company, Contact". Searching Contacts by the company name consequently returns the company…
Issue: Colombian child contacts linked to a NIT company are displayed with their standalone name instead of "Company, Contact". Searching Contacts by the company name consequently returns the company but not its child contacts. Steps to reproduce: - Create a Colombian company with NIT - Add a child contact or address to that company - Filter Contacts by the company name - Observe that the child is displayed separately and is not returned Cause: The Colombian `is_company` computation classifies every partner with a Colombian NIT and qualifying obligations as a company: https://github.com/odoo/enterprise/blob/911686a31d5d3c1539d0dff7d16edf1ce9b101ca/l10n_co_edi/models/res_partner.py#L43-L53 Those fiscal values are commercial fields and are propagated to child contacts. Without checking that the partner is its own commercial entity, children are therefore classified as companies, preventing the standard display name logic from prefixing their parent name. Solution: We need to restrict the Colombian company classification to partners that are their own commercial partner. This preserves the NIT and obligation rules for actual companies while keeping their inherited child records as contacts, restoring both the combined display name and parent name search behavior. opw-6470958 Forward-Port-Of: odoo/enterprise#130373 Forward-Port-Of: odoo/enterprise#128986
This update fixes a failing automated test in the Expense Stripe module after related platform changes. It helps keep quality checks reliable so future updates can be delivered with confidence.
Original PR description
After the changes made in the community PR, a test failed. task-6299175
This fixes internal typing issues in the web and messaging code so translation text and date/time values are handled more consistently. The change helps developers catch mistakes earlier, reducing the risk of small translation or scheduling-related defects reaching users.
Original PR description
See individual commits for details.
This fixes an issue where some product variant images could be treated as general product images during installation or upgrades. Online stores will show and organize variant-specific images more accurately, reducing confusion for shoppers and staff.
Original PR description
Issue: when installing or upgrading `website_sale` (version 20.0), some variant images were incorrectly interpreted as template images. Fix: before interpreting an image as a template image, check whether it's used in one or more variants, and if so, interpret the image as a variant image instead (and assign in to the union of the variants' PTAVs). This PR also fixes a few cosmetic issues.
Opening or refreshing a live chat avatar now avoids changing the underlying chat member history. This prevents unnecessary system notifications and helps keep live chat behavior stable for users.
Original PR description
Before this commit, the avatar of a livechat is picked by sorting livechat_channel_member_history_ids, which sorts the relation itself: a read of the avatar reorders the records stored on the channel and notifies everything that reads them. This commit sorts a copy.
Live chat conversations with public visitors now show the visitor conversation avatar in the Discuss header instead of a generic thread icon. This makes live chat threads easier to recognize and improves consistency in the customer support interface.
Original PR description
Before this commit, the Discuss content header showed the thread icon instead of the avatar for a livechat held with a public visitor. This was because `showThreadAvatar` relied on `hasCorrespondentAvatar`, i.e. on a correspondent with an uploaded photo to display. A public visitor is a guest with no uploaded image, so it was false. The header now shows the avatar of any thread backed by a channel. Related Enterprise PR: https://github.com/odoo/enterprise/pull/130678 Task-[6526300](https://www.odoo.com/odoo/project/1519/tasks/6526300) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Live chat conversations with public visitors now show the visitor conversation avatar in the Discuss header instead of a generic thread icon. This makes WhatsApp-related chat views clearer and more consistent for support teams handling visitor conversations.
Original PR description
Before this commit, the Discuss content header showed the thread icon instead of the avatar for a livechat held with a public visitor. This was because `showThreadAvatar` relied on `hasCorrespondentAvatar`, i.e. on a correspondent with an uploaded photo to display. A public visitor is a guest with no uploaded image, so it was false. The header now shows the avatar of any thread backed by a channel. Related Community PR: https://github.com/odoo/odoo/pull/286960 Task-[6526300](https://www.odoo.com/odoo/project/1519/tasks/6526300)