Daily updates from Odoo
Tuesday, January 27, 2026
20 changes · 18.0
Enhancements to existing features
This update enhances the system administrator alerts displayed in Odoo Enterprise. It now allows for more flexible message formatting, including multiple alerts with different severity levels, improving communication about server maintenance and other important notifications. This change provides administrators with greater control over how critical information is presented.
Original PR description
Tweak #102239 to allow more flexibility and display multiple messages with different alert level.
The ir.config_parameter is sysadmin.message and should be a json loadable. The format shoud be something like this:
{
"replace": false,
"warning_type": "user",
"message": "<div class='alert alert-info'>A maintenance operation is planned on your server on <strong>2026-01-15</strong> between 14h and 15h</div>"
}
Forward-Port-Of: odoo/enterprise#105157Resolved issues and error corrections
This update fixes an issue where the tour pointer was appearing in unwanted locations, like above dialogs, creating a cluttered user experience. Now, the pointer is hidden when it's not directly linked to the active element, resulting in a cleaner and more focused tour experience.
Original PR description
POC for task-5490670 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 update resolves a critical issue preventing upgrades for the Dutch accounting module (l10n_nl) due to a conflict between fiscal position creation and account setup. Setting `force_create=True` allows the upgrade to proceed without errors related to missing Dutch accounts. Further investigation suggests this change is a temporary solution while the root cause of the account creation problem is addressed.
Original PR description
`force_create` must be `True` because there are fiscal positions being created that assume the existence of some Dutch accounts. If these accounts don't exist, the ORM will attempt to create fiscal…
`force_create` must be `True` because there are fiscal positions being created that assume the existence of some Dutch accounts. If these accounts don't exist, the ORM will attempt to create fiscal positions with `NULL` values in columns that require `NOT NULL`.
I am still looking into why the fiscal positions are created, while accounts aren't, but I found that setting `force_create=True` solves the problem. Given the argumentation behind having it set to `False`:
> The goal is that we do not need to be more accurate on what we need to update when updating the CoA
(https://github.com/odoo/odoo/commit/a3c57b4f0198236b04486d336d56b25de74677b8)
I believe we can safely set it `True` in order to unblock numerous failing upgrades, for now.
Moreover, I suspect that further investigation into this issue will show that we shouldn't be setting `force_create=False`, ever, therefore rendering the newly introduced argument redundant.
Example traceback from [upg-2736856](https://upgrade.odoo.com/web#id=2736856&cids=1&model=upgrade.request&view_type=form&menu_id=107):
```
Traceback (most recent call last):
File "/home/odoo/src/odoo/18.0/odoo/service/server.py", line 1321, in preload_registries
registry = Registry.new(dbname, update_module=update_module)
File "<decorator-gen-13>", line 2, in new
File "/home/odoo/src/odoo/18.0/odoo/tools/func.py", line 97, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/18.0/odoo/modules/registry.py", line 127, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/src/odoo/18.0/odoo/modules/loading.py", line 515, in load_modules
migrations.migrate_module(package, 'end')
File "/home/odoo/src/odoo/18.0/odoo/modules/migration.py", line 254, in migrate_module
mod.migrate(self.cr, installed_version)
File "/home/odoo/src/odoo/18.0/addons/l10n_nl/migrations/3.4/end-migrate.py", line 7, in migrate
env['account.chart.template'].try_loading('nl', company, force_create=False)
File "/home/odoo/src/odoo/18.0/addons/account/models/chart_template.py", line 160, in try_loading
return self._load(template_code, company, install_demo, force_create)
File "/home/odoo/src/odoo/18.0/addons/account/models/chart_template.py", line 227, in _load
self._load_data(data)
File "/tmp/tmpw4wedv5j/migrations/account/0.0.0/pre-ensure-deferred-accounts.py", line 36, in _load_data
return super()._load_data(data, *args, **kwargs)
File "/home/odoo/src/odoo/18.0/addons/account/models/chart_template.py", line 653, in _load_data
created_records[model] = self.with_context(lang='en_US').env[model]._load_records(all_records_vals, ignore_duplicates=ignore_duplicates)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5489, in _load_records
data['record']._load_records_write(data['values'])
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5407, in _load_records_write
self.write(values)
File "/home/odoo/src/odoo/18.0/addons/base_vat/models/account_fiscal_position.py", line 19, in write
return super().write(vals)
File "/home/odoo/src/odoo/18.0/addons/account/models/partner.py", line 196, in write
return super(AccountFiscalPosition, self).write(vals)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4794, in write
field.write(self, value)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 4508, in write
self.write_batch([(records, value)])
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 4529, in write_batch
self.write_real(records_commands_list, create)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 4725, in write_real
flush()
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 4680, in flush
comodel.create(to_create)
File "<decorator-gen-120>", line 2, in create
File "/home/odoo/src/odoo/18.0/odoo/api.py", line 496, in _model_create_multi
return create(self, arg)
File "/tmp/tmpw4wedv5j/migrations/util/orm.py", line 248, in wrapper
return f(*args, **kwargs)
File "/tmp/tmpw4wedv5j/migrations/base/0.0.0/pre-models-match_uniq.py", line 25, in create
return super().create(vals_list)
File "<decorator-gen-31>", line 2, in create
File "/home/odoo/src/odoo/18.0/odoo/api.py", line 496, in _model_create_multi
return create(self, arg)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5020, in create
records = self._create(data_list)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5204, in _create
cr.execute(SQL(
File "/home/odoo/src/odoo/18.0/odoo/sql_db.py", line 354, in execute
res = self._obj.execute(query, params)
psycopg2.errors.NotNullViolation: null value in column "account_src_id" of relation "account_fiscal_position_account" violates not-null constraint
DETAIL: Failing row contains (16, 4, 1, null, null, 1, 1, 2025-04-07 06:42:17.6166, 2025-04-07 06:42:17.6166).
```This update resolves a problem where custom tax groups (beyond the standard 6) were causing efaktur printing errors. The fix ensures that efaktur printing works correctly with user-defined tax groups, while also correcting how tax values are calculated for invoices with mixed tax groups.
Original PR description
Description of the issue/feature this PR addresses: This issue occured because in the previous update we add a condition to restrict multiple tax groups excluding the STLG. Apparently there is a case…
Description of the issue/feature this PR addresses: This issue occured because in the previous update we add a condition to restrict multiple tax groups excluding the STLG. Apparently there is a case where some users create their own tax groups (for example for PPH) so when they want to print an efaktur it will raise an error. Current behavior before PR: If a user create their own tax with a new tax group (outside of the 6 groups defined in `l10n_id`) and use it in invoice line along with one of the 6 tax groups excluding the STLG then it will blocked the print efaktur because it will raise an error Desired behavior after PR is merged: - The restriction in tax groups only applied for the 6 tax groups in l10n_id so if an invoice line has multiple tax groups as long as there no more than one of the 6 tax groups excluding the STLG then it should be able to print the efaktur. - Also when building the efaktur coretax value, the new tax group should not be included in the regular_tax variable which will cause the value to be 11/12 of the original value. - Add new condition to block the print efaktur if there is a tax inside the invoice but none of it belong to the 6 ppn tax groups (there is already a condition to block if no tax is given, but now since there are cases where they use tax group outside of the defined tax groups then it will print the efaktur) - If an invoice line does not have any ppn_tax_groups but there are other line in the same invoice that has it then it will still be able to print the efaktur, but the line without the ppn tax will have the OtherTaxBase and VATRate set to zero which will calculate the VAT as 0 too. [5434656](https://www.odoo.com/odoo/project.task/5434656) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241979
This update fixes an error in the Time Off Balance report that was incorrectly calculating remaining leave days. The report previously aggregated allocations across different periods, leading to inaccurate balances. The fix ensures allocations are correctly deducted only when taken within the same period, improving report accuracy.
Original PR description
The balance report aggregates allocations regardless of the period in which they occur resulting in wrong information when an employee has two allocations in different periods and a filter is used in the report Steps to reproduce: 1. Install Time Off app 2. Open Time Off app and go to Management > Allocations 3. Create a new allocation of 100 days for employee "Mitchell Admin" of time off type "Paid Time Off" with a validity period from 01/01/2027 to 31/12/2027 and approve it 4. Go to Reporting > Balance 5. The number of days left for "Mitchell Admin" for "Paid Time Off" is 120 days even though the default filter is on the period of 2026 Solution: Subtract leaves taken from allocations only if they take place in the same period opw-5156142
This update prevents the deletion of attachments from email templates when removed from the mail composer. Previously, removing an attachment resulted in it being permanently lost, impacting future email communications. The fix ensures attachments remain associated with their templates, maintaining data integrity.
Original PR description
**Step to reproduce:** 1. Install `sale_management` 2. Open any email template (e.g., Sale: Order Confirmation). 3. Add an attachment to it 4. Create a Sale Order, confirm it, and click "Send by…
**Step to reproduce:** 1. Install `sale_management` 2. Open any email template (e.g., Sale: Order Confirmation). 3. Add an attachment to it 4. Create a Sale Order, confirm it, and click "Send by Email". 5. In the mail composer, remove the template attachment **Issue:** - The removed attachment is deleted from the database (`ir.attachment`). Consequently, the attachment is permanently removed from the source Email Template and will not appear in future emails. **Cause:** - The `onFileRemove` function in `MailComposerAttachmentList` calls the `unlink` method of the `attachmentUploadService` for every file removed, without considering the existing template attachment. **Solution:** 1. Update `mailComposerAttachmentList` to include `res_model` in `relatedFields` so it is fetched from the server. 2. In `onFileRemove`, check the `res_model` of the attachment. 3. If the `res_model` is not "mail.compose.message", skip the database deletion (unlink) and only remove it from the composer view. opw-5163679
This update fixes an issue where loyalty discounts weren't correctly shared between restaurant sessions. The change removes unnecessary data to prevent errors during order validation and payment, ensuring discounts are applied consistently across all sessions. This improves the customer experience and accuracy of loyalty rewards.
Original PR description
Steps: - Install `pos_restaurant_loyalty` - Create a discount for example: if 2 coca -> 10% - Open a restaurant session - Open another restaurant session with the same user in incognito - Add 2 coca…
Steps: - Install `pos_restaurant_loyalty` - Create a discount for example: if 2 coca -> 10% - Open a restaurant session - Open another restaurant session with the same user in incognito - Add 2 coca + sushi in session 1 and press "Order" - In session 2 products are automatically added, in live - Try to validate the order from session 2 - Traceback Traceback is due to the fact that, in order to synchronize, session 1 must send data to the server, which in turn sends further data to all sessions. The problem is that as coupons are only created once the order has been validated, they are not yet “really created” on the customer side. To avoid sending “invalid” records, we remove them from the data via an override of the `serialize` method in `Base`. But since python doesn't receive coupons, it can't send coupons to other sessions, so if we try to pay with the session that didn't initially get the discount, it will cause a traceback. The solution is to remove `is_reward_line` as well. Because it already makes no sense to have a `PosOrderLine` which is a reward line without a coupon, and then because it will regenerate the discounts in the new session. opw-4892767
This update fixes an error in the SYSCOHADA Profit and Loss report that resulted in incorrect gross margin calculations. The report was incorrectly adding instead of subtracting RA from TA, leading to inaccurate financial reporting. This ensures the report aligns with the official SYSCOHADA guidelines.
Original PR description
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It…
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It is TA (701) - RA (601) +/- RB (6031). TA and RA should always be positive and negative, respectively.
In the report "Profit and Loss (SYSCOHADA)", the line RA is negated. XA then subtracts this value from TA, adding the two values instead of subtracting them.
Steps to reproduce:
1. Create a new company on runbot.
2. In Accounting > Configuration > Settings, set their Fiscal Localization to Ginea - SYSCOHADA for Companies.
3. Make a MISC journal entry.
1. Set a credit of 110,000,000 on account 701100 and balance it with 411100.
5. Set a debit of 75,000,000 on account 601100 and balance it with 401100.
6. Set a credit of 5,000,000 on account 603100 and balance it with 411100.
7. Post the entry.
8. Navigate to Accounting > Reports > Profit and Loss.
9. Set the l10n version, Profit and Loss (SYSCOHADA).
10. Set the current date.
11. See XA = 110 million + 75 million + 5 million = 190 million; this does not match the example given on pg 357 of Guide-d-application-du-SYSCOHADA.pdf, where XA = 40 million.
[opw-5482300](https://www.odoo.com/odoo/project.task/project.task/5482300)
Forward-Port-Of: odoo/enterprise#104479This update corrects a bug in the automatic currency rate system. The BNB now provides exchange rates in EUR, and this change ensures that companies using EUR as their main currency can correctly sync exchange rates. Companies using BGN will also experience the same error, as expected.
Original PR description
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the…
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the BNB now provides rates against EUR. This caused the error "Your main currency (EUR) is not supported by this exchange rate provider" when Bulgarian companies with EUR as their main currency tried to sync exchange rates. refs: We can compare the data here from 31 December using the WayBackMachine: https://web.archive.org/web/20251231193558/https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm Compared to today: https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm And see the comparison used to be to BGN but is now for EUR Steps To Reproduce: 1. Create a company for Bulgaria with EUR as the main currency. 2. Go to Accounting Settings -> Automatic Currency Rates. 3. Select "[BG] Bulgaria National Bank" as the service provider. 4. Click the sync button. 5. Error appears: "Your main currency (EUR) is not supported by this exchange rate provider. Please choose another one." The fix updates the base currency from BGN to EUR, matching the current BNB XML format which now provides rates against EUR. Note: Companies with BGN as main currency will now get the same error, which is expected since the BNB no longer provides BGN-based rates. This behavior was discussed and confirmed with the PO. Ticket [link](https://www.odoo.com/odoo/project.task/5483771) opw-5483771 Forward-Port-Of: odoo/enterprise#105074
This update resolves an access issue preventing administrators from viewing serial numbers linked to sales orders. Previously, restrictions on user permissions caused errors when calculating the number of sales orders associated with a serial number. This change ensures all users, regardless of their sales order ownership, can access this critical inventory information.
Original PR description
Steps to reproduce the bug - Create a storable product P1: - Tracking: Serial Number - Log in as Marc Demo - Create a sales order with 1 unit of P1 - Validate the delivery using serial number SN1 -…
Steps to reproduce the bug
- Create a storable product P1:
- Tracking: Serial Number
- Log in as Marc Demo
- Create a sales order with 1 unit of P1
- Validate the delivery using serial number SN1
- Log in as Mitchell Admin
- Go to Settings:
- Manage Users
- Mitchell Admin
- Sales: User: own documents only
- Go to the Serial Numbers list view:
- Try to open SN1
**Problem:**
An access error is triggered:
```
Uh-oh! Looks like you have stumbled upon some top-secret records.
Sorry, Mitchell Admin (id=2) doesn't have 'read' access to:
- Sales Order Line, S00025 - P1 (Deco Addict) (sale.order.line: 51)
Blame the following rules:
- Personal Order Lines
```
When clicking on SN1, the `stock.lot` form view.
it's contains the field "sale_order_count", which is a computed field that needs to access all `sale.order` records using the serial number in order to compute the count.
Since Mitchell Admin is restricted to his own sales orders only, an access error is raised during the computation.
There is also a many2many view widget that triggers an access errors. This widget can be removed since the smart button is now available. The widget has already been removed in v19.
**Solution:**
In this view, any stock user, admin or not, must be able to see how many sales orders use a given serial number, regardless of whether those sales orders belong to them or not.
opw-5400731This update fixes a bug where the Delivery Date wasn't appearing on the DIN 5008 sale order report and its preview. The change ensures that this critical date is now correctly displayed, as confirmed by functional experts, allowing for accurate reporting according to DIN 5008 standards. This improves data visibility for sales and accounting processes.
Original PR description
**Steps to reproduce:** 1. Install modules `sale_management` and `l10n_din5008_sale` 2. Go to Settings, Configure Document Layout and set layout to DIN 5008 3. Create a new Sale Order 4. Set a…
**Steps to reproduce:** 1. Install modules `sale_management` and `l10n_din5008_sale` 2. Go to Settings, Configure Document Layout and set layout to DIN 5008 3. Create a new Sale Order 4. Set a customer, add a product, and fill in the Delivery Date (Other Info) 5. Click on Print and Preview **Issue:** The Delivery Date (commitment_date) is not displayed on: - The DIN 5008 sale order report - The sale order preview (portal view) Functional experts confirmed that the Delivery Date must be visible when using the DIN 5008 layout. **Cause:** The `commitment_date` field was not included in the DIN 5008 sale order report template nor in the preview view. **Solution:** This commit adds the Delivery Date information to: - The DIN 5008 sale order report template - The sale order portal/preview view **opw-5490651** **Before:** <img width="560" height="145" alt="image" src="https://github.com/user-attachments/assets/fb29cda1-d668-4682-aa04-12c613f248d8" /> <img width="861" height="268" alt="image" src="https://github.com/user-attachments/assets/615f259f-e0ff-4fb5-9852-1fdd75cda4c9" /> **After:** <img width="589" height="145" alt="image" src="https://github.com/user-attachments/assets/3f1a8d25-783a-4600-b07e-11b547bb326b" /> <img width="824" height="271" alt="image" src="https://github.com/user-attachments/assets/46b37469-5c72-4556-95e2-eaea0824c166" />
This update prevents users from selecting payment method lines from archived journals when creating or editing contacts. Previously, users could inadvertently use outdated payment methods. Now, archiving a journal automatically removes it from the selectable options, simplifying journal management and preventing data inconsistencies.
Original PR description
**Description of the issue/feature this PR addresses:** When selecting a payment method line on a contact, lines related to journals still appear even if the journal has been archived. This can lead…
**Description of the issue/feature this PR addresses:**
When selecting a payment method line on a contact, lines related to journals still appear even if the journal has been archived. This can lead to the accidental use of payment method lines that should no longer be available. There should be no need to delete payment method lines when archiving a journal; doing so causes a loss of configuration if the journal is reactivated later, and leads to data duplication when having to recreate them.
**Current behavior before PR:**
When selecting a payment method line on a contact, lines from archived journals are still visible. Currently, payment method lines must be manually deleted from archived journals to prevent them from appearing in the selection list.
Payment Method Line domain doesn't include `('journal_id.active', '=', True)` domain part.
**Desired behavior after PR is merged:**
Archiving a journal is now sufficient to stop its payment method lines from appearing as selectable options on contacts.
https://www.loom.com/share/05981419c7dd4584b67d27d84e27892a
OPW-5413309 MT-13011 @moduon @rafaelbn @EmilioPascual @Gelojr @yajo please review if you want 😄
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update corrects a bug in the l10n_es_edi_facturae module that resulted in incorrect tax calculations when negative amounts (like discounts) were used on invoices. The previous fix introduced an issue where the absolute value of amounts was incorrectly applied, leading to inaccurate VAT and withholding tax totals. This change ensures accurate tax calculations for all invoice scenarios, including those with discounts.
Original PR description
Issue: When using negative amounts, for example to explicitly show a discount, the tax calculation is incorrect due to the application of the `abs` function. Furthermore, the way to find out if a tax…
Issue:
When using negative amounts, for example to explicitly show a discount, the tax calculation is incorrect due to the application of the `abs` function. Furthermore, the way to find out if a tax is of the withholding type is based on the sign of the value, which can lead to error in these cases.
Cause:
A previous change (#237235) added the `abs` function so the `TotalTaxesWithheld` would be always with positive value. But this also affects the calculation of taxes `TotalTaxOutputs` in some cases, such as if the invoice line has negative values.
Steps to reproduce:
- Install `l10n_es_edi_facturae`
- With the ES company, create an invoice with some standard lines and one line with negative amounts, as an explicit discount
- Confirm the invoice and send (facturae)
- Open the XML attached in the chatter
- Observe that the taxes amounts (VAT and WITHHOLDING) are erroneous
A correct invoice should be for example:
```
Product Price Taxes Amount
---------------------------------------------
PRODUCT-A 1000 21%VAT 15%WHI 1000
Discount -100 21%VAT 15%WHI -100
---------------------------------------------
Untaxed amount 900
Withholding 15% -135
VAT 21% 189
-----------------------
TOTAL 954
```
This PR replaces #240808
---
I confirm I have signed the [CLA](https://github.com/odoo/odoo/pull/157955) and read the PR guidelines at www.odoo.com/submit-prThis update resolves a performance issue in the timesheet report that prevented it from loading with large datasets. The team optimized the query by using a more efficient join method (CROSS LATERAL JOIN) to reduce the amount of data processed, resulting in a faster loading time of approximately 2 seconds. This improves the user experience for reports with many records.
Original PR description
After this commit https://github.com/odoo-dev/enterprise/commit/6c33bde74342b634d9f6fbda4ef407ffe9bac54f we introduced a new left join which seems that it slowed down the query a lot. So the report doesn't load at all if we have a lot of records. In this PR we are introducing CROSS LATERAL JOIN as we want to generate only the the relevant dates not all dates between the min starting date and max ending date of all slots. Query plan after modification https://explain.dalibo.com/plan/eh5293ba2354f43c The testing cardinality of the tables: `planning.slot` 7178 rows `hr.employee` 332 rows `resource.resource` 332 rows `resource_calendar_leaves` 4061 rows `account_analytic_line` 267376 rows `generate_series()` will produce 206417 rows | Before | After | |-----------------------------------------|-------| | Query keep being active with no results | ~2s | opw-5089052 Forward-Port-Of: odoo/enterprise#102283
This update fixes an issue where the IoT Box was incorrectly downloading standard drivers, leading to potential conflicts and outdated versions. To allow custom driver development, a checkbox was added, but this caused unnecessary duplication and the risk of reintroducing previous bugs. Now, the system avoids downloading standard drivers to ensure stability.
Original PR description
The stable IoT Box uses drivers from git repository: it doesn't download them from the database as it used to do. However, sh/on premise clients might want to develop custom drivers that the IoT Box would download. For that, they have to enable a checkbox on the IoT homepage, making the IoT Box download handlers as before. The issue is it will also download standard drivers that are already present on the IoT Box: on newer databases it would simply overwrite them, but on older ones, it would duplicate as names might have changed. Also, it would introduce issues back that were already fixed. To avoid this, we avoid adding drivers from standard modules to the downloaded archive, to prevent issues with the main ones. Forward-Port-Of: odoo/enterprise#105531
This update fixes an issue where the product quantity and unit of measure fields on the MRP production kanban cards would shrink and become unreadable when product names were long. The changes ensure these fields remain consistently sized regardless of product name length, improving readability and usability.
Original PR description
Description of the issue/feature this PR addresses: On MRP production kanban, if the name of the product is too long, `product_qty` and `product_uom_id` fields on the card shrink and become unreadable. This adds proper classes to keep those fields from shrinking no matter how long product's name is. Current behavior before PR: <img width="1561" height="303" alt="image" src="https://github.com/user-attachments/assets/08e299be-c6e2-4241-b289-aaa2fab9a94f" /> Desired behavior after PR is merged: - The size of the product's name should be fine no matter how long the name of the product is. - The `product_qty` and `product_uom_id` should not shrink if the name of the product is long. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a bug that occurred when scheduling repair orders without a product assigned to a move line. Specifically, updating the scheduled date triggered an error related to unit of measure calculations. This fix ensures repair scheduling functions correctly, preventing disruptions to the repair workflow.
Original PR description
An error occurs when the product is not set in the repair move line, and the Scheduled Date is being updated. **Steps to Reproduce:** - Install the **Repairs** module. - Create a new **Repair Orders**. - Add a product and confirm the repair. - In the **Parts** tab, **add a new line** and change the **demanded** quantity without selecting a product. - Update the **Scheduled Date**. **Error:** `AssertionError: precision_rounding must be positive, got 0.0` `ValueError: Expected singleton: uom.uom()` (v19.0) When the move line has no `product_id`, its Unit of Measure (uom_id) is also empty. Updating the scheduled date triggers a computation, which leads to the error.
This update resolves an issue where sale orders with incomplete partner addresses in Mexico prevented online payments. The fix automatically enables 'CFDI to Public' when the address is missing, ensuring transactions are validated and payments are correctly recorded. This improves the reliability of payment processing for Mexican customers.
Original PR description
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent…
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent error occurred during move validation: the transaction was created, but the payment was never recorded, and no error appeared in the portal or the SO chatter ### Cause: The CFDI validation error is raised internally but never surfaced to the user https://github.com/odoo/enterprise/pull/91655 The PO (MIAL) recommended automatically enabling `CFDI to Public` when the partner address is incomplete, forcing the user to complete the data This also ensures that the payment can be confirmed properly ### Steps to reproduce: - Install `l10n_mx_edi_sale` and switch to the MX company - Configure a Payment Provider and Payment Method (e.g., demo) - Create a customer without ZIP or country - Create a Sale Order for that customer - In Other Info, set Online Payment to 100% - Send the quotation and open the link in a private window - Sign and Pay Before the fix: the transaction is created, but no payment is recorded, and no error is shown opw-5023724
This update resolves an issue where Odoo couldn't connect to printers with overly long names. The fix truncates the printer name to a maximum of 127 characters, preventing a CUPS error and ensuring reliable printer connectivity. This improves the overall usability of the printer functionality.
Original PR description
CUPS has a limit on printer names of 127 characters, which means that if a device has a very long device URI, it can exceed this limit and cause an error when we try to add it to CUPS:
```
Failed to add printer 'dnssdPhotosmart%207520%20series%20%40%20Guillaume%E2%80%99s%20MacBook%20Air%20(2)_ipp_tcplocalcups?96d0de60-096c-3d08-5e2d-893393e10c2b'
Traceback (most recent call last):
File "/home/pi/odoo/addons/iot_drivers/iot_handlers/interfaces/printer_interface_L.py", line 242, in set_up_printer_in_cups
self.conn.addPrinter(name=device['identifier'], device=device['url'], **ppdname_argument)
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cups.IPPError: (1024, 'client-error-bad-request')
```
We fix this error by truncating the identifier to 127 characters maximum.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves a bug where the 'Not Sent' filter in payment views incorrectly displayed or returned no results. The fix ensures this filter accurately identifies and displays payments that haven't been processed, providing users with a reliable view of pending actions.
Original PR description
The "Not Sent" filter in Payments list view was not returning the expected records. This was due to an incorrect domain condition in the search view. This commit updates the filter logic to properly…
The "Not Sent" filter in Payments list view was not returning the expected records. This was due to an incorrect domain condition in the search view. This commit updates the filter logic to properly identify payments that haven't been processed or sent, ensuring the filter displays the correct records to the user. **Description of the issue/feature this PR addresses:** This PR fixes a bug in the "Not Sent" search filter within the Payment views (Account Payments). Currently, the filter fails to accurately identify and display records that have not been sent, leading to an empty or incorrect list of results regardless of the sending payment's actual status. **Current behavior before PR:** When a user applies the "Not Sent" filter in the Payments list view (including both Customer and Vendor payments), the system returns incorrect records or no records at all. This is caused by an inconsistent domain definition that doesn't align with the internal field tracking the "sent" status of the payment. **Desired behavior after PR is merged:** The "Not Sent" filter will correctly filter the list to show only those payments where the "Sent" status is not True. This will provide users with an accurate view of pending actions for both Customer and Vendor payments, ensuring consistency across the accounting module. **Steps to reproduce:** 1. Navigate to the Accounting (or Invoicing) module. 2. Go to Vendors > Payments or Customers > Payments (the issue is global). 3. Ensure there are several payments in the list, some marked as "Sent" and others not yet sent. 4. Click on the Filters dropdown menu in the search bar. 5. Select the "Not Sent" filter. 6. Observe the results: Notice that the list either becomes empty or continues to show records that do not match the "Not Sent" criteria, failing to filter the data correctly. **video** https://drive.google.com/file/d/1NTKQ1tHWyZWfs3CPolfDTOMrqaDD9OcN/view --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr