Daily updates from Odoo
Saturday, July 18, 2026
41 changes · master
Enhancements to existing features
The website builder now avoids repeated database checks when showing imported footer options. This makes the footer customization flow more efficient without changing what users see or how they work.
Original PR description
The imported footer template provider queried the database every time the footer options was used. This commit caches the lookup so it only runs once, and check existence with a `search` limit=1 rather than a `searchCount`. task-6018501
Users are now alerted when a hidden optional column contains invalid data. The optional column menu and affected item are highlighted in a warning color, helping users find and fix issues that are not currently visible.
Original PR description
*: account_reports,web_studio When a hidden optional column contains invalid data, the optional columns toggle button and the corresponding dropdown item are now styled in "danger" color to alert the user that validation errors exist in non-visible fields. task-6113642
Managers now see only applicable quick-add time off options when planning for an employee, reducing attempts that would fail because of insufficient balance. The Gantt view also shows leave balances and adds a time off summary on employee avatar cards, making planning easier during payroll and time off reviews.
Original PR description
Improved the Gantt multi-selection header to show only "valid" buttons when selecting a single employee. Buttons are split into two groups: "No Allocation Required" (Left) and "Available Balance" (Right). This prevents managers from attempting to assigned leaves that would result in a "low balance" error. Task: 6050592
The Mexican payroll localization now includes the latest SAT perception and deduction concepts for CFDI payroll documents. This helps companies keep payroll reporting aligned with current Mexican tax authority requirements.
Original PR description
Adds the new SAT perception and deduction concepts to the Mexican payroll CFDI concept catalog. task-6295124 Forward-Port-Of: odoo/enterprise#121568
This update improves the reliability of marketing automation by adding broader test coverage and fixing synchronization issues around customer actions, bounced messages, and failed SMS or WhatsApp activities. It helps campaigns behave more consistently when activities are added or participants move through different paths.
Original PR description
RATIONALE In order to prepare upcoming improvements for marketing automation application, as well as performance improvements, some tests are added to improve coverage and cover some synchronization…
RATIONALE
In order to prepare upcoming improvements for marketing automation
application, as well as performance improvements, some tests are added
to improve coverage and cover some synchronization use cases.
SPECIFICATIONS
Add some tests improve coverage of synchronization, as we recently
discovered limitations
* "opposite" triggers when checking brother traces to skip in
'action_update_participants' (which synchronizes traces): sub
addons (sms, whatsapp) is not taken into account;
* 'schedule_date' is not correct for user-based activities (e.g.
mail_open, mail_click, ...) when new activities are added to
a campaign. They should not have scheduled dates, as it depends
on user action. Date is correct for activities when participants
enter child activities but not when doing the synchronize;
* add some checks on participant state;
* globally try to improve some corner cases coverage;
Add some tests to improve coverage of bounce / fail behavior with
various activities, as we want to make it clearer how MA should
behave when dealing with issue. First step is to assert current
behavior and fix some odd bits.
Notably in some cases trace update is missing, notably with SMS
sending with does not call trace update method, which means some
triggers are not processed.
Various fixes are included in this branch, spotted by newly added tests.
See commits for more details.
Task-4224152: [marketing_automation] Performance / Scalability
Forward-Port-Of: odoo/enterprise#124367
Forward-Port-Of: odoo/enterprise#124126The payment form no longer shows the Payment Identifier field because it did not provide useful information for end users. This reduces visual clutter and helps users focus on relevant payment details.
Original PR description
- The Payment Identifier field has been permanently hidden from the payment form view, as it does not provide actionable or useful information to the end user. community pr - https://github.com/odoo/odoo/pull/266072 task- 6237870 Forward-Port-Of: odoo/enterprise#118183
The point of sale IoT debug window no longer shows the rarely used button for refreshing the customer display. This simplifies the debug interface and reduces clutter without affecting normal checkout operations.
Original PR description
We remove the "refresh" button used to refresh the customer display screen from the debug windows as it's almost never used. see odoo/odoo#274986 task-6357970 Forward-Port-Of: odoo/enterprise#123483
Users can now move through the journal creation wizard using keyboard arrow keys. This improves accessibility and makes setup faster for users who prefer keyboard navigation.
Original PR description
This commit aims to allow for navigation through the journal create wizard via keybaord arrows. Related Odoofin PR: https://github.com/odoo/odoofin/pull/502 task-5796200 Forward-Port-Of: odoo/enterprise#105541
Draft bank statement lines now appear in blue in the bank reconciliation view. This helps accounting users quickly identify which lines are not yet finalized, reducing review time and potential confusion.
Original PR description
This commit will put the text in blue when the statement line is in draft to be able to see quickly which lines are in draft. task-6327308 Forward-Port-Of: odoo/enterprise#124418 Forward-Port-Of: odoo/enterprise#121775
Resolved issues and error corrections
This fix prevents an account reports screen from continuing to load data after the user has already left or closed the view. It helps avoid unnecessary errors and improves reliability without changing how users work with the feature.
The rental schedule Gantt view now loads all information needed to display status indicators and popover details. This prevents display errors and missing values when users review rental planning information.
Original PR description
Before this change, the rental schedule Gantt view only declared some fields inside the `popover` element. As a result, they were not fetched with the Gantt records, even though they were also used by Gantt decorations and the popover templates. Depending on which field was missing, this could result in evaluation errors when rendering the Gantt view or missing values in the popover. This commit restores these fields as top-level Gantt fields so they are loaded with the record data and available wherever they are referenced. causing pr: https://github.com/odoo/enterprise/pull/123693 task-6398205
The sales subscription flow now blocks recurring products from being added through the catalog when the sales order has no subscription plan. This keeps catalog-based edits consistent with manual line edits and prevents orders from being saved in an invalid subscription state.
Original PR description
Steps to reproduce: --------------------------------------- 1. Install Subscription Module 2. Create and Confirm SO with no recurring plan and a non-recurring product 3. Add a recurring product >…
Steps to reproduce: --------------------------------------- 1. Install Subscription Module 2. Create and Confirm SO with no recurring plan and a non-recurring product 3. Add a recurring product > Save SO > Observe the User Error 4. Now add the same recurring product through Catalog View Observation: --------------------------------------- No User Error raised stating 'You cannot save a sale order with recurring product and no subscription plan.' Issue: --------------------------------------- When you manually add a line and click 'Save', the constraint (`_constraint_subscription_plan`) is triggered and raised `UserError` https://github.com/odoo/enterprise/blob/434d88960abb5e424fdc1106fc93935d328bff78/sale_subscription/models/sale_order.py#L176-L177 When you add a product via the catalog view, it calls `_update_order_line_info` which directly creates/updates order lines, Which do not trigger the python constraint. https://github.com/odoo/odoo/blob/ef9772bba1515bdaf5410c3af5a3e395f562d513/addons/sale/models/sale_order.py#L1926-L1933 Solution: --------------------------------------- Two private helpers are introduced: * `_is_exempt_from_subscription_plan_check`: single source of truth for all exempt states (draft, cancelled, upsell, and legacy upgrade orders). * `_check_recurring_plan_mismatch`: raises a `UserError` when the order has or will have a recurring product but no subscription plan, reusing the exemption helper so both call sites stay in sync. `_constraint_subscription_plan` is refactored to delegate to these helpers, and `_update_order_line_info` is overridden to call `_check_recurring_plan_mismatch` before the catalog update is applied, ensuring consistent validation across both entry points. opw-6194865 Forward-Port-Of: odoo/enterprise#123216 Forward-Port-Of: odoo/enterprise#117879
Previously skipped checks for stock valuation have been re-enabled and updated after recent valuation changes. This helps ensure rental stock flows and Kenya electronic stock reporting continue to calculate and report values consistently.
Original PR description
*: sale_stock_renting, l10n_ke_edi_oscu_stock Re-enable and adapt the tests skipped to fast merge the valuation refactoring made in 08b62a4bbcc6f9a391b2cc00a621ef4c76100229. The stock IO now values the receipt from the vendor bill, so the shared purchase fixtures `l10n_ke_edi_oscu` need to match the values provided in `l10n_ke_edi_oscu_stock` see for instance: https://github.com/odoo/enterprise/blob/ce68644f97ac28568b9497a18079a4ad5ce4a125/l10n_ke_edi_oscu/tests/expected_requests/save_purchase_2.json#L11-L13 Forward-Port-Of: odoo/enterprise#123165 Forward-Port-Of: odoo/enterprise#122857
The point of sale product list now uses the larger layout on medium-sized tablet screens instead of switching too early to the compact view. This gives staff more visible products and a better sales experience on compatible tablets.
Original PR description
Previously, the product list was rendered in "small display" mode for all screen sizes below the medium breakpoint (< 992px). However, some small tablets are able to fully display the product list at the medium breakpoint (≥ 768px and ≤ 991px). After this fix, "small display" mode is only applied when the screen width is below 768px. Task.6251934 Community: https://github.com/odoo/odoo/pull/266704 Forward-Port-Of: odoo/enterprise#123317 Forward-Port-Of: odoo/enterprise#119534
When processing delivery orders in the Barcode app, Odoo now automatically applies the stock owner when it can identify one, including for products that are not tracked by lot or serial number. This prevents consigned inventory from being split into incorrect stock records and keeps stock quantities accurate during barcode-based operations.
Original PR description
### Steps to reproduce: - In the settings enable: "Storage Locations" and "Consignment" - Create a storable product and put 1 unit in stock with a set owner - Go to the barcode app > Operations >…
### Steps to reproduce: - In the settings enable: "Storage Locations" and "Consignment" - Create a storable product and put 1 unit in stock with a set owner - Go to the barcode app > Operations > Delivery Orders > New - Scan your product and validate #### > The owner was not set on the stock move line so that a new quant was created and updated in stock rather than using the available unit. ### Cause of the issue: The mechanism of prefilling an owner or a package in the barcode app is currently gate-kept behind the existence of a lot name: https://github.com/odoo/enterprise/blob/0be4f71de3420fb9b72fd4e70d48c6cbbbc0ecb4/stock_barcode/static/src/models/barcode_model.js#L1382-L1407 However, the option also make sense for none tracked products. ### Note: Performing the flow form the backend and adding quantity will generate the move line by setting the owner if possible since the quantity of a move is set via the back end, move lines are generated by looking at the existing quant data's: https://github.com/odoo/odoo/blob/5d61c03b33c9a915684dd59656f8be7612956dd1/addons/stock/models/stock_move.py#L2364 https://github.com/odoo/odoo/blob/5d61c03b33c9a915684dd59656f8be7612956dd1/addons/stock/models/stock_move.py#L2328-L2330 Setting the same owner on the new move line as on the quant we are going to reserve: https://github.com/odoo/odoo/blob/5d61c03b33c9a915684dd59656f8be7612956dd1/addons/stock/models/stock_move.py#L2337 https://github.com/odoo/odoo/blob/5d61c03b33c9a915684dd59656f8be7612956dd1/addons/stock/models/stock_move.py#L1715 Additional subtelties appearing when prefilling for non tracked product: 1. Currently the available quantity is not taken into account to determine if the the value provided to the prefilled is actually relevant, in particular if there is a quant with an available quantity of 0, it will be used as a valid value to prefill and it will parasit the prefill that could be done by other quants. 2. The location source used to determine the quants taken into account is not set on the first scan since the scan is performed without any existing line: https://github.com/odoo/enterprise/blob/4f0d25f9fe4ca8ff1b0ecd7900899a2a246ba888/stock_barcode/static/src/models/barcode_model.js#L1387 > This was not problematic with respect to tracked product since the product needs to be scanned prior to the lot, hence there is always a current line when the the lot is scanned. opw-6050657 Forward-Port-Of: odoo/enterprise#124017 Forward-Port-Of: odoo/enterprise#115021
The timesheet assistant now shows the envelope icon again for existing email-related rules. This prevents users from seeing missing or incorrect icons while preserving support for Gmail activities.
Original PR description
Issue: The email activity icon (fa-envelope) is not displayed for matched email rules. Cause: The email icon mapping was replaced with gmail_activity to support Gmail events. However, existing aw.rule records still use the email activity type, causing an icon key mismatch. Fix: Restore the email icon mapping while keeping the gmail_activity mapping so both activity types display the email icon. Task-6370391 Forward-Port-Of: odoo/enterprise#123967 Forward-Port-Of: odoo/enterprise#123438
The update request for POS pricing items now uses the expected data structure again. This prevents synchronization or update errors caused by inconsistent request data, helping price-related operations run reliably.
Original PR description
odoo/enterprise#120226 FW port introduced an inconsistency in the data passed to the items update request. This commit fixes it. Forward-Port-Of: odoo/enterprise#124282
The AI conversation view now waits until the chat has finished loading before showing its start message. This prevents users from briefly seeing an empty conversation screen, making the experience feel smoother and more consistent with other Discuss channels.
Original PR description
Only display the AI thread start message once the thread has finished loading, matching the behavior of regular Discuss channels and preventing a brief flash of the empty conversation. Update the AI-specific `showStartMessage` implementation to respect the base Thread loading state instead of always displaying the start message for AI channels. Community PR : https://github.com/odoo/odoo/pull/273991 task-6352578 Forward-Port-Of: odoo/enterprise#124252 Forward-Port-Of: odoo/enterprise#122808
Rental pickup and return receipts now include the separate invoicing and shipping address details when customer addresses are enabled. This ensures printed rental documents contain the right address information for customers and operations teams.
Original PR description
**Steps to Reproduce:** 1. Install sale_renting and enable "Customer Addresses" in the settings 2. Confirm a rental order with shipping address and invoice address 3. Print the Pickup and Return Receipt **Issue:** Only the general partner address is printed; the invoicing/shipping `information_block` is missing **Why this happens:** The 19.2 layout rework (abf18ba250bae2f390f93f70abef1d7fb601c524) switched `web.external_layout` calls to accept macro arguments (e.g. `address="address"`). report_rental_order_document was only partially migrated: `address` was set above the t-call and passed as an argument, but `information_block` was left as a t-set inside the call body, which was the old convention. Once external_layout is called with explicit arguments, content t-set nodes in the body no longer populate the callee's scope, so address_layout's `t-if="information_block"` never triggers. opw-6366091 Forward-Port-Of: odoo/enterprise#124077
The Social Demo setup now uses the standard demo contact data after its old demo contact was removed. This fixes comments in demo mode so feed replies display the correct author image, making demonstrations look consistent and reliable.
Original PR description
Bug === Since ce264a2 , we remove the demo partner in the social_demo module, but we didn't update the code to use the demo data in base. Task-6293738 Forward-Port-Of: odoo/enterprise#124151 Forward-Port-Of: odoo/enterprise#120821
This fix ensures Norwegian SAF-T exports use the official account grouping code when account numbers have been extended. It prevents incorrect grouping in exported general ledger data, helping businesses produce more accurate compliance reports.
Original PR description
Steps to reproduce: - change 1920 Banck account to 19204321 - go in general ledger and export to "SAF-T" Issue: The grouping code is 4321 Grouping code should match official grouping code. As a matter of fact the chart of account seems to match thos grouping account if we slice them correctly. opw-6285078 Forward-Port-Of: odoo/enterprise#122213 Forward-Port-Of: odoo/enterprise#121932
Fixed an issue in Belgian payroll where calculating seniority could fail when multiple employee contract versions were processed at once. This helps payroll teams avoid interruptions when reviewing or computing seniority-related pay details.
Original PR description
Before this commit, _compute_l10n_be_computed_seniority looped over cp200_versions but still read self.employee_id and self.l10n_be_scale_seniority, so when Odoo batched multiple CP200 versions…
Before this commit, _compute_l10n_be_computed_seniority looped over cp200_versions but still read self.employee_id and self.l10n_be_scale_seniority, so when Odoo batched multiple CP200 versions together, the whole recordset was passed to _get_first_version_date(), crashing with a singleton error.
After this commit, the loop correctly uses version.employee_id and version.l10n_be_scale_seniority instead.
Traceback (important part):
```py
File "/home/odoo/src/enterprise/l10n_be_hr_payroll/models/hr_version.py", line 1508,
in _compute_l10n_be_computed_seniority
company_seniority = relativedelta(fields.Date.today(),
self.employee_id._get_first_version_date()).years
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/addons/hr/models/hr_employee.py", line 621, in
_get_first_version_date
versions = self._get_last_consecutive_versions(date_limit)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/addons/hr/models/hr_employee.py", line 595, in
_get_last_consecutive_versions
self.ensure_one()
File "/home/odoo/src/odoo/odoo/orm/models.py", line 5406, in ensure_one
raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: hr.employee(30, 1)
```
task-6377630
Forward-Port-Of: odoo/enterprise#123753Opening Studio from a project task list now keeps the web address clean and avoids adding an extra project ID. Returning from Studio or loading the Studio page directly no longer causes errors, making customization workflows more reliable for users.
Original PR description
Go on a project, then open its task list view Open studio with the menu item. At this point, studio is open but the url looks like: `/odoo/project/5/tasks/studio/5` the last `/5` is wrong ; this commit fixes this. Then, hit the browser's back button. There is an error because the active_id was not correctly set when leaving studio that way Try loading `/odoo/project/5/tasks/studio`, again, there is an error because the active_id is read from the wrong object Forward-Port-Of: odoo/enterprise#124412 Forward-Port-Of: odoo/enterprise#122405
The Timesheet Assistant now checks whether a project allows timesheets before offering to add time entries. This prevents users from being guided into creating timesheets for projects where time tracking has been disabled, reducing confusion and incorrect entries.
Original PR description
Before this commit, the Timesheet Assistant would display the "Add" button and attempt to prefill timesheet forms for activities matched to projects where the `allow_timesheets` setting was set to `False`. This commit updates the Timesheet Assistant logic to evaluate the project's configuration. When an activity is matched to a project that has `allow_timesheets=False`: - The "Add" button is hidden from the suggestion list. - The system prevents prefilling the timesheet creation form. Task: 6306203 Forward-Port-Of: odoo/enterprise#123071 Forward-Port-Of: odoo/enterprise#120890
New employee contracts created from a template now correctly inherit the template's analytic distribution. This helps ensure payroll-related costs are allocated as intended without manual re-entry or correction.
Original PR description
Problem: When creating a new contract from a template, the analytic distribution field is not copied from the template to the contract. Steps to reproduce: 1. Create a contract template with an analytic distribution. 2. Create a new contract for an employee from the template. 3. Check the analytic distribution field on the new contract. 4. Notice how the analytic distribution field is empty, even though it was set on the template. Cause: The field is not included in the list of whitelisted fields to copy from the template. https://github.com/odoo/odoo/blob/0133e46f89df7dce8c39d2bacd29579d57a83fad/addons/hr/models/hr_version.py#L443 opw-6370781 Forward-Port-Of: odoo/enterprise#123955
A new automated test verifies that overtime is calculated correctly for employees on flexible schedules when leave is involved. This helps prevent payroll and attendance errors from reappearing in future updates.
Original PR description
For PR: https://github.com/odoo/odoo/pull/274831 This commit adds a test case to ensure that overtime is correctly calculated for the flexible employee opw-6259328,6284145 Forward-Port-Of: odoo/enterprise#124051 Forward-Port-Of: odoo/enterprise#123830
The Dutch reports module information no longer shows an outdated website link that now points to unrelated content. This prevents users from being directed to the wrong external site and keeps the module details accurate.
Original PR description
The URL leads to a website that has nothing to do with what it used to be so it needs to be removed. Task-6360682 Forward-Port-Of: odoo/enterprise#124380 Forward-Port-Of: odoo/enterprise#123019
Fixes an error that could appear when users returned from an individual budget report entry to the report list using breadcrumbs. Budget reports now use a safe default date-based order, keeping navigation smooth and preventing an unexpected RPC error.
Original PR description
Problem:
The `budget.report` model had its default sorting (`_order`) set to False. When a user navigates back to the report list view via the breadcrumbs, the web client invokes `web_read_group`, which runs `self._order.split(',')`. Because `_order` is a boolean rather than a string, this raises an AttributeError and throws an RPC_ERROR.
Solution:
Set `_order = 'date desc'` on `budget.report`. Both queries within the `_table_query` UNION ALL expose a `date` column, providing a semantically correct and safe default ordering constraint.
Steps to replicate:
- Go to Accounting > Accounting > Analytic Budgets.
- Select any budget.
- Click 'Audit' on any budget line to land on the budget report view.
- Click to open any individual record.
- Navigate back using the breadcrumbs.
- -> RPC_ERROR: AttributeError: 'bool' object has no attribute 'split'
opw-6372610
Forward-Port-Of: odoo/enterprise#124191The AI chatbox now appears above key website editor controls, including the toolbar and snippet selector. This prevents the chatbox from being hidden while editing, especially when mass mailing features are installed.
Original PR description
This PR addresses two problems relative to the AI chatbox z-index. 1. AI chatbox should appear above the toolbar, but used to appear below instead. 2. AI chatbox should appear above snippet selector dialog, but used to appear below if `mass_mailing` was installed. task-6366360 Forward-Port-Of: odoo/enterprise#123719
The test setup for Odoo Cloud Notifications now only registers devices for internal users, matching how the product works in practice. This reduces misleading test results and helps keep notification-related quality checks accurate without changing end-user functionality.
Original PR description
Only devices of internal users are registered in order to send them Odoo Cloud Notifications (OCN). However, the test setup registers devices for non-internal users as well. This commit ensures devices are only registered for internal users. Forward-Port-Of: odoo/enterprise#119956
This fix removes unintended blank lines when Uruguayan electronic invoices include both addenda text and terms and conditions. It helps prevent addenda content from being pushed onto a separate page unnecessarily, keeping invoice PDFs more compact and correctly formatted.
Original PR description
## Context When generating a CFE (Comprobante Fiscal Electrónico) that contains both a configured addenda (e.g. bank account details stored in `l10n_uy_edi_addenda_ids`) and terms & conditions from…
## Context
When generating a CFE (Comprobante Fiscal Electrónico) that contains both a configured addenda (e.g. bank account details stored in `l10n_uy_edi_addenda_ids`) and terms & conditions from the invoice's `narration` field, the resulting addenda string could end up with unnecessary blank lines between the two sections, causing the addenda to be rendered on a separate page even when the logical content fits within the 6-line threshold.
## Root Cause
`_l10n_uy_edi_get_addenda` joins both parts without stripping whitespace from either of them first, and adds two lines between addendas and terms and conditions:
addenda = addenda + "\n\n" + term_and_conditions if addenda else term_and_conditions
Two sources independently introduce extra newlines around the separator:
1. **Addenda content** — `_get_legends` returns the raw `content` field value of each addenda record. These fields commonly end with a trailing `\n`, so the addenda string already ends with a newline before the `"\n"` separator is concatenated.
2. **`html2plaintext`** — the `narration` field is stored as HTML. When converted to plain text, `html2plaintext` typically wraps paragraph content in leading/trailing newlines.
The combination of the trailing `\n` from the addenda, the explicit `"\n\n"` separator, and the leading/trailing `\n` from `html2plaintext` produces 2–3 consecutive newlines, which `splitlines()` counts as blank lines.
A realistic 4-line addenda + 1-line narration thus produces **7 lines** instead of the expected 5, crossing the 6-line threshold in `_get_report_params` and triggering `adenda=true` — which forces the addenda onto a separate page unnecessarily.
## Steps to Reproduce
1. Configure a `l10n_uy_edi.addenda` record of type `addenda` with multi-line content (4 lines)
2. Create and confirm an invoice with `narration` set to a short single-line term
3. Generate the CFE PDF via Uruware.
4. Observe that the addenda is rendered on a separate page despite the logical content being only 5 lines.
<img width="1042" height="448" alt="image" src="https://github.com/user-attachments/assets/b538211c-5f37-4648-979d-99cd75cf31c2" />
## Fix
Strip leading and trailing whitespace (including newlines) from both parts before joining them. The ternary is also replaced with an explicit `if/else` for clarity:
def _l10n_uy_edi_get_addenda(self):
addenda = self.l10n_uy_edi_document_id._get_legends("addenda", self)
if self.narration:
term_and_conditions = html2plaintext(self.narration).strip()
if addenda:
addenda = addenda.strip() + "\n" + term_and_conditions
else:
addenda = term_and_conditions
return self._l10n_uy_edi_clean_non_ascii_chars(addenda)
This guarantees exactly one `\n` separator between sections regardless of how the content fields were stored or how `html2plaintext` formatted the narration.
The threshold logic in `_get_report_params` is unchanged: addendas that genuinely exceed 6 lines (after wrapping at 140 chars) continue to be printed on a dedicated page.
Result
<img width="1117" height="456" alt="image" src="https://github.com/user-attachments/assets/3a2d942c-8c37-40f6-bc25-470c0bd25b08" />
Forward-Port-Of: odoo/enterprise#119283This fix prevents an error when opening Studio from the Working Files menu and view. Users can now access that area without being interrupted by a technical crash.
Original PR description
Open Studio while on "Working Files" menu and view. Before this commit, the python raised an error becaude at some point `record[False]` (returning the current virtual record) was put in the return values of the onchange. After this commit, there is no error. runbot-error-941248 Forward-Port-Of: odoo/enterprise#124613 Forward-Port-Of: odoo/enterprise#124239
Belgian payroll payslip reports now correctly show the Eco Vouchers line again. This prevents missing benefit information on employee payslip documents after a recent payroll change.
Original PR description
Since changing Eco vouchers to property input, the eco vouchers line on the report does not appear, this commit fixes it by calling the correct method in the template task-6370164 Forward-Port-Of: odoo/enterprise#124515 Forward-Port-Of: odoo/enterprise#123498
Managers will no longer see the Print option twice in the Planning Gantt view. This keeps the interface cleaner and reduces confusion when choosing actions.
Original PR description
Issue: - Managers see the "Print" action twice in the Gantt view: once as a standalone button and once in the Actions dropdown. Cause: - The standalone Print button is guarded on `!this.isManager`, but `isManager` lives on the model. The expression is therefore always truthy, so the button always renders. Fix: - Use `!this.model.isManager` instead. task-6364971 Forward-Port-Of: odoo/enterprise#123442
French DAS2 reporting now always formats the fiscal year end date with two digits for the month. This prevents invalid report values such as a single-digit month being combined incorrectly, helping ensure files meet the required Aspone format.
Original PR description
Aspone force the end fiscal year in zone AD to follow the format MMdd. Before this commit, fiscalyear_last_month could be only one number and so we would end up with something like '930'. We will now add :02d to format the integer with a width of 2. task-6253745 Forward-Port-Of: odoo/enterprise#123925
The Colombian electronic invoicing flow now correctly hides the reset-to-draft option for credit notes once they have been accepted by DIAN. This prevents users from changing legally accepted documents back to draft, reducing compliance risk and data inconsistencies.
Original PR description
Issue: The reset button would still appear for credit notes that were already accepted by the DIAN. Steps to reproduce: Create a credit note, confirm it and send it to DIAN. You will be able to select Reset to Draft even though it shouldn't be possible to convert to draft after accepted by DIAN. Cause: The function to compute if the reset button would appear or not was only taking into account Invoices. Solution: Added credit notes, to the function that verifies if the reset button should appear. opw-6219265 Forward-Port-Of: odoo/enterprise#123961 Forward-Port-Of: odoo/enterprise#119696
After a worksheet is signed, the Back to Shift button now uses a more prominent style. This helps field service users more easily see the next step and return to their shift workflow.
Original PR description
Apply the primary button style to the Back to Shift button after the worksheet is signed, making the next step more visible to users. Task: 6358752 Forward-Port-Of: odoo/enterprise#124469
Belgian payroll contract templates now correctly copy three previously missing fields when creating contracts. This helps ensure employee contract data is complete and avoids triggering Dimona-related actions for simulation versions.
Original PR description
Three fields were missing in the copying process from the contract template Forward-Port-Of: odoo/enterprise#124429 Forward-Port-Of: odoo/enterprise#124235
This fixes an issue that prevented currency exchange entries from appearing in the bank reconciliation widget. Accounting users can now see the expected exchange-related lines when matching bank transactions, reducing confusion and reconciliation errors.
Original PR description
Fix a bug where the exchange moves are no more displayed in the bank reco widget. Bug introduced here: https://github.com/odoo/enterprise/pull/119557 no-task Forward-Port-Of: odoo/enterprise#124495
German point-of-sale receipts could fail to download when Fiskaly certification data was present. This fix ensures the receipt correctly reads the required TSS values, preventing crashes for German shops using certified POS receipts.
Original PR description
With fiskaly in production, when printing the pos receipt, it crashes because the tss values dictionnary is not correctly interacted with. To reproduce: install l10n_de_pos_cert create a DE shop activate fiskaly and the tss in the settings of the POS create an order in the POS and pay it go to the backend, open the pos order and download the receipt it will crash To reproduce without production credentials, you can not activate fiskaly and the tss but still create and pay the pos order. Then, you can change the pos.config to add the l10n_de_fiskaly_tss_id and change the pos.order to add the l10n_de_fiskaly_time_start. Then download the receipt. opw-6356628 Fixes https://github.com/odoo/enterprise/pull/115676 Forward-Port-Of: odoo/enterprise#123473
Code cleanup and technical improvements
This change restructures how Point of Sale accounting entries, invoices, refunds, cash handling, and customer-account payments are recorded. It reduces duplicate setup fields and makes invoice settlement clearer by settling invoices directly instead of creating extra POS orders, which should improve accounting consistency across POS sessions and localizations.
Original PR description
One of the major changes here is `pos_settle_due` in which is now only possible to settle invoices and not pos order. That's because when paying by customer account it will create an invoice each…
One of the major changes here is `pos_settle_due` in which is now only possible to settle invoices and not pos order. That's because when paying by customer account it will create an invoice each time. ### Removed fields - `invoice_journal_id` and `pos_invoice_journal_id` because now all invoice are created with the same journal, the one defined on the pos config. - `account_default_pos_receivable_account_id` because now the receivable account is defined though a default partner on the pos.config - `cash_real_transaction`, `cash_register_balance_start`, `cash_register_balance_end_real and `cash_journal_id` all these infos are now handled though the cash statement and its lines, so no need to have them on the session - `is_online_payment` because online payment method is now identified by type == 'online' and not by a boolean field - `settle_invoice_product_id`, `deposit_product_id` and `settle_due_product_id` because we don't create a pos.order when settling an invoice, so no need to have these products. - `settled_invoice_id` and `settled_order_id` because we don't create a pos.order when settling an invoice, so no need to link them anymore. - `init_customer_due_total`, `customer_due_total`, `settled_order_line_ids`, `settled_orders_count`, `commercial_partner_id` because we don't settle pos.order anymore ### Test tracking A lot of tests were replaced because all accounting entries for order and session closing are now refactored. Some tests were also removed because they were not relevant anymore with the new way of handling payment and invoicing on pos.order. #### Replaced tests `test_classic_sale_order` replace: - `test_state_when_closing_register` `test_fifo_valuation_with_invoice` replace: - `test_fifo_valuation_with_invoice_when_pos_customer_is_delivery_type` `test_fixed_tax_negative_qty_should_be_negative` replace: - `test_fixed_tax_negative_qty` - `test_fixed_tax_positive_qty` `test_user_right_on_statement_line_for_pos_user` replace: - `test_pos_closing_cash_details` `test_rounding_when_closing_session` replace: - `test_invoice_rounding_overpaid_backend` - `test_pos_create_account_move_round_globally` - `test_rounding_method` Moved in `test_pos_accounting.py`: `test_journal_entries_category_without_account` `test_tax_change_blocked_when_open_pos_session` `test_order_partial_refund_rounding` Test suite in `test_pos_accounting.py` replace: - `test_pos_simple_invoiced_orders.py` - `test_orders_no_invoiced` - `test_orders_with_invoiced` - `test_01_invoiced_order_from_other_customer` - `test_02_all_orders_invoiced_mixed_customers` - `test_total_due.py` - `test_02_orders_without_invoice` - `test_03_orders_with_invoice` `test_invoice_a_negative_order_should_create_credit_note` replace: - `test_manual_refund_negative_qty_invoice_creates_credit_note` `test_invoice_an_order_from_closed_session` replace: - `test_invoice_past_order_affecting_taxes` - `test_invoice_past_refund` - `test_invoice_past_order` - `test_sale_order_postponed_invoicing` - `test_order_invoiced_after_session_closed` - `test_order_invoiced_customer_account_after_session_closed` - `test_sale_order_postponed_invoicing` `test_pos_order_sale_and_refund_with_taxes` replace: - `test_orders_with_invoiced` - `test_return_order` `test_pos_order_sale_and_refund_with_taxes_invoiced` replace: - `test_pos_create_correct_account_move` - `test_return_order_invoiced` `test_pos_order_sale_and_refund_with_taxes_not_invoiced` replace: - `test_pos_create_correct_account_move` - `test_return_order` `test_invoiced_order_with_discount_sale_and_refund_with_tax` replace: - `test_pos_create_correct_account_move_round_globally_discount` - `test_pos_create_correct_account_move_round_globally_discount_real_use_case` `test_tax_change_blocked_when_open_pos_session` replace: - `test_tax_is_used_when_in_transactions` `test_pos_payment_direction_and_account` replace: - `test_pos_payment_direction_and_accounts` `test_cash_statement_opening_and_closing_consistency` replace: - `test_cash_register_if_no_order` - `test_cash_payments_should_reflect_on_next_opening` `test_invoicing_zero_amount_pos_order` replace: - `test_orders_with_zero_valued_invoiced` `test_order_partial_refund_rounding` replace: - `test_refund_rounding_backend` - `test_order_partial_refund` `test_pos_config_with_other_currency_than_company` replace: - `test_order_to_payment_currency` `test_accounting_items_when_closing_with_bank_difference` replace: - `test_payment_difference_accounting_items` - `test_state_when_closing_register` `test_pos_order_with_closing_storno` replace: - `test_sale_order_postponed_invoicing_storno` `test_various_orders` replace: - `test_correct_partner_on_invoice_receivables` `test_pos_order_session_closing_with_fp` replace: - `test_01_no_invoice_fpos` - `test_02_no_invoice_fpos_no_tax_dest` `test_available_stock_order_no_invoice` replace: - `test_orders_no_invoiced` - `test_return_order` `test_available_stock_order_with_invoice` replace: - `test_orders_with_invoiced` - `test_return_order` `test_pos_order_with_company_branch` replace: - `test_pos_branch_account` #### Removed tests `test_split_payment_linked_to_accounting_partner` split transaction is now only available when using customer account (type == pay_layer) `test_pos_hr_session_name_gap` removed not useful `test_order_to_invoice_no_tax` not useful `test_order_invoiced_customer_account_after_session_closed` not useful, customer account payment are always invoiced but this test is almost the same `test_invoice_an_order_from_closed_session` `test_start_balance_with_two_pos` useless test, cash payment cannot be shared. `test_different_customer_invoices_settlement_same_session_reconciled_separately` settling an invoice doesn't create `pos.order` anymore `test_split_cash_payments` removed because split on customer account is now available only when using `pay_later` payment method. `test_receivable_account_reconciliation.py`, `test_pos_reconcile` no more necessary, payment are now directly added to the account.move `test_pos_settling_account_resets_on_payment_screen_unmount` removed because now when leaving payment screen it will delete the order if its a settling one. `test_pos_settle_due_with_rounding` deleted, wtf we round on a money deposit ? `test_split_payment_linked_to_accounting_partner` split_transactions is no more available with classic pm, only with pay_later. `test_05_tax_base_amount` removed tax base amount are handled and tested by accounting helpers `test_no_kitchen_confirmation_for_deposit_money` removed because deposit money doesn't create a pos.order anymore. `test_order_with_deleted_tax` is now not possible to archive a tax used by an open order. `fastValidate` hoot deleted in pos_settle_due because isn't possible to use fast validation with settle customer invoice anymore. `test_double_syncing_same_order` removed, sync data with the same UUID will update the same order, but since a payment_ids create command is in the data, its normal that this payment is created two times.