Daily updates from Odoo
Friday, September 12, 2025
32 changes · 18.0
Resolved issues and error corrections
Sales orders created from a contact now use the customer's preferred delivery address, matching the behavior in the Sales app. This avoids orders being sent to an older or less relevant address when customers have multiple delivery locations.
Original PR description
## Versions 17.0+ ## Issue When creating a SO from the Contacts app, the first delivery address is used, ignoring the preferred one. In contrast, the Sales app correctly uses the preferred delivery…
## Versions
17.0+
## Issue
When creating a SO from the Contacts app, the first delivery address is used, ignoring the preferred one. In contrast, the Sales app correctly uses the preferred delivery address. This fix ensures consistent behavior across both.
## Steps to reproduce
*Ensure Contacts app is installed*
*Activate "Customer Addresses" in the settings*
- Go to the Contacts app:
- Create a new contact:
- Name: C1;
- Contacts & Addresses:
- Delivery Address (Add 2 new addresses):
- D1;
- D2.
- Click the "Sales" action button:
- Create a new SO for C1 (pre-filled):
- Invoice Address: C1, D2;
- Delivery Address: C1, D2;
- Add any product with:
- Quantity: 1;
- Delivered: 1.
- Create the invoice and confirm it.
- Go back to Contacts and look for C1:
- Click the the "Sales" action button:
- Create a new SO and see the Delivery Address set to "C1, D1".
- Go to Sales app:
- Create a new SO and select C1 as customer;
- Delivery Address retrieves "C1, D2" as it is the preferred address.
## Cause
Each time an invoice is validated, the corresponding address gets a higher score.
This score is then used in the SQL ordering of customers/suppliers:
https://github.com/odoo/odoo/blob/b523f5c6d8e235a6cedb029f701a0ebd89a5f74a/addons/account/models/partner.py#L347-L354
## Fix
Apply context search mode if first call. This mimics the base behavior: https://github.com/odoo/odoo/blob/b57bb1decd46dcbb1fe602bb72b6f8e5382e9b28/odoo/addons/base/views/res_partner_views.xml#L534
opw-4916381
Forward-Port-Of: odoo/odoo#225189Event email templates now use embedded images instead of web font icons for location markers. This ensures recipients see the correct visual elements in their email clients and avoids confusing duplicate or empty icons when editing event emails.
Original PR description
Font awesome classes must no be inserted into email as external servers do not use them so icons are not displayed and also because some issues occur with the email editor. This commit replaces i tags with font awesome classes in mail by images. Task-5082165
Express checkout now excludes Click & Collect delivery options when they require the customer to choose from multiple pickup stores. This prevents customers from selecting a pickup method in a flow that cannot capture the pickup location, while still allowing single-store pickup options.
Original PR description
Before this commit, when entering the express checkout flow, Click & Collect (C&C) delivery methods (DM) were included in the list of possible delivery methods available for express checkout. However, the express checkout flow does not allow customers to select which store they want to pick up their order from. After this commit, C&C DMs are excluded from the list if they have more than one store configured. If only one store is configured, the customer implicitly knows where they will need to pick up their order.
This fix prevents subcontracted, lot-tracked purchase orders from showing incorrect duplicate inventory lines at the subcontractor location. It keeps subcontractor stock reporting accurate by ensuring quantities are cleared as expected after receipt.
Original PR description
…ed PO **Steps to reproduce:** - Create a new product and track by lots - Add a BOM for this product, setting type to Subcontracting - Create a PO for the product and confirm it (with the vendor as…
…ed PO **Steps to reproduce:** - Create a new product and track by lots - Add a BOM for this product, setting type to Subcontracting - Create a PO for the product and confirm it (with the vendor as the subcontractor specified on the BOM) - With debug enabled: go to Inventory/Operations/Procurement: run scheduler - Go to Inventory > Reporting > Locations and search for the product note the quant line at the subcontractor location with no lot number - Return to the PO and recieve, specifying lot number - Go to Inventory > Reporting > Locations - Search for the product again **Current behavior:** there are now 2 quant lines at the subcontractor location: one with lot and one without lot **Expected behavior:** There shouldn't be any visible quant line at the subcontractor location because the quantity and reserved quantity of the product at subcontractor location should both be 0 **Cause of the issue:** Step 1: When we confirm the PO, this creates a picking and a stock move (move A) from the sbc location to the stock location. When _action_assign is run on this move, self._should_bypass_reservation() will return true because the move is subcontract https://github.com/odoo/odoo/blob/95ed5c75582631c7cc417b000569ff6451cc5006/addons/mrp_subcontracting/models/stock_move.py#L302-L307 so we will not create a quant. (another move (move B) is also created from Production location to sbc location). However when we open Locations this triggers _clean_reserations() and because should_bypass_reservation() returns false for the sbc location, we will run update_reservation_quantity and create a new quant with a reserve quantity of 1 and no lot_id https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_quant.py#L1167-L1172 Step 2: Then, when we recieve the products and validate the picking, this will call _action_done() on move A. which will call synchronize_quant() https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_move_line.py#L690 which will call _update_available_quantity() for a quantity of -1, the location sbc and the lot that we just created in the steps. https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_move_line.py#L712 Inside _update_available_quantity(), the call to _gather() will return the quant that we created in step 1 (even though the existing quant has no lot and we give the lot we created as parameter). https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_quant.py#L1055 So we don't create a new quant but we update the existing one that has no lot. Step 3: _action_done() is then called on move B which calls _synchronize_quant() https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_move_line.py#L691 which calls _udpate_available_quantity() for a quantity of 1, the location sbc and the lot created in the steps. Inside _update_available_quantity(), the call to _gather() will return the quant that we created in step 1. BUT this time, because the quantity is positive, the quant will be filtered out https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_quant.py#L1056-L1057 so we will create a new quant with a lot_id this time and a quantity of 1. As a consequence instead of having the quantities zeroed out, we end up with two quants one with a lot and a quantity of 1 and one with no lot and a quantity of -1. opw-4935822
Website sitemaps no longer list the same page more than once when website controllers are customized. This keeps search engine indexing cleaner without changing which pages are included.
Original PR description
When extending controllers (e.g. `WebsiteSale.shop`), sitemap entries were duplicated because deduplication relied on the endpoint function object. Overridden methods result in different function objects but identical sitemap URLs, leading to duplicates. This commit fixes the issue by deduplicating on the generated sitemap location (`loc['loc']`) instead of the function object, ensuring unique URLs in the sitemap even when controllers are extended. Fixes #224193 Forward-Port-Of: odoo/odoo#224406
Fixed how Uruguayan electronic invoices read document numbers that begin with multiple letters. This helps ensure affected credit and debit notes are generated and validated with the correct numbering format.
Original PR description
If UY EDI document has latam document number with more than one letter at the beggining, it is needed to take in consideration all the letters and not only the first one. Task Latam side: 1352 Task Adhoc side: 53173
This fixes an approval workflow issue where selected approvers could be blocked from approving requests unless they also had broader Approvals user permissions. Businesses can now rely on assigned approvers being able to complete their approval tasks without unnecessary access changes.
Original PR description
Follow up on the previous PR odoo/enterprise#92309 , fixing access rights preventing approvers from approving in requests they are requested to approve in case they don't have the group approvals user. Task-4897775 Forward-Port-Of: odoo/enterprise#94316
The journal report test was updated so it no longer depends on a payment reference staying empty in every localization setup. This prevents build failures when Czech accounting localization is installed, improving release stability without changing user-facing functionality.
Original PR description
test_document_data_basic was failing in builds with l10n_cz installed because - we set move_sales_2.payment_reference = '' in setUpClass and without l10n_cz it stays empty - but with l10n_cz installed it gets recomputed because of precompute=True on taxable_supply_date (which a stored computed field that triggers an extra write on account.move when the company is in CZ, and that write causes the compute graph to run again, and _compute_payment_reference fills the value back in) this commit solves this issue by not making assumptions about the payment_reference value and would use it as is in the generated data validation build_error-231479
Installing or re-enabling the Barcode feature could fail if the default barcode nomenclature had previously been deleted. The update prevents that crash by safely handling the missing default record, allowing users to enable the feature again without manual recovery.
Original PR description
The system will crash with error when user tries to install module `Barcode`. **Steps to produce: -** - Install `Inventory` module. - `Inventory > configuration > products > Barcode Nomenclatures`. -…
The system will crash with error when user tries to install module `Barcode`.
**Steps to produce: -**
- Install `Inventory` module.
- `Inventory > configuration > products > Barcode Nomenclatures`.
- Delete the `Default Nomenclature` record.
- Go to settings uncheck `Barcode Scanner` and save settings.
- Now, again `enable' that and save.
**Error: -**
```py
ValueError: External ID not found in the system: barcodes.default_barcode_nomenclature
ParseError: while parsing /home/odoo/src/enterprise/saas-18.4/stock_barcode/data/data.xml:40, somewhere inside <record id='scale_up_alias_1' model='barcode.rule'>
<field name='name'>Scale Up Receipt</field>
<field name='type'>alias</field>
<field name='pattern'>WH-RECEIPTS</field>
<field name='alias'>WHIN</field>
<field name='barcode_nomenclature_id' ref='barcodes.default_barcode_nomenclature'/>
<field name='sequence'>0</field>
</record>
```
**Root cause: -**
- At [1], the records use the ref of `default_barcode_nomenclature` which is defined in `barcode` module. So, when the ref is deleted and we are trying to use it then it gives error.
**Solution: -**
- This commit resolves the error by providing a False value for the field, if the reference is missing.
[1] https://github.com/odoo/enterprise/blob/400171c9cebc46ecdd907ada210c65f3bbd2dd66/stock_barcode/data/data.xml#L40-L71
**sentry-6823596992**This fixes a rounding mismatch that could block Mexican electronic payment documents when an invoice was issued in USD and paid in MXN. The payment values are now calculated consistently with the official reporting precision, reducing validation failures for affected foreign-currency payments.
Original PR description
Steps to reproduce: - With an MX Company setup - Set USD rate to: - 0.049216958195 for day 1 - 0.053418803419 for day 2 - Create an invoice in USD as follows: - line 1: price_unit 91, quantity 64,…
Steps to reproduce:
- With an MX Company setup
- Set USD rate to:
- 0.049216958195 for day 1
- 0.053418803419 for day 2
- Create an invoice in USD as follows:
- line 1: price_unit 91, quantity 64, tax 16%
- Confirm and send CFDI
- Register full payment in MXN
- Send Payment CFDI
Issue: Payment validation will fail with error
Code : CRP20268
Message : El campo BaseP que corresponde a Traslado, no es igual a la suma de
los importes de las bases registrados en los documentos relacionados donde el
impuesto del documento relacionado sea igual al campo ImpuestoP de este elemento
y la TasaOCuotaDR del documento relacionado sea igual al campo TasaOCuotaP de
este elemento.
Message : Valor esperado: 109025.275956 valor reportado: 109025.275862
This occurs because the precision set in https://github.com/odoo/enterprise/commit/e642e4d6d35c79d02c799d12451f3e2d92ab96e9 is high and can lead to failed
verification due to rounding on our side, because we compute BaseP using
the full digits of EquivalenciaDR, but, according to the specs, we
send it rounded to 10 digits.
opw-4750981
Forward-Port-Of: odoo/enterprise#92768Planning calendar exports now use the correct timezone when a shift has no assigned employee. This prevents exported shift times from being shifted incorrectly, improving calendar reliability for users working with unassigned planning slots.
Original PR description
The test `test_planning_ics_file_without_assigned_employee` failed when running without demo data because the slot timezone was `Europe/Brussels` while the employee timezone was `UTC`.
The previous code in the method `ics_datetime()` converted to the slot timezone and then relabeled it as the employee timezone with `.replace(tzinfo=...)`, which shifted the actual instant.
This change ensures that ICS datetimes are always converted using astimezone to a single target tz:
- employee tz if the slot is assigned,
- otherwise the current user tz or `UTC` as fallback.
The test was also updated to assert the correct fallback `UTC` values:
`DTSTART:20230602T080000Z`
`DTEND:20230602T170000Z`
[runbot-231213](https://runbot.odoo.com/odoo/error/231213)POS GSTR reports now report service products with a quantity of zero, matching GST portal requirements. This prevents validation errors when submitting returns while keeping normal quantities for goods unchanged.
Original PR description
Before this PR: - Service products in POS GSTR lines were reported with their actual quantity. - This caused GST portal validation error: `RET191355: The Quantity entered is not valid`. After this PR: - For service-type products, `qty` is always set to `0`. - For goods, `qty` continues to reflect the actual ordered quantity. OPW: 5070636 Forward-Port-Of: odoo/enterprise#94272
This fix prevents a closed connection from being misread as a different internal error during test and core connection handling. It helps keep error reporting accurate, making issues easier to diagnose and reducing misleading failures.
Original PR description
Followup to 16.0-closed-in-stop-xmo: the condition in `stop` is a `hasattr`, so we need to delete `self.ws` not set it to `None`. Setting it to `None` means the condition passes then blows up as soon as we try to use it, which means we "just" converted all the old `WebSocketConnectionClosedException` to an `AttributeError`. https://runbot.odoo.com/odoo/error/231446 Forward-Port-Of: odoo/odoo#226267
This fixes an issue where tapping Send in Odoo’s iOS web app could sometimes fail while writing messages in Discuss or chatter. The message composer no longer shifts at the moment of tapping, making message sending more dependable for mobile users.
Original PR description
Before this commit, when using IOS PWA, pressing 'Send' button of in composer in discuss or chatter would sometimes not register the send. This happens because in IOS PWA, the composer has a bottom margin as this is close to iOS persistent swipe bar. However, the margin should not be present when there's the soft-keyboard. Because of this dynamic margin based on input focus, when composing textual message and pressing "Send" button, the textarea looses focus and a fraction of second the margin-bottom is increased and moves the "Send" button. This leads to mis-clicking the "Send" button. This commit removes the margin-bottom rule on non-focusin of textarea with iOS PWA. The composer is close to swipe bar so that's not as elegant as before, but at least this doesn't add the problem of non- working "Send" button. opw-5028809
This fixes an error that could block Indian e-Way Bill generation through IRN. Users should now receive the expected response instead of a crash when generating an e-Way Bill.
Original PR description
backport of https://github.com/odoo/odoo/commit/b7b987c4077c064fdfdb6b956379455cbdd93de3 on generating ewaybill through irn following traceback is produced ```py File…
backport of https://github.com/odoo/odoo/commit/b7b987c4077c064fdfdb6b956379455cbdd93de3 on generating ewaybill through irn following traceback is produced
```py
File "/home/odoo/src/odoo/addons/l10n_in_ewaybill_stock/tools/ewaybill_api.py", line 165, in _ewaybill_generate
return self._ewaybill_make_transaction("generate", json_payload)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/addons/l10n_in_ewaybill_stock/tools/ewaybill_api.py", line 157, in _ewaybill_make_transaction
response = self._ewaybill_get_by_consigner(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/addons/l10n_in_ewaybill_stock/tools/ewaybill_api.py", line 181, in _ewaybill_get_by_consigner
'message': self.DEFAULT_HELP_MESSAGE % 'generated',
~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
TypeError: unsupported operand type(s) for %: 'LazyGettext' and 'str'
```
In this commit we resolve this issue
opw-5079789
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe spreadsheet interface now consistently uses the light theme because dark theme is not supported there. This prevents mixed light and dark styling, giving users a clearer and more consistent experience.
Original PR description
Spreadsheet doesn't support dark theme. This fixes some style where dark and light themes are mixed. Task: 5082593 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Mollie payments that are created but still waiting, such as SEPA bank transfers, are now treated as pending instead of invalid. This prevents customers from seeing an error after checkout when their payment is expected to remain open until completed.
Original PR description
Versions -------- - 16.0+ Steps ----- 1. Enable Mollie as a payment provider; 2. set up an eCommerce order in EUR; 3. go to checkout; 4. pay via Mollie; 5. pick SEPA bank transfer as payment method; 6. leave the transaction open. Issue ----- When returning from the redirect, we get the following error message: > Mollie: Received data with invalid payment status: open Cause ----- An 'open' payment indicates the payment has been created, but nothing else has happened yet[^1]. This is the expected status for bank transfers, but is currently not getting handled in `_process_notification_data`, leading to the error. [^1]: https://docs.mollie.com/docs/status-change Solution -------- Handle 'open' payments the same as 'pending' ones. opw-4894556 Forward-Port-Of: odoo/odoo#226642 Forward-Port-Of: odoo/odoo#225875
Users can now open assigned activities from the “View all activities” menu even when they do not have permission to view the related record. The activity opens in a safe form view so they can still complete the task, reducing access errors and workflow interruptions.
Original PR description
**Steps to reproduce** 1. Create an activity on a record and assign it to a user who doesn't have access to this record. (e.g. create an activity on a `hr.employee` record and assign to a user without HR rights). 2. With this user lacking access rights, click on "View all activities" in the systray. 3. Click on the activity: error **Cause** The user may not have access rights to the record related to an activity. **Change** Open the activity's form view, we use `mail_activity_view_form_without_record_access` to display the "Mark as done" button. opw-4925744
The automation rule trigger dropdown now uses the correct background color when dark mode is enabled. This keeps the interface visually consistent and easier to read for users working in dark mode.
Original PR description
Steps: - Install `base_automation` - Enable dark mode - Open Automation rules - Create a new rule - open trigger dropdown - the dropdown background is still in light mode This commit apply $dropdown-bg on `o_field_base_automation_trigger_selection` opw-5064357 Forward-Port-Of: odoo/odoo#226116
Fixes an issue where moving documents into a folder previously visited by the same members could accidentally remove those members' access. This helps ensure shared documents remain available to the intended people after being reorganized.
Original PR description
When moving documents with members to a folder which has been visited by those same members (or some of them) they are removed from those documents access. This is caused by the document.access which has an entry for the members but with a null role. Task-5075196
The journal report test was updated so it no longer depends on a payment reference staying blank in all local accounting setups. This prevents false build failures when Czech localization is installed, improving release reliability without changing customer-facing behavior.
Original PR description
test_document_data_basic was failing in builds with l10n_cz installed because - we set move_sales_2.payment_reference = '' in setUpClass and without l10n_cz it stays empty - but with l10n_cz installed it gets recomputed because of precompute=True on taxable_supply_date (which a stored computed field that triggers an extra write on account.move when the company is in CZ, and that write causes the compute graph to run again, and _compute_payment_reference fills the value back in) this commit solves this issue by not making assumptions about the payment_reference value and would use it as is in the generated data validation build_error-231479
Tax return closing entry reports now keep the selected tax period when generating PDF or XML files. This prevents reports for a prior month, such as August, from incorrectly showing the posting month, such as September.
Original PR description
**Issue** When posting a closing entry in September on a tax return report for the month of August, the generated report (PDF/XML) incorrectly shows September instead of August. **Steps to Reproduce** 1. Install Belgian localization. 2. Go to Accounting > Reporting > Tax Return. 3. Select August as the reporting period. 4. Post the Closing Entry. 5. The report shows September as the month instead of August. **Root Cause** The logic in `_init_options_date` was changed in PR #89290 mutating the `options['date']['filter']` by replacing `"tax_period"` with a resolved period type (e.g., `"month"`). As a result, the `"month"` branch was triggered later in the code, recomputing `date_from` and `date_to` based on the current date instead of the selected tax period boundaries. **Fix** Keep the `options['date']['filter']` unchanged (e.g., `"custom_tax_period"`). Use `period_type` field to indicate whether the tax period represents a month, quarter, or year. Opw-5073081
Tax report values are now protected from edits once the relevant tax period has been locked, helping preserve submitted tax data. The tax closing process was adjusted so required default values are created before the lock date is applied, with a temporary exception for a French VAT filing edge case.
Original PR description
[FIX] account_reports: external value check lock date This commit add the check that protects external values from being edited out of the lock date. For example when the tax report is submitted, the…
[FIX] account_reports: external value check lock date This commit add the check that protects external values from being edited out of the lock date. For example when the tax report is submitted, the user is not supposed to modify any external values anymore. To do this, we had to modify the tax closing flow a little bit: when closing the tax period, we now generate the default external values before setting the tax lock date. This is because the generation of the default external values was done for the period we were closing, but now that we forbid the creation of an external value after the lock date we had to change the order of the flow. Due to one specific corner case (l10n_fr), we had to keep a hack to bypass the Tax Return Lock Date check. This was done with a context key and will have to be removed in master. The case is the following : when the user generates the tax closing entry, the external values for the period are generated and the Tax Return Lock Date is set with the last day of the month. Then if the user tries to submit the EDI VAT report, it tries to create 2 external values for the carryover but as the lock date was set, it raises an error. task-5012442
This fixes a time off workflow issue where approving a leave that deducts extra hours could proceed without creating the required negative overtime record. Businesses get more reliable extra-hours balances when leave requests are refused, reset, and approved again.
Original PR description
**Issue** - Create a leave for a time off type deducting extra hours. - Check: a negative overtime (`hr.attendance.overtime`) has been created. - Approve, refuse and reset the leave. - Inconsistency: state is in "confirm" state, but no overtime exists. - Approve the leave. - Issue: no overtime exists. **Cause** The forward port 8dd74bc723fe8ddffaac718f537f6284f341bfe6 didn't correctly consider the removal of the "Draft" leave state. **Change** Ensure leaves in "Confirm" and next steps have an associated negative overtime. opw-4815190
The attendance Gantt popup now lets users enter a checkout time for an open attendance directly in the popup. This removes a frustrating blocker for correcting attendance records without leaving the Gantt view.
Original PR description
The Gantt popup form explicitly set `check_out` invisible when it was empty, which prevented users from manually entering a checkout for an open attendance. This commit removes the overriding xpath so that the form simply inherits the standard `hr_attendance_view_form` behavior, where the `check_out` field is always visible and editable. Users can now set a manual checkout directly from the Gantt modal. task-5026978
Neutralized databases now prevent existing Peppol connections from contacting live or test networks by moving them into a local demo mode. New Peppol connections from those databases are directed to the test network, reducing failed registrations and accidental production use.
Original PR description
Previously existing Peppol connections were only switched to `test`. This is not enough and incorrect: - someone connected in production does not necessarily have a registration on the test network,…
Previously existing Peppol connections were only switched to `test`. This is not enough and incorrect: - someone connected in production does not necessarily have a registration on the test network, therefore the database is in an inconsistent state, and calls to the test network are very likely to fail - if you create a new connection to Peppol on a neutralized database, since the system parameter was not changed, the new connection was on production After this commit: - existing connections are switched in `demo` where everything is mocked locally, no call to the network (whether it's `test` or `prod` can happen) - the system parameter is switched to `test`, therefore new connections will register to the Peppol test network - Also added some fields on the Edi Proxy User to display the mode of the user, as well as the proxy_type in list view. (Those records are only accessible in debug already.) <img width="579" height="333" alt="image" src="https://github.com/user-attachments/assets/87847726-d954-4f68-8336-07771747365f" /> task-none (report from PMAX + WTA) Forward-Port-Of: odoo/odoo#226435
Stripe card payment fields now use the language selected on the website instead of defaulting to the shopper's browser language. This makes checkout more consistent for multilingual websites and reduces confusion during payment.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Enable Stripe; 2. enable a second language on the website; 3. use second language on website; 3. go to checkout; 4. open card payment method. Issue ----- The card field values are displayed using the current browser's locale instead of the website's language. Cause ----- The `locale` parameter isn't included when connecting to the Stripe API. Solution -------- Include the lang from the `html` element via `_prepareStripeOptions`. If not present, let it fall back on the browser's locale. opw-5024805 Forward-Port-Of: odoo/odoo#226045
Fixed an issue where users with Shop Floor set as their default start page could see an error after logging in. The app now handles reloads more safely, so manufacturing users can access the Shop Floor without interruption.
Original PR description
**PROBLEM** In debug mode, we can change the default home action of a user (the action he sees when logging in). When the action `action_mrp_display` is set as the home action, there is a traceback…
**PROBLEM** In debug mode, we can change the default home action of a user (the action he sees when logging in). When the action `action_mrp_display` is set as the home action, there is a traceback after logging in. **STEP TO REPRODUCE** 1. Go in debug mode 2. Change the home action of a user to the 'Shop Floor' action (in the user form, in the preference tab). 3. log out, and log in with this user. 4. a js traceback should appear. **CAUSE** In mrp_workcenter_dialog.js, the Shop Floor action uses the `menu` service to get the name of the current app. `setCurrentMenu()` which set the current app in the `menu` service is not called before the `appName` getter is called. https://github.com/odoo/odoo/blob/5c1234085b1c1e227846b24bde55a0392779069b/addons/web/static/src/webclient/menus/menu_service.js#L29-L36 This lead to a traceback because this.menu.getCurrentApp() is `undefined`. **FIX** Workaround if the current app is undefined. We already check what is returned by `getCurrentApp()` where it is used. opw-4926317
Customers can no longer apply a coupon reward meant for a future purchase to the same order that generated it. This keeps loyalty promotions working as intended and prevents unintended discounts on current sales orders.
Original PR description
Versions -------- - 16.0+ Steps ----- 1. Have a next-order coupon program; 2. create an order that would generate a coupon; 3. confirm order; 4. click on the "Reward" button. Issue ----- It's possible to claim the reward on the current order. Cause ----- When retrieving claimable rewards, it checks the coupons generated by the current order using `coupon_point_ids`, but does not verify whether the program should be applicable to the current order. Solution -------- If the program only applies on future orders, and the coupon's `order_id` is the current order, skip the coupon when retrieving claimable rewards. opw-4910922 opw-4948757 Forward-Port-Of: odoo/odoo#221536
Pasted tables whose first row comes in as a header are now normalized so the editor handles all rows correctly. This prevents errors when deleting rows and makes row selection work reliably in the HTML and website editors.
Original PR description
**Current behavior before PR:** Steps to reproduce: - Copy a table from chatGPT's response containing first row wrapped in `<thead>`. - Paste it in editor. - Select last row. - Pressing backspace leads to traceback. This issue happens because the copied table is pasted with first row wrapped in a thead element. Due to this, rows are wrongly calculated leading to traceback in removeRow method. **Desired behavior after PR is merged:** - This commit ensures that if a table has first row wrapped inside a `thead`, the row is moved from `thead` to the start of `tbody` ensuring that rows are calculated correctly. - This commit also replaces all the `<th>` elements with `<td>`. task-5048339 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can no longer place signature fields before a PDF page is ready, preventing errors during document preparation. The cleanup of temporary page elements has also been corrected, making the signing setup experience more stable.
Original PR description
Fixed an issue where users could drag and drop sign items before the target PDF page was fully loaded, which caused runtime errors. The system now blocks adding new sign items until the target page has finished loading. Also fixed a problem with cleaning up dummy elements: these were sometimes removed incorrectly when the iframe re-rendered the pages, as the cleanup was already handled automatically. task-5065598
Fixes an issue where Indonesian e-Faktur documents could fail to download when an invoice line included more than one non-luxury tax. This helps users complete invoice processing without crashes in affected Indonesian accounting workflows.
Original PR description
The system crashes with an error when a user tries to `download the e-Faktur` document. **Steps to produce:-** - Install `Accounting` and switch to `ID Company`(with demo data). - Create a `new…
The system crashes with an error when a user tries to `download the e-Faktur` document.
**Steps to produce:-**
- Install `Accounting` and switch to `ID Company`(with demo data).
- Create a `new invoice` and select customer as `ID Company`.
- Add the product and in `taxes add 11% and 0% (2 non-luxury taxes)` and confirm the invoice.
- Click on gear icon and click on `Download e-Faktur` button.
**Error:-**
`ValueError: ValueError('Expected singleton: account.tax(5, 15)') while
evaluating 'action = records.download_efaktur()'`
**Root cause:-**
- When more than one non-luxury tax is applied and the e-Faktur document is downloading, the code at [1] expects a single tax record, but multiple non-luxury taxes are found.
**Solution:-**
- Since luxury tax is already excluded from the regular tax computation at [2], I think we can directly sum all non-luxury taxes.
[1]: https://github.com/odoo/odoo/blob/52aa6231130ea165fdb44e6370ec3e396b7603cc/addons/l10n_id_efaktur_coretax/models/account_move_line.py#L52
[2]: https://github.com/odoo/odoo/blob/52aa6231130ea165fdb44e6370ec3e396b7603cc/addons/l10n_id_efaktur_coretax/models/account_move_line.py#L24-L25
**sentry-6837559933**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr