Tuesday, September 9, 2025
14 changes · 18.0
New functionality added to Odoo
A new sales commission module automatically creates a commission vendor bill when a customer invoice is paid. This helps businesses compensate salespeople consistently by calculating a 10% commission from the related sale amount.
Original PR description
This commit introduces a new Odoo module named `sales_commission` located in the `Addons Extra` directory. The module automates the process of generating sales commissions. It is triggered when a customer invoice is marked as "Paid". Key features: - A new module `sales_commission` is created in `Addons Extra/`. - It extends the `account.move` model to override the `write` method. - When an invoice's `payment_state` becomes 'paid', the module: - Identifies the related sales order and salesperson. - Calculates a 10% commission on the total sale amount. - Creates a vendor bill for the commission amount, payable to the salesperson. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Enhancements to existing features
Users with Invoicing & Banks access can now start online bank synchronization when the bank journal is configured for online feeds and is not already connected. This makes the Connect Bank action visible to the right users, reducing dependency on higher-level access for routine banking setup.
Original PR description
Before this commit: - Users with "Invoicing & Banks" access rights could not create a bank synchronization, and the "Connect Bank" button was not visible. After this commit: - Users with "Invoicing & Banks" access rights can now create a bank synchronization if the journal has "Bank Feeds = Online Synchronization" and the bank is not yet connected. - The "Connect Bank" button is now visible to them. task-4840544
Resolved issues and error corrections
Imported French FEC accounting entries now show correctly when users open a sales journal from the dashboard. This helps accounting teams review imported sales-related records without missing entries due to how they were categorized during import.
Original PR description
**PROBLEM** When importing a FEC files, moves are created with the `move_type` `entry`. They don't appear in the action of the journal of type `sale` when clicking on the dashboard. **STEP TO REPRODUCE** 1. on a local database install `l10n_fr_fec_import` (you need to import a FEC file given by our client, dont do it on the runbot please !) 2. select the french demo company 3. import the FEC file (accounting/settings/import a file) (for file, see [ticket](https://www.odoo.com/odoo/project/49/tasks/4848763) ) 4. goes in the dashboard, and click on the `Ventes Marchandises` journal. 5. notice the entries does not appear in the action. **CAUSE** When importing a FEC file, all moves are created with the `entry`. The domain for `sale` journal doesn't include the move of type `entry`. **FIX** Adding `entry` in the `sale` journal domain. opw-4848763
This fixes a Spanish Point of Sale issue where completing an order could show a blank screen if the simplified invoice partner had been archived. Cashiers can now validate sales without disruption, reducing confusion and failed checkout flows.
Original PR description
Steps to Reproduce: -------------------- - Install the l10n_es_pos module in version 18.0. - Navigate to Contacts. - Search for Simplified Invoice Partner (ES) and archive the record. - Open the…
Steps to Reproduce: -------------------- - Install the l10n_es_pos module in version 18.0. - Navigate to Contacts. - Search for Simplified Invoice Partner (ES) and archive the record. - Open the Point of Sale (POS) and proceed to place an order. - Select a product. - Proceed to the payment screen. - Choose a payment method and click Validate. Issue: --------------------- In version 18.0, when the user proceeds with placing an order, a blank screen appears without any error message, leading to confusion for the customer. This issue occurs because during the [pos_load_data](https://github.com/odoo/odoo/blob/cd4c1d599ea9403ce3791e239ad765d946446a47/addons/point_of_sale/models/pos_session.py#L181) process, while preparing the pos.config, the `simplified_partner_id` is fetched. However, the corresponding `res.partner` record is not included during the preparation of the `res.partner` model data, as the record is archived. As a result, when the system attempts to link the related partner record to `pos.config.simplified_partner_id` on the [JavaScript side](https://github.com/odoo/odoo/blob/cd4c1d599ea9403ce3791e239ad765d946446a47/addons/point_of_sale/static/src/app/models/related_models.js#L1063-L1131 ), [ref](https://github.com/odoo/odoo/blob/cd4c1d599ea9403ce3791e239ad765d946446a47/addons/point_of_sale/static/src/app/models/related_models.js#L1114) the simplified_partner_id remains undefined. This eventually leads to an error when attempting to access [simplified_partner_id.id](https://github.com/odoo/odoo/blob/cd4c1d599ea9403ce3791e239ad765d946446a47/addons/l10n_es_pos/static/src/overrides/models/pos_store.js#L8) and will lead to the blanck screen video ref: https://drive.google.com/file/d/1oG6bBIWxhlvnJAgj22hEVtlW0hr8_1eU/view?usp=sharing ```text Other Approaches: - We can override the _load_pos_data method and append the simplified partner to ensure it's included during the data loading process. - Instead of showing a blank screen, we can display an alert message informing the customer to unarchive the simplified partner and proceed with the flow. `I’m open to any suggestions or alternative approaches that would be the best way to handle this.` ``` OPW: 4953896 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This pull request brings a broad set of maintenance updates across Odoo 18, including fixes for payments, sequence numbering, calendar reminders, inventory manufacturing flows, eCommerce access, email UI behavior, and localization compliance. These changes reduce user-facing errors, improve regulatory accuracy, and keep translations current for international users.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Live chat chatbots now use the intended step order to decide whether a visitor is returning to a saved conversation. This prevents chatbot flows from unexpectedly restarting when steps were created in one order and later rearranged, improving continuity for website visitors.
Original PR description
before this commit, `isRestoringSavedState` was computed by comparing chatbotStep IDs instead of the sequence number. This is an unreliable method that could lead to unexpected restart of the chatbot flow if the user created their steps in a certain order then swapped that order around. Besides, the field `sequence` is precisely meant to track this state. This commit adds `sequence` and computes the `isRestoringSavedState` based on that sequence. opw-4858896 Forward-Port-Of: odoo/odoo#218372
Withholding tax entries now use the invoice line account when no specific tax account is defined, preventing amounts from being posted to the wrong default withholding account. Payment and tax selection rules were also tightened so users can only choose valid withholding taxes, improving accounting accuracy.
Original PR description
**FIX - 1 : rectify default account on tax line** Before this **PR**: The Withholding Tax (WTH) base account, if set on the company, was being used as the default account. This account overrode the…
**FIX - 1 : rectify default account on tax line** Before this **PR**: The Withholding Tax (WTH) base account, if set on the company, was being used as the default account. This account overrode the expected behavior and was applied not just to the base and counterpart lines, but also to the tax line, when the tax repartition line had no account defined. After this **PR**: If the tax repartition line has no account set, the system now uses the account from the invoice line (typically an income or expense account) instead of the WTH base account. Additionally, in cases where withholding is added directly on a payment or payment registration, a constraint has been added on the tax_id field in account_withholding_line to prevent users from selecting a tax that lacks an account on its repartition line. **Technical background**: Previously, when a WTH base account was available, it was used in the creation of withholding lines. These lines, created during payment processing via _prepare_withholding_amls_create_values, inherited the WTH base account on the base line. Later, _add_accounting_data_in_base_lines_tax_details used this base account for tax line creation if the tax lacked its own repartition line account, resulting in incorrect account assignment. **Solution**: Always use the invoice line’s account (e.g., income/expense) when creating withholding lines. This ensures that the tax lines use the appropriate account. If a WTH base account is configured, it will only be applied to the base and base counterpart lines, not the tax lines in the _prepare_withholding_amls_create_values. **FIX - 2 : rectify domain on tax_id** With this commit, the domain for account_id in the account_withholding_line model correctly includes group taxes that contain at least one withholding tax. **task**-4883286
Users can now add approvers to their own approval requests without encountering an access error. The update also prevents request owners from changing or deleting approvers when they should not have that permission, helping keep approval flows controlled.
Original PR description
Fixed an issue happening when trying to add approvers to one's own request, and remove their ability to delete approvers from the request Task-4897775 Forward-Port-Of: odoo/enterprise#92309
Fixed an issue where users could see an error after opening an embedded list view from a Knowledge article and then returning to edit the article. This prevents interrupted editing and helps keep Knowledge article content stable after using embedded views.
Original PR description
Steps to reproduce =================== 1. Insert any list view in the knowledge article. 2. Click on open view from the article. 3. Come back and click edit. -> Traceback occurs Technical…
Steps to reproduce =================== 1. Insert any list view in the knowledge article. 2. Click on open view from the article. 3. Come back and click edit. -> Traceback occurs Technical ============= When we open a view from an embedded view in the article, we add `orderBy` from the action context to the action props if it exists. As the action prop is initialized and assigned directly from `embeddedState.additionalViewProps` without copying, it mutates the original object, changing the `data-embedded-props` attribute in the DOM and marking the body of the article as unsaved from `StateManager.changeState`. The action continues, and the action service commits those unsaved changes to the article. Once it is saved and the action is executed, when we get back to the article and click on edit, we check for `additionalViewProps` to be undefined/empty for all other views except calendar. As the DOM already has saved data in attributes, we get `orderBy` in `additionalViewProps`, and thus a manual error is thrown in the `editView` function. After this commit =============== Clone `additionalViewProps` when preparing the view action props. Task-4921282
The Swiss financial reports now show previous-year unallocated profit and loss using the correct period. The balance sheet also includes clearer lines for current-year retained and allocated earnings, helping users review annual results accurately.
Original PR description
Before this commit, `Previous Year unallocated profit and loss` was showing wrong amount. With this commit, we adapt this line (change period of one of its expression) and we add two new lines to reflect the actual year earnings, retained and allocated. Steps, with fresh db: - 1 invoice confirmed in the past year for 1000 - Create the carryforward move (1000 debit for 999 account, and 1000 credit for 2979 account) - Go to balance sheet, set date as 'End of last fiscal year' -> See 'Previous Years Unallocated Earnings` showing -1000 opw-4054341
German DATEV exports now correctly identify the main account when a POS session includes both sales and refunds with different tax rates. This prevents missing accounting data in affected export entries and helps ensure smoother compliance reporting.
Original PR description
In _get_datev_account, the l10n_de_datev_main_account_id is determined by identifying a singular debit or credit account used in the journal entry. If there’s no unique account, it falls back to…
In _get_datev_account, the l10n_de_datev_main_account_id is determined by identifying a singular debit or credit account used in the journal entry. If there’s no unique account, it falls back to searching for a unique non-tax line among debit or credit lines. In POS, however, there is the possibility of generating journal entries that break this flow: - In a single POS session, add product A with tax 19% and product B with tax 7%. - In the same session, refund product A. - Close the session to generate the entries. In the resulting entry, since both sale and refund are present, it is not possible to discriminate using debit and credit amounts alone, and as a result, the field l10n_de_datev_main_account_id is not populated. Since account 1411 is always the one to be used for l10n_de_datev_main_account_id in this specific case, this commit adds a final fallback filter to select the correct line and ensure the field is populated. Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4915272) opw-4915272 Forward-Port-Of: odoo/enterprise#92664
The German tax report XML export now keeps decimal amounts with a period instead of changing them to a comma. This prevents Elster from ignoring VAT amounts during submission, reducing the risk of incomplete German VAT returns.
Original PR description
**Steps to reproduce:** 1. Install `l10n_de_reports` module. 2. Configure a company with a valid SteuerNummer. 3. Post some vendor bills with `19% I` VAT. 4. Go to *Accounting → Reporting → Tax Report*. 5. Export the report to XML from gear icon. **Observed behavior:** - The generated XML contains amounts with a comma `,` as the decimal separator. - Elster ignores values with commas, so amounts are missing from the submitted VAT return. **Root cause:** - The QWeb XML export replaced the decimal point `.` with a comma `,`. - Elster launched a new tax return application (*einfachELSTERplus*), which enforces `.` as the decimal separator. **Solution:** - Stop replacing `.` with `,` when exporting values to XML. - Keep amounts as floats with period separators, while still rounding or inverting values as required for specific Kz fields. **ref:** https://www.elster.de/eportal/helpGlobal?themaGlobal=osseust_import opw-4935738 Forward-Port-Of: odoo/enterprise#93623
The Accounting reconciliation screen now correctly filters out entries that have already been reconciled. This helps accounting users review only the remaining items that still need attention, reducing confusion and manual checking.
Original PR description
**Issue:** 1. When we go to Accounting. 2. Reconcile and apply the filter "Unreconciled", it does not work as expected. **Steps to reproduce the issue:** 1. Go to Accounting → Create an invoice and confirm it 2. Create a payment for the invoice. 3. Go to the Dashboard → Bank Reconciliation 4. Reconcile the payment with the created invoice. 5. Go to Accounting → Reconcile to verify the reconciliation. 6. Apply the filter "Unreconciled" 7. The filter shows records that are already reconciled. **Before Fix:** <img width="1917" height="956" alt="Reconciled" src="https://github.com/user-attachments/assets/a1d99c6f-1603-456d-879f-e5a29bc87349" /> **After Fix:** <img width="1916" height="953" alt="reconciled_after" src="https://github.com/user-attachments/assets/fd252e45-2ad6-430c-9c31-632bce657d83" /> **Desired behavior after PR is merged:** - When we apply the Unreconciled filter, it should return only unreconciled records. OPW : 4904321 UPG : 3112101
The WhatsApp integration now uses the latest supported Meta Graph API version. This helps prevent future disruptions caused by automatic API version changes and keeps messaging functionality stable for users.
Original PR description
As outlines in the version [changelog] v17 of the API which we are currently using will be converted to the next oldest supported version of the API as per [policy] We can migrate directly to the latest version and avoid any issue in the next few years instead of having to worry about potentially breaking changes every few months. [changelog]: https://developers.facebook.com/docs/graph-api/changelog/versions/ [policy]: https://developers.facebook.com/docs/graph-api/guides/versioning task-4971841 Forward-Port-Of: odoo/enterprise#93170