Tuesday, February 3, 2026
6 changes · 17.0
New functionality added to Odoo
This update adds a new field for 'CPV' (Common Procurement Vocabulary) codes to products within the Odoo system. This is required for B2C invoices in Romania, ensuring accurate reporting and compliance with local regulations. The module automatically adds the CPV code to the RO-CIUS XML generated for invoices when the module is active.
Original PR description
In This PR: - We add a new module to add a new field 'CPV code' in the product. - Till now, in Odoo, customers can't input that CPV identification number on products, and the field is always left empty. That's an issue with B2C invoices, where the field is mandatory. - If the module is installed and a product with a CPV category is set on an invoice, we add the value of the CPV code in the RO-CIUS XML generated on an invoice. Task [link](https://www.odoo.com/odoo/project.task/5416833) task-5416833
Resolved issues and error corrections
This update fixes an issue where WhatsApp messages to blacklisted numbers wouldn't be blocked if the recipient's country differed from the sender's company country. The fix ensures that all international phone numbers are correctly processed as international (E.164) during blacklist checks, preventing messages from being sent to blocked numbers regardless of location.
Original PR description
Sending a WhatsApp message to a blacklisted number fails to be blocked if the recipient's phone number country differs from the sender company's country. ### Steps to reproduce 1. Configure a…
Sending a WhatsApp message to a blacklisted number fails to be blocked if the recipient's phone number country differs from the sender company's country.
### Steps to reproduce
1. Configure a WhatsApp account.
2. Set the Company's country to Germany (+49).
3. Create a Contact with a Belgian phone number (e.g. +32456001122).
4. Send a template message to this contact.
5. Have the contact reply with "STOP" to opt-out (this correctly adds +32456001122 to the blacklist).
6. Send another message to the contact.
- Expected: The message is blocked.
- Actual: The message is sent successfully.
### Root cause
The blacklist search logic relies on implicit phone number sanitization which behaves incorrectly for international numbers without a `+` prefix.
1. `whatsapp.message` stores numbers as `CountryCode + NationalNumber` without a `+` (e.g. "32456001122").
2. `phone.blacklist` stores numbers in E.164 format with a `+` (e.g. "+32456001122").
3. When searching `phone.blacklist` with "32456001122", the system interprets it as a local number for the Company's country (Germany) because of the missing `+`.
4. It reformats the search term to German E.164 ("+4932456001122").
5. The query fails to match the actual blacklisted number ("+32456001122"), allowing the message to pass.
### Fix
Explicitly prepend a `+` to the recipient's number before searching the blacklist. This forces the validation logic to parse the number as international (E.164), bypassing the company-country bias and ensuring the search term matches the stored blacklisted number.
opw-5401789This update optimizes how new messages are processed within the Odoo platform. Previously, each tab repeatedly sent channel updates, leading to performance issues and errors. Now, only one tab sends these updates, significantly reducing load and improving overall system performance.
Original PR description
Before this commit, each tab was sending a channel_fetched when receiving a new message. This would result in serialization error on the backend as well as performance reduction in case of high load of messages. After this PR, only one tab will send the `channel_fetched` using the `multi_tab` service. task-5180400 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the web editor would sometimes fail to save changes after applying history. The fix ensures a smoother and more reliable saving process for users editing HTML content within Odoo. This improves the overall user experience and prevents data loss.
Original PR description
backport of https://github.com/odoo/odoo/pull/216370 __ opw-5405048
This update allows users to reset Vendor Bills (e-invoices) created from ANAF to a draft state, even if they've already been processed with an EDI. This change improves the flexibility of managing e-invoices within the accounting system. Future versions (18.0+) will consolidate this functionality into the `l10n_ro_edi` module.
Original PR description
Adjusting the visibility check for "Reset to draft" button to allow Vendor Bills received from ANAF to be reset even when they have a EDI state. Will require to be shifted to `l10n_ro_edi` in 18.0+ as the efactura module is merged into it. task-5892651 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an error that occurred when processing refund orders containing multiple products. Previously, the system would encounter a technical issue preventing refunds with many items. This fix ensures refunds with multiple products are processed correctly, improving the reliability of the Point of Sale system.
Original PR description
Description of the issue/feature this PR addresses: When you create a refund order, and there's many products theres an error Current behavior before PR: Error, this is the traceback. ``` RPC_ERROR…
Description of the issue/feature this PR addresses: When you create a refund order, and there's many products theres an error
Current behavior before PR: Error, this is the traceback.
```
RPC_ERROR
Odoo Server Error
Traceback (most recent call last):
File "/home/odoo/src/odoo/odoo/models.py", line 5896, in ensure_one
_id, = self._ids
ValueError: too many values to unpack (expected 1)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/odoo/src/odoo/odoo/http.py", line 1803, in _serve_db
return service_model.retrying(self._serve_ir_http, self.env)
File "/home/odoo/src/odoo/odoo/service/model.py", line 152, in retrying
result = func()
File "/home/odoo/src/odoo/odoo/http.py", line 1831, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/src/odoo/odoo/http.py", line 2035, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/src/odoo/addons/website/models/ir_http.py", line 235, in _dispatch
response = super()._dispatch(endpoint)
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_http.py", line 221, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/src/odoo/odoo/http.py", line 772, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/src/odoo/addons/web/controllers/dataset.py", line 29, in call_button
action = self._call_kw(model, method, args, kwargs)
File "/home/odoo/src/odoo/addons/web/controllers/dataset.py", line 21, in _call_kw
return call_kw(Model, method, args, kwargs)
File "/home/odoo/src/odoo/odoo/api.py", line 484, in call_kw
result = _call_kw_multi(method, model, args, kwargs)
File "/home/odoo/src/odoo/odoo/api.py", line 469, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "/home/odoo/src/odoo/addons/point_of_sale/wizard/pos_payment.py", line 70, in check
order._process_saved_order(False)
File "/home/odoo/src/odoo/addons/point_of_sale/models/pos_order.py", line 184, in _process_saved_order
self._compute_total_cost_in_real_time()
File "/home/odoo/src/odoo/addons/point_of_sale/models/pos_order.py", line 412, in _compute_total_cost_in_real_time
lines._compute_total_cost(stock_moves)
File "/home/odoo/src/odoo/addons/point_of_sale/models/pos_order.py", line 1537, in _compute_total_cost
product_cost = self.refunded_orderline_id.total_cost / self.refunded_orderline_id.qty
File "/home/odoo/src/odoo/odoo/fields.py", line 1148, in __get__
record.ensure_one()
File "/home/odoo/src/odoo/odoo/models.py", line 5899, in ensure_one
raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: pos.order.line(16923, 16924, 16925)
```
Desired behavior after PR is merged:
No traceback error?
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr