Daily updates from Odoo
Navigate
Branch
Wednesday, June 11, 2025
61 changes
29 changes
Enhancements to existing features
Odoo Studio now relies on the shared list selection behavior provided by the main platform instead of maintaining its own version. This keeps Studio more consistent with the rest of Odoo and reduces duplicated maintenance work, with no expected change for end users.
Original PR description
This commit is the counter part of a change done in odoo/odoo#212148 which adds the `selection` getter on StaticList. Studio doesn't need to define it anymore.
Spreadsheet export support is now loaded only when it is actually needed, rather than during general module startup. This should reduce unnecessary processing for users who are not exporting Excel files while keeping report export behavior unchanged.
Original PR description
odoo/odoo#212411
Users creating batch payments are now alerted when selected payments are not in a valid state. They can review the invalid payments and continue creating the batch while excluding those entries, helping prevent processing errors.
Original PR description
Added an error wizard to be displayed when there are payments with invalid state included when creating a batch payment. Giving the option to check the invalid payments and create the batch with discarding these invalid payments. task-4531618
Studio users can now adjust the width of fields in list views directly from the list view editor. This gives teams more control over how data is displayed, making important columns easier to read without custom development.
Original PR description
This commit adds support for customizing a field's column width in list views directly from Studio. task-4793106
This update makes Peruvian electronic invoice exports report both line-level and overall discounts in the compliant SUNAT format. Businesses can now apply discounts without masking them as lower product prices, reducing compliance risk and improving invoice accuracy.
Original PR description
Line level discounts were skipped in the previous rewrite of `l10n_pe_edi` as it had weird edge-cases at the time, so before we just manually reduced the prices of the products by the discount to account for the final cost of the invoice. However, this was not technically allowed or compliant with SUNAT, as such, this PR allows for the export of Global and Line Level discounts properly. Note that we had the field `l10n_pe_edi_allowance_charge_reason_code` defined previously in this module but it was not used anywhere. It could be used here for discounts, however, discounts will always be a specific value depending if it's global or line level so there is no need to allow the customer to select it or something different. As there is a chance that the future withholding tasks will need this field, it is staying but made hidden as it doesn't do anything for now. task-4605358
Resolved issues and error corrections
The batch transfer screen now hides quality check buttons in a way that no longer leaves empty space in the stock move line list. This makes the form cleaner and easier to read when those actions are not relevant.
Original PR description
The quality check wizard buttons in the stock move line list of the batch transfer form view should be hidden by `column_invisible` rather than plain `invisible` because they leave behind a large gap when they aren't visible otherwise. Task ID: [4711804](https://www.odoo.com/odoo/my-tasks/4711804)
Employee managers can now create appraisal campaigns for their own team members, even if they do not have broader appraisal access rights. The update also makes the campaign launch option visible only to managers and simplifies the campaign setup screens by hiding fields that are not relevant to most users.
Original PR description
Currently, employees managers with no access rights are not allowed to create a new appraisal concern for their employees. To grant managers the access to create appraisal campaigns, new customized access rule for employees' managers has been created. Also, both the Kanban and List views have been modified so that only the managers can see the "Launch Campaign" button. Furthermore, some changes have been implemented in the UX for the appraisal campaign wizard, such as removing the mode field and hiding the manager field for non administrator/Officer users, as well as hiding the company,coach,and manager fields from the search employee view.
Code cleanup and technical improvements
This change streamlines how Odoo communicates with IoT Boxes by replacing separate communication services with one shared approach. It should make IoT-related operations such as printing, device actions, weighing, and delivery package workflows more consistent and easier to maintain.
Original PR description
### The communication between the IoT Box and a DB can be done using: - Longpolling, - Websocket, - Simple fetch from one side or the other. ### Problems: - The longpolling and the websocket can…
### The communication between the IoT Box and a DB can be done using: - Longpolling, - Websocket, - Simple fetch from one side or the other. ### Problems: - The longpolling and the websocket can theorically be substituted but don't have a common API, - The websocket service is currently designed to handle ONLY printing jobs, - The longpolling is barely used, often replaced by a simple "action", but never polling (~never listening for response from the IoT Box), ### Solution: We refactored all this in order to simplify the communication. - `iot_longpolling` and `iot_websocket` services are replaced by a single `iot_http` service exposing available methods, - Websocket can now call every IoT Box _action method_, - Longpolling and Websocket now have a common simple API (`sendMessage`/`onMessage`), - Longpolling can now fallback to websocket on every call (via `action` method), #### List of the methods: - `get`/`post`: base http methods to properly contact an IoT Box from the db client, - `websocket.sendMessage`/`websocket.onMessage`: websocket methods, - `longpolling.sendMessage`/`lonpolling.onMessage`: longpolling methods (+ `lonpolling.addListener`/`lonpolling.removeListener` kept for compatibility), - `action`: general method to properly handle a simple communication between the db and the IoT Box, Community PR: [https://github.com/odoo/odoo/pull/185506](https://github.com/odoo/odoo/pull/185506) Task: 4283647
Miscellaneous changes
When the user pairs an IoT box in the SaaS, it automatically receives a TLS certificate from odoo.com so that it can be accessed via HTTPS. However, sometimes the user's DNS will not be able to resolve the IoT box's new address straight away, making it unreachable. We cannot detect this error directly, and there is nothing we can do on our end to alter the user's DNS setup. Instead, this commit adds an error message mentioning the DNS issue in the event that an IoT box has a valid certi
Original PR description
When the user pairs an IoT box in the SaaS, it automatically receives a TLS certificate from odoo.com so that it can be accessed via HTTPS. However, sometimes the user's DNS will not be able to resolve the IoT box's new address straight away, making it unreachable. We cannot detect this error directly, and there is nothing we can do on our end to alter the user's DNS setup. Instead, this commit adds an error message mentioning the DNS issue in the event that an IoT box has a valid certificate but we are unable to reach it. Community PR: https://github.com/odoo/odoo/pull/211165 task-4787494 Forward-Port-Of: odoo/enterprise#86166
This commit simply amends the expected scale checksum after the fix that was carried out in the community PR (odoo/odoo#209815) opw-4643243 Forward-Port-Of: odoo/enterprise#86330 Forward-Port-Of: odoo/enterprise#85442
Original PR description
This commit simply amends the expected scale checksum after the fix that was carried out in the community PR (odoo/odoo#209815) opw-4643243 Forward-Port-Of: odoo/enterprise#86330 Forward-Port-Of: odoo/enterprise#85442
## Pull Request HOOT (PRHOOT) 32 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Community: https://github.com/odoo/odoo/pull/210041 --- I confirm I have signed
Original PR description
## Pull Request HOOT (PRHOOT) 32 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Community: https://github.com/odoo/odoo/pull/210041 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#87249 Forward-Port-Of: odoo/enterprise#85562
This commit refines the softphone tabs UI for a cleaner and more modern look. task-4768693 closes odoo/enterprise#85702 Forward-Port-Of: odoo/enterprise#86986
Original PR description
This commit refines the softphone tabs UI for a cleaner and more modern look. task-4768693 closes odoo/enterprise#85702 Forward-Port-Of: odoo/enterprise#86986
remove the unnecessary selector that was causing the tour test to fail 00:1 was not found in the view nor the DOM  build_error-163619 Forward-Port-Of: odoo/enterprise#87105
Original PR description
remove the unnecessary selector that was causing the tour test to fail 00:1 was not found in the view nor the DOM  build_error-163619 Forward-Port-Of: odoo/enterprise#87105
Context: The Belgian localisation has two Intrastat report handlers: - Goods: `l10n_be_intrastat.models.account_intrastat_report` - Services: `l10n_be_intrastat_services.models.account_intrastat_services_report` `account_intrastat_report.be_intrastat_export_to_xml()` is the single export entry-point for both. It always calls an internal helper named `_be_intrastat_get_xml_file_content(options, results, company)` and then serialises the returned string. Why it failed: 1. Signature dri
Original PR description
Context: The Belgian localisation has two Intrastat report handlers: - Goods: `l10n_be_intrastat.models.account_intrastat_report` - Services:…
Context: The Belgian localisation has two Intrastat report handlers: - Goods: `l10n_be_intrastat.models.account_intrastat_report` - Services: `l10n_be_intrastat_services.models.account_intrastat_services_report` `account_intrastat_report.be_intrastat_export_to_xml()` is the single export entry-point for both. It always calls an internal helper named `_be_intrastat_get_xml_file_content(options, results, company)` and then serialises the returned string. Why it failed: 1. Signature drift The services override expected a fourth positional argument (`date`), so the shared entry-point raised a `TypeError`. 2. Wrong template prefix The helper tried to render `l10n_be_intrastat.intrastat_services_report_export_xml`, but the template is stored under `l10n_be_intrastat_services`, leading to a `ValueError`. This commit drop the unused `date` parameter and compute the period from options the same way we do in the other function. opw-4834279 Forward-Port-Of: odoo/enterprise#86759
[FIX] account_online_synchronization: currencies symbol missing Before this commit when doing a bank synchronization with a currency that wasn't enabled, the currency was not reloaded in the session and so the getCurrency function was not working properly. The symbol was not displayed. task-4749335 This commit will change a bit the display of statement line with multi currency. A popover has been added when clicking on the amount to have extra line info like the exchange difference
Original PR description
[FIX] account_online_synchronization: currencies symbol missing Before this commit when doing a bank synchronization with a currency that wasn't enabled, the currency was not reloaded in the session…
[FIX] account_online_synchronization: currencies symbol missing Before this commit when doing a bank synchronization with a currency that wasn't enabled, the currency was not reloaded in the session and so the getCurrency function was not working properly. The symbol was not displayed. task-4749335 This commit will change a bit the display of statement line with multi currency. A popover has been added when clicking on the amount to have extra line info like the exchange difference and when we have a partial reconcile. - Correcting a bug where the amount currency of the suspense was wrong when dealing with currencies (delete or adding lines). For example when dealing with JPY currency (that have a rounding of 1). Making an invoice for 100 yen and a statement line of 50 yen. When adding the line and removing it, we could have rounding issue since we calculate the amount currency by multiplying the balance and the currency rate. In this example we achieve a suspense line of 49 when it should be 50. - Correcting another bug with exchange diff. In the same case, we had an exchange difference value of 0.01 in _lines_get_account_balance_exchange_diff which shouldn't be there. In prior version of 18.3 we checked that the origin_balance minus move_line.balance was zero in the currency of the move line as well as the one from the company and if that was the case no exchange move line were created. And since there were no exchange move line the exchange move was not created. In this commit, I reintroduce the logic of checking the move line currency to return 0.0 but that was not enough since the reconcile_plan function would still create the exchange move since we were not using the context key anymore. So now if the exchange value is 0 then we pass the context key to avoid having an exchange move. - Also doing some formatting because the linter was not correctly applied. - Correcting also a case where the reconciled_lines_ids has multiple line in case of exchange diff, which cased a traceback since is_invoice needs a singleton. - When having a foreign currency, the suspense amount is displayed in the foreign currency but when adding move line with the same currency, due to the computation on the amount_currency we could have situation where the amounts don't add up. We decided that if there is a foreign currency and that all the lines are in the foreign currency we do an addition of the amount currency otherwise we display the suspense in journal currency. For this we had to use the self.amount_currency because the liquidity line is not modified when modifying the amount currency of the statement line itself. (Tried to synchro the move and more in particular the liquidity line but had a constraint failing) - When doing an apply amount of a line that has multiple value in the reconcilied_lines_ids, it gives a traceback because we want to get the current_ids of a dict of multiple values task-4749335 Forward-Port-Of: odoo/enterprise#86519
Description ----------- When copying a document, a new attachment is created and linked to the copied document. Since `documents.document.is_multipage` depends on `documents.document.datas`, which is related to `attachment_id.datas`, and `attachment_id` was just written to, `_compute_is_multipage` will be recomputed during flushing before commit, as it's a compute stored field. This is problematic when copying multiple large documents, since this compute reads the entire binary data to dete
Original PR description
Description ----------- When copying a document, a new attachment is created and linked to the copied document. Since `documents.document.is_multipage` depends on `documents.document.datas`, which is related to `attachment_id.datas`, and `attachment_id` was just written to, `_compute_is_multipage` will be recomputed during flushing before commit, as it's a compute stored field. This is problematic when copying multiple large documents, since this compute reads the entire binary data to determine if it's more than one page. This commits explictly writes on `is_multipage` to implicitly add it to the protected fields, which will prevent its' recomputation when flushing. Benchmark --------- Copying 5 documents (PDF) of 50MB each takes in total: | Before | After | Diff | |--------|--------|--------| | 1.61GB | 1.17GB | -27.3% | Reference --------- opw-4829372 Forward-Port-Of: odoo/enterprise#87235 Forward-Port-Of: odoo/enterprise#86885
The certification reports for Colombian withholdings (Fuente, ReteIVA, ReteICA) incorrectly referenced the current year (i.e., the year when the report is generated) as the "año gravable" in the certificate body: "Durante el año gravable de 2025..." This caused a mismatch when generating certificates for the previous fiscal period (e.g., 2024), especially when the user filtered movements from a prior year. This change ensures that the "año gravable" corresponds to the selected period ye
Original PR description
The certification reports for Colombian withholdings (Fuente, ReteIVA, ReteICA) incorrectly referenced the current year (i.e., the year when the report is generated) as the "año gravable" in the…
The certification reports for Colombian withholdings (Fuente, ReteIVA, ReteICA) incorrectly referenced the current year (i.e., the year when the report is generated) as the "año gravable" in the certificate body: "Durante el año gravable de 2025..." This caused a mismatch when generating certificates for the previous fiscal period (e.g., 2024), especially when the user filtered movements from a prior year. This change ensures that the "año gravable" corresponds to the selected period year, taken from the date_from filter in the report wizard, which reflects the actual accounting or fiscal period being certified. Justification According to Colombian tax practices and DIAN guidelines, the "año gravable" mentioned in retention certificates must match the period in which the income or payment was made and the tax was withheld. Using the current date instead of the actual reporting period could lead to confusion or even legal inconsistencies during audits. Reference: Estatuto Tributario Art. 378: Certificates must include the fiscal year in which the withholding was applied. Common practice requires companies to issue certificates reflecting the year of the transactions, not the year of report generation. Forward-Port-Of: odoo/enterprise#86838
When a signed document is moved to trash in the documents app, when the cron tries to delete the said document it should raise a foreign key violation error in the terminal not in UI. **Steps to reproduce:** * Install document and sign * Document App> all> click `Employment contract.pdf`. * Select sign>drag and drop Signature>Sign now * Sign the document>validate and send completed document * Documents>certificate of completion or the signed document>actions>trash * The error will be pr
Original PR description
When a signed document is moved to trash in the documents app, when the cron tries to delete the said document it should raise a foreign key violation error in the terminal not in UI. **Steps to…
When a signed document is moved to trash in the documents app, when the cron tries to delete the said document it should raise a foreign key violation error in the terminal not in UI. **Steps to reproduce:** * Install document and sign * Document App> all> click `Employment contract.pdf`. * Select sign>drag and drop Signature>Sign now * Sign the document>validate and send completed document * Documents>certificate of completion or the signed document>actions>trash * The error will be produced when cron deletes the document. * You can delete the document from trash to see what error will be displayed by cron. `ERROR: update or delete on table "ir_attachment" violates foreign key constraint "sign_request_completed_document_rel_ir_attachment_id_fkey" on table "sign_request_completed_document_rel"` **Solution:** * Modifying the domain for `_gc_clear_bin` via a new function called overridden `_gc_documents_domain` in `documents_sign` this will allow for cron to skip over signed required document during unlink process. * This will still throw an `Validation Error` when the user tries to delete it from the GUI letting them know it cannot be deleted. Sentry-6225030131 Forward-Port-Of: odoo/enterprise#86382 Forward-Port-Of: odoo/enterprise#83765
**Steps to Reproduce :** 1. Install l10n_cl_edi. 2. Navigate to Contacts create an invoice for CL Company 3. Choose the document type: (33) Electronic Invoice. 4. Confirm the invoice. 5. Ensure the partner has only the street value set (e.g., "Name"), and street2 is empty. **Issue:** When generating the DTE, if street2 is empty, a trailing space appears in the <DirOrigen> tag ex: `DirOrigen>Name </DirOrigen>` **Solution:** Applied strip() to remove the extra space when stre
Original PR description
**Steps to Reproduce :** 1. Install l10n_cl_edi. 2. Navigate to Contacts create an invoice for CL Company 3. Choose the document type: (33) Electronic Invoice. 4. Confirm the invoice. 5. Ensure the partner has only the street value set (e.g., "Name"), and street2 is empty. **Issue:** When generating the DTE, if street2 is empty, a trailing space appears in the <DirOrigen> tag ex: `DirOrigen>Name </DirOrigen>` **Solution:** Applied strip() to remove the extra space when street2 is empty. This ensures no trailing space when street2 is empty and proper spacing when both street and street2 is present. opw-4765451 Forward-Port-Of: odoo/enterprise#85110
Upgrading from 16 to 17 causes issues with demo data. It happens when the main company has no chart template, because it won't find the correct `account.journal` for the moves (and `account.account` for the lines). To reproduce: - initialize an Odoo 16.0 database with `account_accountant` and NO demo data. (There will be no country_id set on the default company, so the `post_install` hook in `account` won't install `l10n_generic_coa`) - install demo data (the `post_install` hook in `accoun
Original PR description
Upgrading from 16 to 17 causes issues with demo data. It happens when the main company has no chart template, because it won't find the correct `account.journal` for the moves (and `account.account` for the lines). To reproduce: - initialize an Odoo 16.0 database with `account_accountant` and NO demo data. (There will be no country_id set on the default company, so the `post_install` hook in `account` won't install `l10n_generic_coa`) - install demo data (the `post_install` hook in `account` is then not fired, still no `l10n_generic_coa`) - upgrade to Odoo 17.0 By creating the demo data in Python instead of the XML, we can put the condition to avoid creating the move if we do not have a chart template on the company. Community PR: odoo/odoo#200420 opw-4781045 Forward-Port-Of: odoo/enterprise#86477 Forward-Port-Of: odoo/enterprise#80812
Previously, the link used by the “test_winbooks_import” test to download sample data (PARFILUX) from Winbooks was unavailable. This commit changes the url to use directly Winbooks server instead of Amazon, which will allow the test to run without any problem. Forward-Port-Of: odoo/enterprise#87220 Forward-Port-Of: odoo/enterprise#87090
Original PR description
Previously, the link used by the “test_winbooks_import” test to download sample data (PARFILUX) from Winbooks was unavailable. This commit changes the url to use directly Winbooks server instead of Amazon, which will allow the test to run without any problem. Forward-Port-Of: odoo/enterprise#87220 Forward-Port-Of: odoo/enterprise#87090
### Steps to reproduce: - Have an overdue invoice - Go to Accounting > Customers > Follow-up Reports and click the partner - Change the state of the report to something different than the first state - Click "Follow-up", select "By post" and send - Settings > technical > Email > Snailmail Letters find the letter corresponding to the report - Check the PDF, it is using the mail template of the first followup level ### Cause: When sending a followup report, the followup level of the repo
Original PR description
### Steps to reproduce: - Have an overdue invoice - Go to Accounting > Customers > Follow-up Reports and click the partner - Change the state of the report to something different than the first state…
### Steps to reproduce: - Have an overdue invoice - Go to Accounting > Customers > Follow-up Reports and click the partner - Change the state of the report to something different than the first state - Click "Follow-up", select "By post" and send - Settings > technical > Email > Snailmail Letters find the letter corresponding to the report - Check the PDF, it is using the mail template of the first followup level ### Cause: When sending a followup report, the followup level of the report is recomputed for it to have the correct value. Then the report is generated. But the option to send a letter uses methods from the module `snailmail` for example `` which don't have options. The options are then recomputed to generate the report, reading [`partner.followup_line_id`](https://github.com/odoo/enterprise/blob/c8dac822cf3df23922488f33c07a114bbea05198/account_followup/models/account_followup_report.py#L42) so getting the wrong value. ### Solution: Add a context key to pass the value of `followup_line` to the report generation after snailmail. opw-4766804 Forward-Port-Of: odoo/enterprise#86706 Forward-Port-Of: odoo/enterprise#85717
The system will crash with an error when we `fetch transactions` and then click on the total amount in the top right corner, because the method `action_open_bank_balance_in_gl` expects `exactly one journal record` (self.ensure_one()), but receives an empty recordset. **Steps to Produce:-** 1. Install the `Accounting` module. 2. Navigate to `Invoicing > Bank`, then click on "Search Banks" and connect with the `Odoo Bank Sync Demo`. 3. Click on `Fetch Transactions` and wait for the process
Original PR description
The system will crash with an error when we `fetch transactions` and then click on the total amount in the top right corner, because the method `action_open_bank_balance_in_gl` expects `exactly one…
The system will crash with an error when we `fetch transactions` and then click on the total amount in the top right corner, because the method `action_open_bank_balance_in_gl` expects `exactly one journal record` (self.ensure_one()), but receives an empty recordset. **Steps to Produce:-** 1. Install the `Accounting` module. 2. Navigate to `Invoicing > Bank`, then click on "Search Banks" and connect with the `Odoo Bank Sync Demo`. 3. Click on `Fetch Transactions` and wait for the process to complete. 4. In the new view, click on the `total amount` located in the `top right corner`. **Error:-** `ValueError: Expected singleton: account.journal()` **Solution:-** - At [1], in `default_context` we can see that `active_id` is not given. [1] https://github.com/odoo/enterprise/blob/4b8edc19dbece15f7843ec3647c464307e165906/account_online_synchronization/models/account_online.py#L878-L882 - So, in this commit now active_id is added in default_context to prevent the error **Sentry - 6644825437** Forward-Port-Of: odoo/enterprise#86896
The system crashed because it expected the information from the card to be in `dictionary` format, but it came in the `list of dictionaries`. Usually, when there is only one contact on the card, the system retrieves the details as a `Dictionary`. But if the card has details of more than one person, it receives a `list of dictionaries`. When the `extracted_data` comes as list of dictionaries, then at [1], it raises the `TypeError`. [1] https://github.com/odoo/enterprise/blob/e5b21d77b6dfff
Original PR description
The system crashed because it expected the information from the card to be in `dictionary` format, but it came in the `list of dictionaries`. Usually, when there is only one contact on the card, the…
The system crashed because it expected the information from the card to be in `dictionary` format, but it came in the `list of dictionaries`. Usually, when there is only one contact on the card, the system retrieves the details as a `Dictionary`. But if the card has details of more than one person, it receives a `list of dictionaries`.
When the `extracted_data` comes as list of dictionaries, then at [1], it raises the `TypeError`.
[1]
https://github.com/odoo/enterprise/blob/e5b21d77b6dfff2b1371909c3c1e17cecee43a19/crm_enterprise/tools/business_card_scanner.py#L85
**Steps to produce:-**
1. Install `CRM` and make sure you have iap tokens for `Lead generation`.
2. Go to CRM and click on gear icon and click on Import Business Cards.
3. Then upload this [image](https://drive.google.com/file/d/1wKONdUEAMQptNU8cUeZsUY1xVJBpD8Dk/view?usp=sharing).
**Traceback:-**
```py
Traceback (most recent call last):
File "/home/odoo/odoo18/community/odoo/http.py", line 2467, in __call__
response = request._serve_db()
File "/home/odoo/odoo18/community/odoo/http.py", line 1970, in _serve_db
return self._transactioning(
File "/home/odoo/odoo18/community/odoo/http.py", line 2034, in _transactioning
return service_model.retrying(func, env=self.env)
File "/home/odoo/odoo18/community/odoo/service/model.py", line 164, in retrying
result = func()
File "/home/odoo/odoo18/community/odoo/http.py", line 2001, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/odoo18/community/odoo/http.py", line 2263, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/odoo18/community/odoo/addons/base/models/ir_http.py", line 349, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/odoo18/community/odoo/http.py", line 757, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/odoo18/community/addons/web/controllers/dataset.py", line 32, in call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/odoo/odoo18/community/odoo/service/model.py", line 84, in call_kw
result = method(recs, *args, **kwargs)
File "/home/odoo/odoo18/enterprise/crm_enterprise/models/crm_lead.py", line 34, in action_ocr_business_cards
leads = card_scanner.business_cards_to_leads(attachments)
File "/home/odoo/odoo18/enterprise/crm_enterprise/tools/business_card_scanner.py", line 82, in business_cards_to_leads
lead_values = {
File "/home/odoo/odoo18/enterprise/crm_enterprise/tools/business_card_scanner.py", line 85, in <dictcomp>
if extracted_data.get(field)
AttributeError: 'list' object has no attribute 'get'
```
**Solution:-**
- We first checked whether the data returned from the OCR was a dictionary or a list of dictionaries (multiple contacts).
- If it was just a dictionary, **we wrapped it in a list** so that we could handle everything the same way.
- Then, we looped through each dictionary, picked out the allowed fields, and **created a lead for each one**.
**Sentry - 6658829547**
Forward-Port-Of: odoo/enterprise#87159When the post_invoice_hook failed, and sale_subscription_stock was installed, all subscription invoiced would have a "Delivery creation failed" activity created, even if no delivery needed to be created. This commit filter out the subscriptions without any stock lines that needs the stock rule to be run. OPW-4618930 Forward-Port-Of: odoo/enterprise#86190 Forward-Port-Of: odoo/enterprise#85604
Original PR description
When the post_invoice_hook failed, and sale_subscription_stock was installed, all subscription invoiced would have a "Delivery creation failed" activity created, even if no delivery needed to be created. This commit filter out the subscriptions without any stock lines that needs the stock rule to be run. OPW-4618930 Forward-Port-Of: odoo/enterprise#86190 Forward-Port-Of: odoo/enterprise#85604
Before this commit: === - The delivery status buttons (New, Ongoing, Done) and the toggle Switches were misaligned on smaller screens due to the use of grid layout, After this commit: === - The layout uses a flex-based structure, which ensures better alignment and spacing across screen sizes. Task: 4844890 Forward-Port-Of: odoo/enterprise#86904
Original PR description
Before this commit: === - The delivery status buttons (New, Ongoing, Done) and the toggle Switches were misaligned on smaller screens due to the use of grid layout, After this commit: === - The layout uses a flex-based structure, which ensures better alignment and spacing across screen sizes. Task: 4844890 Forward-Port-Of: odoo/enterprise#86904
In Gstr-3B section 3.1(a) credit note/debit note should be calculated. This PR adds credit note/debit note into section 3.1(a). **Older Version PR:** https://github.com/odoo/enterprise/pull/87160 **opw**-https://www.odoo.com/odoo/project/49/tasks/4845457 **Task**-4852947 Forward-Port-Of: odoo/enterprise#87171
Original PR description
In Gstr-3B section 3.1(a) credit note/debit note should be calculated. This PR adds credit note/debit note into section 3.1(a). **Older Version PR:** https://github.com/odoo/enterprise/pull/87160 **opw**-https://www.odoo.com/odoo/project/49/tasks/4845457 **Task**-4852947 Forward-Port-Of: odoo/enterprise#87171
Fixed the computation of `is_vat_duplicated` to avoid false positive in case of partners having both invoices and refunds in the selected period. Forward-Port-Of: odoo/enterprise#87247
Original PR description
Fixed the computation of `is_vat_duplicated` to avoid false positive in case of partners having both invoices and refunds in the selected period. Forward-Port-Of: odoo/enterprise#87247
In test_generate_all_export_files, PDF and XLSX reports were not generated due to them timing-out the runbot, which was happening randomly. This has been fixed here by only testing the generation of the data then given to wkhtmltopdf, since wkhtmltopdf is quite slow and can randomly create errors. This is taking about 4 minutes with this fix when all reporting modules are enabled in v17.0 but taking around 20 minutes when creating PDFs. task-3603619 Forward-Port-Of: odoo/enterprise#872
Original PR description
In test_generate_all_export_files, PDF and XLSX reports were not generated due to them timing-out the runbot, which was happening randomly. This has been fixed here by only testing the generation of the data then given to wkhtmltopdf, since wkhtmltopdf is quite slow and can randomly create errors. This is taking about 4 minutes with this fix when all reporting modules are enabled in v17.0 but taking around 20 minutes when creating PDFs. task-3603619 Forward-Port-Of: odoo/enterprise#87232 Forward-Port-Of: odoo/enterprise#86307
32 changes
New functionality added to Odoo
Adds missing Jordan JoFotara e-invoicing capabilities, including support for more invoice types, payment methods, demo mode, and reporting invoices in their original currency. This helps Jordan-based businesses comply with local e-invoicing requirements more accurately and test configurations before going live.
Original PR description
This new module adds necessary features to support JoFotara properly with the following features: 1. Support for different invoice types and payment methods 2. Demo mode These features were added in a new module in stable, but will be merged with the main module in master. The commit also adds support for reporting invoices in their currency. task-4534862 task-4656902
Enhancements to existing features
Partner autocomplete now sends the database version and user language when requesting enrichment data. This helps the external autocomplete service return more relevant results and support compatibility across Odoo versions.
Original PR description
task-4746445 IAP PR: https://github.com/odoo/iap-apps/pull/1088
The Mail module now supports custom behavior when an activity is updated from the activity button. This helps related document workflows react more reliably to activity changes, supporting a targeted document fix.
Original PR description
For a document fix, we add a method to the activity button that implements custom behavior when an activity changes. see odoo/enterprise#84128 task-4690165
Resolved issues and error corrections
A Belgian tax description was corrected so it now accurately shows 0% VAT for services instead of incorrectly referring to 6% VAT. This helps users see the right tax information in accounting records and reduces confusion in Belgian localization setups.
Original PR description
- Before this commit: The tax with ID `attn_VAT-OUT-00-S`, which represents a `0% Service Tax`, had an incorrect description `6% VAT (Services)` instead of `0% VAT (Service)`. - After this commit: The typo has been corrected by updating the description to accurately reflect the tax rate as `0% VAT (Service)`. Task-4855172 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Invoice reports now display the Terms and Conditions section across the available page width when needed. This improves readability for longer or multi-line terms and removes unnecessary blank space on printed invoices.
Original PR description
**Issue** The "Terms and Conditions" section in the invoice report only takes up half of the page, leaving unnecessary blank space on the other half. **Steps to Reproduce:** 1. Install the Accounting…
**Issue** The "Terms and Conditions" section in the invoice report only takes up half of the page, leaving unnecessary blank space on the other half. **Steps to Reproduce:** 1. Install the Accounting app. 2. Navigate to Accounting > Customers > Invoices. 3. Create or open an invoice. 4. Add a multiline text in the "Terms and Conditions" field. 5. Confirm and print the invoice report. 6. Observe that the content only fills half the available width. **Expected Behavior:** The "Terms and Conditions" text should utilize the full width of the report layout if needed, especially for multiline entries. **Actual Behavior:** The text is constrained to half the page, reducing readability and leaving unused space. **Root Cause** The issue was introduced by PR #193399, which added the `overflow-auto` class to address a display bug from ticket 4416845. However, this class was applied too broadly, affecting the layout of the "Terms and Conditions" block. **Fix** To address this issue, a class is added specifically to the terms and conditions div to control its display. opw-4698250 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Clicking an image inside an editable paragraph now opens the image toolbar instead of the text toolbar. This prevents confusing editing options and makes image editing behave as users expect.
Original PR description
Current behavior before PR: - Clicking an image inside `<div class="o-paragraph">` opened the text toolbar. This is because the selection traversed a whitespace text node that was not filtered out. Desired behavior after PR is merged: - This fix filters out such nodes to show the correct (image) toolbar. task-4844821 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a user removes a file or image from a mail attachment list, the editor now also removes the matching reference from the message content. This prevents recipients and users from seeing broken links or missing images caused by deleted attachments.
Original PR description
Description of the issue this PR addresses: Current behavior before PR: Attachments like files and images removed from the mail attachment list were still present in the editor, resulting in broken links and 404 errors. Desired behavior after PR is merged: Removing an attachment from the list also removes its reference from the editor. task-4794954 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Removing formatting from colored table cells in the HTML editor no longer causes an error. This makes editing tables more reliable when users clear background colors or formatting.
Original PR description
**Current behavior before PR:** Steps to reproduce: - Create a table. - Select some cells, apply background color on them. - Try to remove format using removeFormat button. Trying to remove format from the colored cells leads to traceback `Infinite Loop in removeAllColor()`. The issue happens because after merging commit [1], when applying background-color on cells, text-color will also get applied along with background-color. When trying to remove color using removeFormat button, `applyTableColor` method fails to remove text-color from cells despite having color on them, leading to infinite loop error. **Desired behavior after PR:** Now, background-color is removed from cells without any traceback. [1]: https://github.com/odoo/odoo/commit/616413c3272429ec48a6ac238c899b31d0751546 task-4805468 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The table of contents in the HTML editor now shows heading levels with consistent indentation, even in unusual heading sequences. This makes generated outlines easier to read and helps users understand document structure more accurately.
Original PR description
Prior to this commit, headings indentation was inconsistent in some edge cases.
Example:
```
<h3>
<h2>
<h3>
<h2>
<h3>
```
would appear instead of:
```
<h3>
<h2>
<h3>
<h2>
<h3>
```
Desired algorithm:
- Indent heading by 1 unit to the right of the previous strictly lower heading, or no indent
task-4836337Leave requests for employees on flexible schedules now correctly exclude applicable public holidays, even when those holidays are not tied to a specific working calendar. This prevents employees from being charged extra leave days when a company public holiday falls during their time off.
Original PR description
<b>Steps to reproduce:</b> 1) Create a flexible working schedule 2) Assign this working schedule to one of the employees 3) Create a public holiday with no calendar 4) Create a leave for the flexible…
<b>Steps to reproduce:</b> 1) Create a flexible working schedule 2) Assign this working schedule to one of the employees 3) Create a public holiday with no calendar 4) Create a leave for the flexible employee where the public holiday will be during his leave 5) Notice the duration of the leave <b>Issue:</b> Previously, leave duration did not exclude public holidays without calendars or holidays associated with a different company than the employee's when using flexible schedules. For example, if an employee took 5 days off and one of those days was a public holiday without a calendar, the system would incorrectly count all 5 days instead of excluding the public holiday. <b>Cause:</b> This issue occurs because the system only checks for public holidays with calendars during the leave period and excludes those days from the leave duration. However, if the public holiday does not have a calendar or is assigned to a different company than the employee's, it is not excluded from the leave days/hours. https://github.com/odoo/odoo/blob/7293a04bd90c26cb27669f5a1c9edd45c7e5c96c/addons/hr_holidays/models/hr_leave.py#L428-L438 <b>Fix:</b> We now exclude public holidays from the leave duration even if they do not have a calendar, as long as the holiday belongs to the same company as the leave request. opw-4711942
Users can now drag and drop files anywhere in the Documents screen, even when the view is filled with existing files. This removes a usability issue that made uploads difficult when there was little empty space available.
Original PR description
Steps: - Install `documents` - Open documents - Try to drag a file from your file explorer to documents A document can only be dragged into a free zone, i.e. not into areas of the screen where a record (file) is. This makes drag'n'drop less practical when a user has a lot of files, leaving almost no space left on the screen. opw-4699728
Fixes issues where adding, completing, or cancelling activities from the Documents kanban view did not immediately update the related chatter or could trigger an error. This makes activity handling more reliable and avoids users needing to refresh the page.
Original PR description
Case 1: How to reproduce ================ - Select a record in any folder in Kanban view - Display its chatter - Add an activity from the kanban tile --> the chatter is not updated and needs a refresh Expected behavior ================= Chatter should update instantly Case 2: How to reproduce ================ - Select a record in any folder in Kanban view - Display its chatter - Mark done or cancel one or more activities from Chatter - Click on the activity button of the related kanban record --> stack trace Expected behavior ================= Corresponding KanbanRecord should update. Note: v. 17.4 raises a missing record exception for the same case task-4690165
Miscellaneous changes
Also replace an unnecessary listcomp by a gencomp as the list is not necessary. Though all the callsites seem to go through the entire sequence so likely doesn't do much. Forward-Port-Of: odoo/odoo#213729
Original PR description
Also replace an unnecessary listcomp by a gencomp as the list is not necessary. Though all the callsites seem to go through the entire sequence so likely doesn't do much. Forward-Port-Of: odoo/odoo#213729
**Current behavior** Having multiple employees on a workorder with overlapping work intervals will result in an inaccurate valuation value. **Expected behavior:** Accurate valuation. **Steps to reproduce:** 1. Create a BOM with an operation (workorder) for a finished product which is valuated 2. Create an MO for that BOM, assign multiple employees on the workorder with various (overlapping) working intervals 3. Process the MO -> look at the valuation generated -> its value is
Original PR description
**Current behavior** Having multiple employees on a workorder with overlapping work intervals will result in an inaccurate valuation value. **Expected behavior:** Accurate valuation. **Steps to reproduce:** 1. Create a BOM with an operation (workorder) for a finished product which is valuated 2. Create an MO for that BOM, assign multiple employees on the workorder with various (overlapping) working intervals 3. Process the MO -> look at the valuation generated -> its value is too high (because it counted the overlapping work intervals) **Cause of the issue** A workorder's resource intervals are currently just naively summed. **Fix** Use the `Intervals` class to find the union of all resources in a workorder. opw-4430375 Forward-Port-Of: odoo/odoo#205154
Description of the issue/feature this PR addresses: When fetching videos from vimeo, if the video is deleted, an error is shown to the user which also block test `test_snippet_background_video`. Current behavior before PR: 1. Install website 2. Start `website_snippet_background_video` tour 3. You'll get an error if a video is missing Desired behavior after PR is merged: Now, with the error handling, a warning will be simply outputed for the missing video instead of a blocking mess
Original PR description
Description of the issue/feature this PR addresses: When fetching videos from vimeo, if the video is deleted, an error is shown to the user which also block test `test_snippet_background_video`. Current behavior before PR: 1. Install website 2. Start `website_snippet_background_video` tour 3. You'll get an error if a video is missing Desired behavior after PR is merged: Now, with the error handling, a warning will be simply outputed for the missing video instead of a blocking message --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213297 Forward-Port-Of: odoo/odoo#210307
Versions -------- - 17.0+ Steps ----- 1. Create a Stripe transaction; 2. check server logs. Issue ----- The `client_secret` value gets logged, Stripe documentation says this value should not be stored or logged[^1]. [^1]: https://docs.stripe.com/api/payment_intents/object#payment_intent_object-client_secret Cause ----- Currently we're just raw-logging the processing values. Solution -------- Add a `_get_specific_secret_keys` method to `payment.transaction`, to be used w
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Create a Stripe transaction; 2. check server logs. Issue ----- The `client_secret` value gets logged, Stripe documentation says this value should not be stored or logged[^1]. [^1]: https://docs.stripe.com/api/payment_intents/object#payment_intent_object-client_secret Cause ----- Currently we're just raw-logging the processing values. Solution -------- Add a `_get_specific_secret_keys` method to `payment.transaction`, to be used when logging processing values that may contain secret information. Also mute the logger when redirecting to `/payment/status` from Stripe, as the `client_secret` would otherwise be logged by `werkzeug`. opw-4818301 Forward-Port-Of: odoo/odoo#211979
**Problem:** When a kit sale order is created with a package for the kit product, inside the delivery for the component of the BOM the package is the package of the kit product **Steps to reproduce:** - Inside Settings/Sales activate the "Product Packagings" setting - Create a new product (the final product) - Inside the inventory tab add a packaging line for a pack of 9 units - Create a new product (the comp product) - In the general information tab, set a unit of mesure of g - In
Original PR description
**Problem:** When a kit sale order is created with a package for the kit product, inside the delivery for the component of the BOM the package is the package of the kit product **Steps to…
**Problem:** When a kit sale order is created with a package for the kit product, inside the delivery for the component of the BOM the package is the package of the kit product **Steps to reproduce:** - Inside Settings/Sales activate the "Product Packagings" setting - Create a new product (the final product) - Inside the inventory tab add a packaging line for a pack of 9 units - Create a new product (the comp product) - In the general information tab, set a unit of mesure of g - In the inventory tab add a packaging line for a pack of 0.9 g - Set an on hand quantity for the comp product - Create a new BOM for the final product - Add a a line with the comp product for a quantity of 0.1 g - Select kit - Create a new quotation and select your kit product - Select your packaging > Confirm - Click on the delivery smart button - In the operations tab change the packaging of the stock move to the packaging of the comp - validate and print **Current behavior:** An error message appears **Cause of the issue:** When _compute_packaging_qtys calls _compute_qty (the method of the product.packaging model): bom_id.product_uom_qty is the uom of the final product (here: Units) but line['packaging'] is the packaging of the comp that we set manually on the stock move https://github.com/odoo/odoo/blob/8244b0bcdb470ff6eb95e2613903fb9175f2c435/addons/mrp/models/stock_move.py#L116 So inside _compute_qty, when _compute_qty (the method of the uom.uom model) is called, qty_uom is Units and self.product_uom_id is g https://github.com/odoo/odoo/blob/8244b0bcdb470ff6eb95e2613903fb9175f2c435/addons/product/models/product_packaging.py#L79 which triggers an error inside _compute_qty https://github.com/odoo/odoo/blob/8244b0bcdb470ff6eb95e2613903fb9175f2c435/addons/uom/models/uom_uom.py#L223-L227 opw-4781180 Forward-Port-Of: odoo/odoo#210540
Adds a test to ensure the Sales Details report computes the correct total base amount when products with multiple taxes are sold. This test covers a previously incorrect behavior where the base amount was summed multiple times for products with multiple tax lines, leading to inflated totals. Now, the report uses the accurate tax-excluded total to avoid duplication. Opw-4670643. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: o
Original PR description
Adds a test to ensure the Sales Details report computes the correct total base amount when products with multiple taxes are sold. This test covers a previously incorrect behavior where the base amount was summed multiple times for products with multiple tax lines, leading to inflated totals. Now, the report uses the accurate tax-excluded total to avoid duplication. Opw-4670643. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#203289
Exported the SignatureForm class to allow overriding from other modules. Forward-Port-Of: odoo/odoo#213510
Original PR description
Exported the SignatureForm class to allow overriding from other modules. Forward-Port-Of: odoo/odoo#213510
This error occurs when attempting to create a submenu item under a menu item. Steps to reproduce: - Go to `menu items`. - Click `New` > In `Submenus` click `Add a line` `TypeError: unsupported operand type(s) for +: 'bool' and 'str'` This error occurs when attempting to create a submenu item under a menu item that does not have a name. Since the menu item record has not been saved yet, the system assigns a new ID to the menu item and sets its name to False. When computing the comp
Original PR description
This error occurs when attempting to create a submenu item under a menu item. Steps to reproduce: - Go to `menu items`. - Click `New` > In `Submenus` click `Add a line` `TypeError: unsupported…
This error occurs when attempting to create a submenu item under a menu item. Steps to reproduce: - Go to `menu items`. - Click `New` > In `Submenus` click `Add a line` `TypeError: unsupported operand type(s) for +: 'bool' and 'str'` This error occurs when attempting to create a submenu item under a menu item that does not have a name. Since the menu item record has not been saved yet, the system assigns a new ID to the menu item and sets its name to False. When computing the complete name for the submenu item, the menu(parent menu) item's name is False, which causes the error. https://github.com/odoo/odoo/blob/d2ea23f252f0f8f329e2b0ff96de6ee2a14b922f/odoo/addons/base/models/ir_ui_menu.py#L56 This commit ensures that if the parent menu item record has not been saved and its name is False, an empty string is used in its place. sentry-6368548342 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210291
Description of the issue/feature this PR addresses: The system enforced a strict check that the delivery carrier partner must be located in Romania. This was limiting for companies that work with international carriers or operate across borders. Current behavior before PR: Delivery carriers not based in Romania triggered an error and could not be used in the delivery process. Desired behavior after PR is merged: Delivery carriers can now be located in any country. This provides greater
Original PR description
Description of the issue/feature this PR addresses: The system enforced a strict check that the delivery carrier partner must be located in Romania. This was limiting for companies that work with international carriers or operate across borders. Current behavior before PR: Delivery carriers not based in Romania triggered an error and could not be used in the delivery process. Desired behavior after PR is merged: Delivery carriers can now be located in any country. This provides greater flexibility in managing logistics and integrating international shipping partners. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212476
**Steps to reproduce:** - Install base_vat and website_sale - Execute the following steps as a public user - From website, go to the Shop - Add a product to the cart - Proceed to checkout - Enter an address in Romania - Enter a valid CUI as VAT (e.g. 8001011234567) - Validate the address - Edit the address to see the issue **Issue:** The country code (i.e. RO) has been prepended to the input VAT, which is not correct. If the Romanian localization is installed and an invoice is crea
Original PR description
**Steps to reproduce:** - Install base_vat and website_sale - Execute the following steps as a public user - From website, go to the Shop - Add a product to the cart - Proceed to checkout - Enter an…
**Steps to reproduce:** - Install base_vat and website_sale - Execute the following steps as a public user - From website, go to the Shop - Add a product to the cart - Proceed to checkout - Enter an address in Romania - Enter a valid CUI as VAT (e.g. 8001011234567) - Validate the address - Edit the address to see the issue **Issue:** The country code (i.e. RO) has been prepended to the input VAT, which is not correct. If the Romanian localization is installed and an invoice is created from the order and sent to the government, it will be rejected because of the incorrect VAT. **Solution:** Romania can accept the CUI as tax identifier. The CUI only contains digits. When formatting the VAT from Romania, the country code will not be prepended automatically. To reduce the effect of the fix, the code prepend will only be skipped if the country of the customer is the same than the country of the website. opw-4655064 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211693
Problem: When a video is added to the `website_description` field using the website editor, it appears visually shifted to the left (by 50%) when viewed from the Contacts page in the "Website Partner Full Description" field. Cause: The class `o-position-absolute` sets `left: auto` which was evaluated as `50%`, and`margin-left: -50%` was added to center absolutely positioned elements. However, this causes issues when rendered in `html_field` context, where `left: auto` evaluates to `0px`. As
Original PR description
Problem: When a video is added to the `website_description` field using the website editor, it appears visually shifted to the left (by 50%) when viewed from the Contacts page in the "Website Partner…
Problem: When a video is added to the `website_description` field using the website editor, it appears visually shifted to the left (by 50%) when viewed from the Contacts page in the "Website Partner Full Description" field. Cause: The class `o-position-absolute` sets `left: auto` which was evaluated as `50%`, and`margin-left: -50%` was added to center absolutely positioned elements. However, this causes issues when rendered in `html_field` context, where `left: auto` evaluates to `0px`. As a result, the `-50%` margin shifts the video offscreen. Solution: Set both `left` and `right` to `0` in `.o-position-absolute` to ensure proper centering. Remove `margin-left: -50%` to prevent misalignment in non-editor contexts. **Before**: In website editor:  In contacts (html_field):  **After** In website editor:  In contacts (html_field):  Steps to reproduce: - Go to Contacts > "Gemini Furniture". - Add a video in the "Website Partner Full Description" field. - Save and open the partner on the website (`partners/gemini-furniture-11`). - Return to the Contacts page. → The video appears shifted 50% to the left. opw-4752567 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212344
- Install l10n_it_edi. - Install l10n_it_edi_withholding - Uninstall l10n_it_edi_withholding - Attempt an install of l10n_it_edi_withholding The following error appears: Invoice and credit note distribution should each contain exactly one line for the base. When uninstalling l10n_it_edi_withholding, the account.tax data are not unlinked which causes issues when _l10n_it_edi_withholding_post_init tries to _load_data with them. This commit prevents already existing account tax from bei
Original PR description
- Install l10n_it_edi. - Install l10n_it_edi_withholding - Uninstall l10n_it_edi_withholding - Attempt an install of l10n_it_edi_withholding The following error appears: Invoice and credit note distribution should each contain exactly one line for the base. When uninstalling l10n_it_edi_withholding, the account.tax data are not unlinked which causes issues when _l10n_it_edi_withholding_post_init tries to _load_data with them. This commit prevents already existing account tax from being loaded from data during the installation. Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4798659) opw-4798659 Forward-Port-Of: odoo/odoo#211910
Currently the signature of function `_notify_by_email_prepare_rendering_context` in `account_peppol` is not compatible with all ways to call the super function. This can lead to code breaking when `account_peppol` is installed (although it works fine without). This is fixed in this commit. Detail: In module `mail` the (super) function has signature ```python def _notify_by_email_prepare_rendering_context(self, message, msg_vals=False,
Original PR description
Currently the signature of function `_notify_by_email_prepare_rendering_context` in `account_peppol` is not compatible with all ways to call the super function. This can lead to code breaking when…
Currently the signature of function `_notify_by_email_prepare_rendering_context` in `account_peppol` is not compatible with all ways to call the super function. This can lead to code breaking when `account_peppol` is installed (although it works fine without).
This is fixed in this commit.
Detail:
In module `mail` the (super) function has signature
```python
def _notify_by_email_prepare_rendering_context(self, message, msg_vals=False,
model_description=False,
force_email_company=False,
force_email_lang=False):
```
Currently in `acccount_peppol` the signature is
```python
def _notify_by_email_prepare_rendering_context(self, message, **kwargs):
```
The super function can be called as follows while the function in `account_peppol` can not.
```python
_notify_by_email_prepare_rendering_context(self, message, msg_vals)
```
opw-4846106
Forward-Port-Of: odoo/odoo#213516The E-way Bill date was previously displayed in the `YYYY-MM-DD` format. ---- **In this commit** - This change updates the date formatting logic to display dates in the `DD/MM/YYYY` format for better readability and consistency in ewaybill report. --- task-4807690 Forward-Port-Of: odoo/odoo#210583
Original PR description
The E-way Bill date was previously displayed in the `YYYY-MM-DD` format. ---- **In this commit** - This change updates the date formatting logic to display dates in the `DD/MM/YYYY` format for better readability and consistency in ewaybill report. --- task-4807690 Forward-Port-Of: odoo/odoo#210583
Current behaviour: --- When displaying a malaysian address on an invoice, the state code is shown. Street 12 Cityname KTN 12345 Malaysia In 17.0 and after, KTN is replaced by MY-03 (and other state codes) per ISO standards KUL -> MY-14, PHG -> MY-06, etc. https://github.com/odoo/odoo/commit/a8204fcf6f919cfa85411f96c11c247e1d0a6f35 Expected behaviour: --- The state name should be displayed instead. Street 12 Cityname Kelantan 12345 Malaysia Steps to reproduce: --- 1. G
Original PR description
Current behaviour: --- When displaying a malaysian address on an invoice, the state code is shown. Street 12 Cityname KTN 12345 Malaysia In 17.0 and after, KTN is replaced by MY-03 (and other state codes) per ISO standards KUL -> MY-14, PHG -> MY-06, etc. https://github.com/odoo/odoo/commit/a8204fcf6f919cfa85411f96c11c247e1d0a6f35 Expected behaviour: --- The state name should be displayed instead. Street 12 Cityname Kelantan 12345 Malaysia Steps to reproduce: --- 1. Go to Contacts 2. Create a new contact 3. Set country as Malaysia, and choose a state 4. Go to Invoice, create one 5. Select new malaysian contact 6. State code in address instead of name Fix: --- Added a custom address_format in res_country_data.xml opw-4762300 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212316
Problem: Given that the fields for the salary rules has already been generated for the current country set on the salary structure, an error occurs when accessing the payroll reporting records after the user changes the country because the payroll reporting records will reference a different field name. The outdated fields will not properly unlink, new fields won't be generated based on the new country set, but the payroll report will reference the new field name. Purpose: When changing the c
Original PR description
Problem: Given that the fields for the salary rules has already been generated for the current country set on the salary structure, an error occurs when accessing the payroll reporting records after…
Problem: Given that the fields for the salary rules has already been generated for the current country set on the salary structure, an error occurs when accessing the payroll reporting records after the user changes the country because the payroll reporting records will reference a different field name. The outdated fields will not properly unlink, new fields won't be generated based on the new country set, but the payroll report will reference the new field name. Purpose: When changing the country on a salary structure, the rules that appears on the payroll reporting needs to unlink outdated fields and regenerate the fields based on the new country value. The salary rule fields are dependent on the country due to its naming convention. Steps to Reproduce on Runbot: 1. Install Payroll 2. Create a new salary structure with no country 3. Create a new salary rule and enable "View in Payroll reporting" 4. Check fields and observe that a field prefixed by 'x_l10n_xx' was created 5. Change the country set on the salary structure 6. Try to access a payroll report record and a traceback is thrown opw-4649030 Forward-Port-Of: odoo/enterprise#87057 Forward-Port-Of: odoo/enterprise#83749
Test coverage for community-side diff about calculating a workcenter's cost in a way that omits counting duration within a working interval that was previously counted. opw-4430375 Forward-Port-Of: odoo/enterprise#81701
Original PR description
Test coverage for community-side diff about calculating a workcenter's cost in a way that omits counting duration within a working interval that was previously counted. opw-4430375 Forward-Port-Of: odoo/enterprise#81701
**Before this commit:** - Submitting a GSTR-1 return to the GST portal with an empty `hsn` dictionary caused a schema validation error from the portal: {"error_msg": "Error in Json structure validation.", "error_cd": "RET191106"} - This occurred because the generated JSON included the `hsn` key with an empty dictionary, which is invalid as per government schema requirements. - The portal expects the `hsn` field to be absent if no data is available, or to contain valid nested keys an
Original PR description
**Before this commit:**
- Submitting a GSTR-1 return to the GST portal with an empty `hsn` dictionary
caused a schema validation error from the portal:
{"error_msg": "Error in Json structure validation.", "error_cd": "RET191106"}
- This occurred because the generated JSON included the `hsn` key with an
empty dictionary, which is invalid as per government schema requirements.
- The portal expects the `hsn` field to be absent if no data is available, or to
contain valid nested keys and values.
**After this commit:**
- A `ValidationError` is raised when attempting to send a GSTR-1 return with no
HSN data, preventing the generation and submission of an invalid JSON payload.
- This ensures that the `hsn` field is only added to the payload when it contains
at least one section with data.
- Helps avoid unnecessary submission failures and improves user feedback at the
point of action.
task - 4807628
Forward-Port-Of: odoo/enterprise#86655The certification reports for Colombian withholdings (Fuente, ReteIVA, ReteICA) incorrectly referenced the current year (i.e., the year when the report is generated) as the "año gravable" in the certificate body: "Durante el año gravable de 2025..." This caused a mismatch when generating certificates for the previous fiscal period (e.g., 2024), especially when the user filtered movements from a prior year. This change ensures that the "año gravable" corresponds to the selected period ye
Original PR description
The certification reports for Colombian withholdings (Fuente, ReteIVA, ReteICA) incorrectly referenced the current year (i.e., the year when the report is generated) as the "año gravable" in the…
The certification reports for Colombian withholdings (Fuente, ReteIVA, ReteICA) incorrectly referenced the current year (i.e., the year when the report is generated) as the "año gravable" in the certificate body: "Durante el año gravable de 2025..." This caused a mismatch when generating certificates for the previous fiscal period (e.g., 2024), especially when the user filtered movements from a prior year. This change ensures that the "año gravable" corresponds to the selected period year, taken from the date_from filter in the report wizard, which reflects the actual accounting or fiscal period being certified. Justification According to Colombian tax practices and DIAN guidelines, the "año gravable" mentioned in retention certificates must match the period in which the income or payment was made and the tax was withheld. Using the current date instead of the actual reporting period could lead to confusion or even legal inconsistencies during audits. Reference: Estatuto Tributario Art. 378: Certificates must include the fiscal year in which the withholding was applied. Common practice requires companies to issue certificates reflecting the year of the transactions, not the year of report generation. Forward-Port-Of: odoo/enterprise#86838
Previously, the link used by the “test_winbooks_import” test to download sample data (PARFILUX) from Winbooks was unavailable. This commit changes the url to use directly Winbooks server instead of Amazon, which will allow the test to run without any problem. Forward-Port-Of: odoo/enterprise#87090
Original PR description
Previously, the link used by the “test_winbooks_import” test to download sample data (PARFILUX) from Winbooks was unavailable. This commit changes the url to use directly Winbooks server instead of Amazon, which will allow the test to run without any problem. Forward-Port-Of: odoo/enterprise#87090