Daily updates from Odoo
Wednesday, April 1, 2026
30 changes · 18.0
Resolved issues and error corrections
This fix corrects the indicators used when exporting Spanish tax declarations (Mod 347) to the AEAT tax authority. Previously, the system incorrectly used 'X' for both substitutive and complementary declarations, causing AEAT to reject the files. Now it correctly uses 'C' for complementary and 'S' for substitutive declarations, ensuring tax reports are properly recognized by the Spanish tax authority.
Original PR description
Currently, the BOE export for `Mod 347` uses incorrect indicators for `Substitutive` and `Complementary declarations`. **Steps to reproduce:** - Install the `l10n_es_reports` module and switch to the…
Currently, the BOE export for `Mod 347` uses incorrect indicators for `Substitutive` and `Complementary declarations`. **Steps to reproduce:** - Install the `l10n_es_reports` module and switch to the `ES company` - Navigate to Accounting > Reporting > Tax Report - From the smart button, select `Report: Tax Report (Mod 347) (ES)` - Download the BOE file using the dropdown. - In the wizard: - Enable `Substitutive Declaration` or `Complementary Declaration` - Set `Previous Report Number` (e.g., 123456789) - Click `Generate BOE` - Upload the generated .txt file to the `AEAT portal`. (AEAT credentials are required) **Observation:** AEAT does not recognize 'X' as a valid indicator for substitutive or complementary declarations and interprets the file as a standard return. **Root Cause:** At [1], the BOE Mod 347 generation writes 'X' for both substitute and complementary declarations. **Fix:** This commit ensures the file contains correct indicators: - 'C' for `complementary declarations` - 'S' for `substitute declarations` This aligns Modelo 347 with AEAT specifications and ensures consistency with the implementation of Modelo 349 at [2]. Ref: https://sede.agenciatributaria.gob.es/Sede/en_gb/ayuda/consultas-informaticas/declaraciones-informativas-ayuda-tecnica/modificar-declaracion-informativa-mediante-fichero.html [1]: https://github.com/odoo/enterprise/blob/c5332bef593cc3fa1b5013a0dac56ccd67e4da14/l10n_es_reports/models/aeat_tax_reports.py#L1061-L1062 [2]: https://github.com/odoo/enterprise/blob/c5332bef593cc3fa1b5013a0dac56ccd67e4da14/l10n_es_reports/models/aeat_tax_reports.py#L1490-L1491 opw-6048711 Forward-Port-Of: odoo/enterprise#112566
This fix corrects a bug in the subscription product management system where users could incorrectly change the "Recurring" setting on products that have active orders. Previously, rapid clicks on the setting could bypass the intended protection. The fix now properly validates against the server's current value instead of the form's temporary state, ensuring the system correctly prevents unauthorized changes.
Original PR description
**Problem:** When attempting to change "Recurring" on products in the form view, if there are confirmed SOs, the change should be reverted and a message should appear explaining this. However, there is a bug in how the change is reverted where it takes the current form value of the field. This cannot be trusted as it's possible to trigger another onchange before the first one resolves, so the second onchange is based on the wrong value. **Steps to Reproduce:** - w/Demo Data, go to product "Office Cleaning Service (SUB)" (This is a subscription product which has confirmed SOs) - Quickly click the checkbox for "Recurring" twice -> Two warnings appear, but Recurring is False and can be saved **Solution:** Instead of reading the current form value and setting its opposite, we can revert to the current value on the server. Forward-Port-Of: odoo/enterprise#110877
This update resolves a memory leak issue in the Account Reports module where the system was continuously preloading sections without stopping, preventing the system from freeing up memory. The fix ensures that preloading stops when the report component is closed, allowing the system to properly clean up and reclaim memory resources.
Original PR description
The preloading of sections would never stop, this is an issue since this would prevent the garbage collector from collecting this big class and all it's objects. We fix this by making sure to stop the reploading when the component is destroyed. It's important to do it this way rather than clearing the timeout as the destruction could happened when the report is loading so the timeout would be unset and a new one would be started. Forward-Port-Of: odoo/enterprise#112628
This fix resolves an issue where closing a POS session with only future orders (orders with scheduled delivery dates) would fail to generate the required accounting records. The system was incorrectly excluding all future orders instead of just unpaid ones, preventing proper financial tracking. Now, paid future orders are correctly included in the account move when sessions are closed.
Original PR description
Before this commit, when all orders coming from Urban Piper in a POS session are paid future orders (i.e. have a delivery_datetime), closing the session would not generate an account move. The cause was that the code was excluding future orders when creating the account move. The fix is to exclude only unpaid orders instead. How to reproduce: - Set up Urban Piper (a test account needed). - Place an order from the Urban Piper platform. - Receive the order, accept it, and mark it as ready. - Close the session. - The session will not have an account move. opw-5995985
This fix resolves an error that occurred when opening the "Move to Work Center" dialog in the Shop Floor interface. The dialog component was incorrectly requiring a function parameter that isn't always needed, causing the system to crash in debug mode. By making this parameter optional, the dialog now works correctly whether it loads work centers on-demand or uses pre-loaded data.
Original PR description
**Steps to reproduce:** * Install the *Manufacturing (`mrp`)* module. * Enable *developer (debug) mode*. * Open the *Shop Floor* interface. * Select work center as `Assembly 1` * In the bottom-right…
**Steps to reproduce:**
* Install the *Manufacturing (`mrp`)* module.
* Enable *developer (debug) mode*.
* Open the *Shop Floor* interface.
* Select work center as `Assembly 1`
* In the bottom-right corner, click the *gear icon*.
* Select **Move to Work Center** from the *gear icon*.
**Observed behavior:**
* A traceback occurs when opening the *Move to Work Center* dialog.
* The following Owl error is raised:
`OwlError: Invalid props for component 'MrpWorkcenterDialog': 'loadWorkcenters' is missing (should be a function)
Error: Invalid props for component 'MrpWorkcenterDialog': 'loadWorkcenters' is missing (should be a function)`
**Cause:**
* `MrpWorkcenterDialog` is opened in *two different ways*:
https://github.com/odoo/enterprise/blob/7805022e77ff80a74563b7ff0032d8975c00b709/mrp_workorder/static/src/mrp_display/mrp_display.js#L469-L480
* One caller opens the dialog and provides `loadWorkcenters`.
In this flow, the dialog fetches work centers by calling this
function.
https://github.com/odoo/enterprise/blob/7805022e77ff80a74563b7ff0032d8975c00b709/mrp_workorder/static/src/mrp_display/dialog/mrp_menu_dialog.js#L68-L76
* Another caller opens the dialog and directly provides a
`workcenters` list. In this flow, the dialog already has the data
and does not need `loadWorkcenters`.
* Therefore, the real behavior is that `loadWorkcenters` is only
required *sometimes*, not always.
* However, the component props defined it as mandatory:
`loadWorkcenters: { type: Function }`
* In *debug mode*, Owl strictly validates component props by comparing
what the component declares in `static props` with what the caller
provides. When the dialog is opened without `loadWorkcenters`, Owl
detects that a required prop is missing and raises an
*Invalid props* error.
**Fix:**
* Mark `loadWorkcenters` as *optional* in the component props so the
dialog works correctly in both supported flows:
* Lazy loading of work centers via `loadWorkcenters`.
* Using preloaded `workcenters` data.
---
opw-6010261Ecuador's withholding tax percentages have been updated for 2026 in compliance with the new government resolution. The system's automated tests have been updated to reflect these new tax rates, ensuring accurate tax calculations and reporting for Ecuadorian businesses using the electronic invoicing and tax reporting features.
Original PR description
In accordance with the implementation of the new withholding tax percentages according to "Resolución N.º NAC-DGERCGC26-00000009" for Ecuador, following internal implementation guidelines by TRESCLOUD. Unit tests are updated to be based on the new withholding percentages. BP #110343 Forward-Port-Of: odoo/enterprise#110712
This fix resolves an issue where customer discounts were being applied twice when creating sales orders from field service tasks. Previously, discounted prices were being set as the unit price and then discounted again at the sales order line level, resulting in incorrect final prices. The fix ensures discounts are applied only once by using the correct pricing logic based on whether discounts are enabled in settings.
Original PR description
Currently, when the user creates a task for a customer with a discount pricelist, the discount is applied twice for the service. <h2>Steps to produce:</h2> * Install `industry_fsm_sale` and enable…
Currently, when the user creates a task for a customer with a discount pricelist, the discount is applied twice for the service. <h2>Steps to produce:</h2> * Install `industry_fsm_sale` and enable `Discounts` and `Pricelists` in settings. * Create a pricelist with a price rule of type discount that applies 10 percent discount to every product. * Go to Customers > Acme Corporation > Sales & Purchase and set the pricelist. * Go to Field Service > Create a Task, and set `Customer` to Acme Corporation. * Add a timesheet with Time Spent 1 > Mark the task as Done > Sale Order <h2>Observed behavior:</h2> The discount is applied twice to the product on SO: **Product**: Service on Timesheets **Unit Price**: `$40` (excluding tax) **First discount:** The 10 percent discount on the unit price of the product. Product unit price is set from `$40 -> $36 ` **Second discount:** The 10 percent discount on the SO line itself. `$36 -> $32.4 ` The untaxed amount is: `$32.40` which should be `$36.00` <h2>Root cause:</h2> This happens because, at line [1], the unit price is already set to the final price from the pricelist when the sale order line is created. Since discounts are enabled, [2] applies an additional discount to that same price, causing the discount to be applied twice. <h2>Solution:</h2> When creating the sales order: * **Discount setting is on:** use list price so the discount is applied from the sales order. * **Discount setting is off:** set the product unit price to the discounted price. [1]- https://github.com/odoo/enterprise/blob/224d2453cc975a3e333825370beaf30d27d89f10/industry_fsm_sale/models/project_task.py#L658 [2]- https://github.com/odoo/odoo/blob/76717e588bfd012b42e859bfc829257d899c6165/addons/sale/models/sale_order_line.py#L788 opw-5432088
This fix resolves an issue where the amount in words feature was not working for Czech users due to an incorrect language code in the num2words library. A temporary workaround has been added to the system that will be removed once the underlying library is updated in future versions.
Original PR description
The `num2words` library has a bug in the language code they used for Czech (`cz` instead of `cs`). This commit adds a monkey patch to map the correct language code to the existing converter class, allowing the amount in words to work in Czech. The issue was fixed in version 0.5.14 of the library, so this patch can be removed once we use Ubuntu >= 25.10 (Python >= 3.13), that contains the fixed version of the library. [opw-6088697](https://www.odoo.com/odoo/project.task/6088697) Forward-Port-Of: odoo/odoo#257031
This fix resolves an issue where branch companies in demo mode could not disconnect from PEPPOL without encountering errors. The disconnection button was missing from the demo behavior configuration, causing the system to attempt a real external call that was blocked. Now demo mode operates smoothly without requiring external connections.
Original PR description
V18.0 Only When a branch company registers in demo mode, then tries to disconnect, the button that handles the disconnection was not added to the demo behavior so a real call was attempted, which was blocked by another safe guard resulting in an error, idealy in demo mode everything should work without having to make any external calls task-none
This update fixes an issue where PDF reports generated from multiple records would contain duplicate pages in the final merged document. The problem occurred when the system fell back to generating individual PDFs due to mismatched document outlines, but accidentally included both the individual PDFs and the original bulk PDF in the output. This fix ensures clean, non-duplicated PDF reports when downloading multiple invoices or other documents.
Original PR description
When generating PDF reports with multiple records, the system tries to split the concatenated PDF using outlines. In cases where the number of outlines doesn't match the number of records or outlines…
When generating PDF reports with multiple records, the system tries to split the concatenated PDF using outlines. In cases where the number of outlines doesn't match the number of records or outlines are missing, it falls back to generating individual PDFs per record. Steps to reproduce: - Create an invoice - Add in terms section a couple of lines and a heading, so that the invoice span over multiple page and the heading will be positioned on a separate page - Select multiple invoices, including the created one - Download > PDF Without Payment - Open the resulting merged PDF. Issue: The final PDF contains duplicated pages. Analysis: Because of the outline moved to the following page, the number of outlines does not match the number of res_ids. This makes the outlines structure not valid for splitting. When the system falls back to individual PDF generation, it successfully collected the individual streams but also include the original bulk stream to the return value that will be merged together, effectively duplicating the pages in the final output. opw-5394156
This fix corrects how boolean settings are stored and displayed in Odoo's configuration forms. Previously, boolean values were being stored as text strings (like "False") instead of actual boolean values, causing them to display incorrectly as True on the settings form. This ensures that toggle settings now work as intended.
Original PR description
When a boolean field on `res.config.setting` tied to `ir.config_parameter` via `config_param` attribute, the value is incorrectly parse as param store `False` as `"False"` and later being shown as `True` on the setting form. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The leaderboard feature in the user profile section was incorrectly ranking users when filtering by specific time periods like "This Week" or "This Month". Users with high recent activity were appearing much lower in the rankings than they should. This fix ensures users are now correctly ranked based on their actual performance during the selected time period, providing accurate leaderboard results.
Original PR description
[FIX] website_profile, gamification: fix weekly/monthly leaderboards Prior to this commit, the leaderboard pagination logic was flawed when filtering by specific time periods (e.g., "This Week" or…
[FIX] website_profile, gamification: fix weekly/monthly leaderboards Prior to this commit, the leaderboard pagination logic was flawed when filtering by specific time periods (e.g., "This Week" or "This Month"). The system would first retrieve users sorted by their *all-time* global karma, apply pagination (taking the top X users), and only then calculate the karma gain for the specific period for those few users. This caused users with high recent activity but low all-time karma to only be displayed much later in the page order than they should. This commit fixes the issue by introducing a pre-search step that calculates the karma gain for the requested period at the database level. Pagination is now applied to this specific result set, ensuring users are correctly ranked by their actual performance during that week or month. Note: A new method `_get_users_by_tracking_karma_gain` was added to `res.users` to handle this logic. This approach was chosen to strictly preserve the signature of existing methods for the stable version. A distinct refactor to unify these calculation methods is planned for the master branch. Steps to reproduce: - Install the eLearning module. - Create a few users with different karma_points (more than 25 to have 2 pages). - Go to /profile/users. - Group by week. - Paginate, and you will notice that the order is wrong; the first user on the second page might have more points than users on the first page. Also, when the logged-in user is not on that page, they do not appear at the bottom. task-5344657 opw-3979785 Forward-Port-Of: odoo/odoo#176626
This update fixes an unreliable test in the HTML editor's color selector feature. The test was failing inconsistently because the toolbar operates as a popover element, which has timing-related behavior. This fix ensures the test runs reliably every time, improving the stability of our quality assurance process.
Original PR description
The toolbar is a popover and is therefore affected by [1]. runbot-242071 [1] 54da715
Users encountered an access rights error when creating private tasks without a project or assigned users. This fix automatically assigns the task creator as a user when creating a private task, ensuring they have proper access to their own tasks. This resolves a frustrating error that prevented users from creating standalone private tasks.
Original PR description
When users would follow the following step as they are makeing a private task, they would be hit by an incorrect access error. Steps to reproduce: 1.Open the form view to create a new task. 2.Clear…
When users would follow the following step as they are makeing a private task, they would be hit by an incorrect access error. Steps to reproduce: 1.Open the form view to create a new task. 2.Clear the Project field. When empty, it should display the Private placeholder. 3.Ensure no user is assigned to the task. 4.Create the private task. 5.An access rights error occurs, stating that the user does not have permission to create the record. ⚠️ Note: This access rights error only occurs when the task is created directly as private. If a task is created normally and then its project_id and user_ids are removed afterward, no access rights error occurs. Root cause: When a task is created without a project_id and without assigned users, Odoo checks access rights on creation. Since no project members or assigned users exist, no user has access to the record, including the creator. This results in an access rights error during creation. This issue does not occur when modifying an existing task because, after creation, the creator is automatically added as a follower. As a follower, the creator retains access to the task even if it has no project and no assigned users. Fix (implemented): Tasks that have no assigned users and are not linked to any project (private tasks) did not make sense, as they were effectively assigned to nothing. To address this, we now require at least one user to be assigned to a task when it is not attached to a project. This change was made inside of the "project_task_view.xml" file in the "view_task_form_2" record Versions : 17.0 -> master Task [5403926](https://www.odoo.com/odoo/project/4105/tasks/5403926) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242216
This fix prevents interruptions to Polish invoice synchronization by automatically renewing KSeF authentication tokens every 6 days. Previously, tokens would expire after a week, requiring manual re-authentication and causing invoice sending and receiving to fail until the user manually updated their settings.
Original PR description
The KSeF refresh token issued by the Polish Ministry of Finance expires after a week. Once it expires, the automatic fetching of incoming bills and sending of invoices will fail until the user manually re-authenticates in the settings. To ensure uninterrupted synchronization with the KSeF API, this commit adds a new scheduled action that runs every 6 days to automatically renew the tokens. task-6041758 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 fix updates the test validation system to recognize price, currency, and support fields in app manifests for the Odoo apps store. This ensures that apps with pricing information can be properly validated and published to the marketplace without test failures.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255857
Mozambique users were seeing the incorrect Brazilian tax ID label "CPF/CNPJ" on their sales orders and invoices instead of the correct Mozambican label "NUIT". This fix adds the proper tax ID label for Mozambique, ensuring users see the correct terminology on their business documents.
Original PR description
Currently the "Tax ID" title used e.g. on sales orders, invoices, etc. was translated as "CPF/CNPJ" in Portuguese, which is the tax ID used in Brazil. However, in Mozambique, the tax ID is called "NUIT", and there is no language variant for Portuguese in Mozambique. This caused Mozambique users to see "CPF/CNPJ" instead of "NUIT" on their documents, which was wrong. This commit adds a `vat_label` field for Mozambique to display the correct tax ID label. Issue reported by functional support. Forward-Port-Of: odoo/odoo#256603
This fix resolves an issue where replacing the contact form on the /contactus page would cause submission errors. The problem occurred because the system was using email settings from the old form configuration even after the form was deleted and replaced. The fix ensures that email settings are only applied when the original form is still present, preventing mismatches when users create new forms.
Original PR description
Problem: There is a data-for span in the /contactus page that sets specific values on the page's form. If this form is deleted and a new form is added, an error will occur when trying to submit the new form. This is because the value set for website_form_signature will use the email set in the data-for, which will not match with the new form. Purpose: Modify the code that sets the website_form_signature value to ensure that the original form is present as well if using the data-for values. Steps to Reproduce in Runbot: 1. Use the Website Editor to delete the form on the /contactus page and create a new one. 2. Attempt to submit the new form. opw-5956030 Forward-Port-Of: odoo/odoo#253410
This update fixes a bug in the payment demo module by adding proper validation of payment provider configuration. The fix ensures that payment provider settings are correctly validated before use, preventing potential errors or misconfigurations that could affect the payment process.
Original PR description
opw-3097856 Forward-Port-Of: odoo/odoo#256362
This fix resolves an issue where serial-numbered products with multiple partial returns were showing duplicate records and incorrect return status in the inventory report. When customers returned items in multiple shipments, the system was not properly consolidating the return information, leading to confusion about which items had actually been returned. This update corrects the data grouping logic to accurately track all returns for each item.
Original PR description
### Issues: The customer stock.lot.report is not well behaved with respect to multiple partial returns which can lead to returned lots that are not correctly flagged as returned and to duplicate…
### Issues: The customer stock.lot.report is not well behaved with respect to multiple partial returns which can lead to returned lots that are not correctly flagged as returned and to duplicate records. ### Steps to reproduce: - Create a product tracked by SN and put 3 units in stock SN1, SN2, SN3 - Create, confirm and validate a delivery for these two units for Bob. - Click Return, return 1 unit and validate the return for the SN1 - Click Return, return 1 unit and validate the return for the SN2 - Open the contact form of Bob > Lots serial numbers smart button #### > There are two lines referring to SN2 both are flagged as un-returned ### Cause of the issue: In order to determine if a lot has been returned the `stock.lot.report` joins the stock_move_line table with it self based on picking and returns of these: https://github.com/odoo/odoo/blob/109f829c2b461b14167e9227e42d096d4410a3b3/addons/stock/report/stock_lot_customer.py#L48-L71 Records are then grouped to represent single move lines and a move line is expected to be returned to be returned if it is related to at least one move line on a return of its picking sharing the same lot related data (see the definition of `has_return`): https://github.com/odoo/odoo/blob/109f829c2b461b14167e9227e42d096d4410a3b3/addons/stock/report/stock_lot_customer.py#L22-L34 Now the issue is that the group by close actually group records based on the `sml_return.id`: https://github.com/odoo/odoo/blob/109f829c2b461b14167e9227e42d096d4410a3b3/addons/stock/report/stock_lot_customer.py#L73-L89 which does not make sense since we expect to aggregate `sml_return.id`'s to compute the `has_return` field and since we do not want a move line of the original delivery to appear twice simply because it is linked to two returns one with and one without returned move line. opw-5974155 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix resolves a system crash that occurred when trying to delete a custom field that was being used in a website form. The issue was caused by incorrect parsing of HTML content when checking if a field was in use. Now the system properly validates field usage before deletion, preventing the crash and protecting your data.
Original PR description
Steps to reproduce ================== tl;dr: html fields are parsed as xml - Go to Helpdesk > Tickets > Warranty - Open studio - Add a new text field named "TEST" - Remove it from the view - Exit studio - Go to the website - Click on new - Add a new blogpost - Set a title and save - Click on "Contact & Forms" - Click on the first block - Click on the form - Change the form action to "Create a ticket" - Click on "+ Field" - Change the Type selection to "TEST" - Click on save - Enable debug mode - Go to "Settings / Technical / Database Structure / Fields" - Type x_ in the search bar and press enter - Delete the field => lxml.etree.XMLSyntaxError Cause of the issue ================== When deleting a field, `_check_if_used_in_website_form` is called to prevent the deletion if a field is used in an html field. The html fields were parsed with an xml parser.. opw-5946029
Fixed a bug where shipping costs were incorrectly calculated when orders contained combo products. The system was counting both the combo product and its individual components in the quantity calculation, resulting in inflated shipping fees. Now only the component quantities are used for shipping cost calculations.
Original PR description
**Issue:**
When using a delivery method that has a shipping cost based on the quantity of the product, the shipping cost is incorrect if there is a combo product. The quantity of the combo product was added to the total quantity of its components.
**How to reproduce:**
1. Create a delivery method based on rules.
2. Create a rule that uses the quantity (ex: 0$ + 5$ times the quantity)
3. Create a combo product
4. Create a sale order and add the combo product to it
5. Add the shipping
=> The shipping cost is incorrect
ex: With 1 combo choice, the shipping cost is doubled
**Fix:**
When calculating shipping cost, skip the sale order line of the combo product and only use the sale order lines of the components.
opw-6016209
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fix prevents employees from selecting payment methods that are linked to inactive journals when submitting expense sheets. By filtering out inactive journals, the system ensures only valid and active payment options are available, reducing errors and confusion during the expense submission process.
Original PR description
Add the domain ('journal_id.active', '=', True) in selectable_payment_method_line_ids so only payment methods linked to active journals are selectable.
This prevents selecting payment methods from inactive journals in expense sheets.
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-prThis fix improves how Odoo extracts embedded files from PDF documents. Previously, PDFs organized with a specific file structure (/Kids nodes) would not have their attachments extracted, resulting in empty bills in the accounting module. The update now supports both common PDF file organization methods, ensuring all embedded documents are properly detected and extracted.
Original PR description
Steps to reproduce: - From the accounting dashboard, upload a PDF containing intermediate /Kids nodes representing separate xml attachments Issue: No xml will be extracted, as result the bill will be empty. However, in the chatter pdf preview, the js pdf toolkit correctly show the xml attachemnts. Analysis: The PDF spec defines two ways to organize embedded files under /EmbeddedFiles in the document's name dictionary: - /Names: a flat array of pairs located directly under /EmbeddedFiles - /Kids: an array of child nodes, each of which carries its own /Names array. The extractor currently only handled the /Names case, not detecting embedded attachments in case of PDF using a /Kids tree. This change add lookup for both structures. opw-5929274 Forward-Port-Of: odoo/odoo#252523
This fix resolves a problem where website assets fail to load properly after being regenerated in Odoo systems using PostgreSQL primary/replica database configurations. When assets are regenerated, the system now correctly retrieves them from the primary database instead of attempting to read from the replica before replication has caught up, ensuring consistent website performance.
Original PR description
When `/web/assets/...` is requested on a readonly route and the bundle is missing, Odoo regenerates it on the primary using a RW cursor. It can then still try to read the freshly created…
When `/web/assets/...` is requested on a readonly route and the bundle is missing, Odoo regenerates it on the primary using a RW cursor. It can then still try to read the freshly created `ir.attachment` through the original RO/replica env. In a primary/replica setup, replication may not have caught up yet, so the new attachment is not visible on the replica. As a result, readonly `/web/assets/...` requests can fail right after asset regeneration when fetching the freshly generated bundle. Steps to reproduce: 1. Configure Odoo with a PostgreSQL primary/replica setup. 2. Open a website in edit mode. 3. Trigger an asset regeneration (for example by changing a theme color). 4. Let the resulting readonly `/web/assets/...` request fetch the freshly generated bundle. Build the response stream from the RW env after regeneration instead of rereading the fresh attachment through the RO/replica env. opw-6034833 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A test in the recruitment module was failing during a specific time window (23:00-24:00 UTC) due to timezone handling issues. The fix ensures the test properly accounts for user timezones when checking activity dates and uses time freezing to prevent failures near midnight.
Original PR description
The test was failing between 23:00 and 24:00 UTC due to the activity being created the previous day for a user in UTC+1, since Date.today() wasn't considering the current's user timezone. Also, use `freezetime` to avoid running the test close to midnight. runbot-241150
Fixed an issue where the HTML editor toolbar would not appear when Mac users selected text using Cmd+Shift+Arrow keyboard shortcuts. The fix adds a fallback mechanism that detects text selection changes, ensuring the toolbar displays properly on macOS where certain keyboard events behave differently than on other operating systems.
Original PR description
Problem: The toolbar does not open when using Cmd+Shift+Arrow to select text on macOS. Cause: On macOS, when the Cmd key is held down, the `keyup` event is never fired for other keys. The toolbar…
Problem:
The toolbar does not open when using Cmd+Shift+Arrow to select text on macOS.
Cause:
On macOS, when the Cmd key is held down, the `keyup` event is never fired for other keys. The toolbar relies on `keyup` for Arrow keys to re-enable `onSelectionChangeActive` and trigger the toolbar update, so it never opens.
See section ("Issue 3 - keyup event put on hold for other keys"): https://web.archive.org/web/20160304022453/http://bitspushedaround.com/on-a-few-things-you-may-not-know-about-the-hellish-command-key-and-javascript-events/
Solution:
Track when an Arrow key is pressed while Cmd is held (`pendingArrowKey`) and use a `selectionchange` listener as a fallback to re-enable the toolbar. The `selectionchange` event fires reliably on macOS even when `keyup` is suppressed. A `isMouseDown` guard ensures the listener does not interfere with the existing mousedown/mouseup flow.
Steps to reproduce:
1- Type some text
2- Use Cmd+Shift+Arrow (left or right) to select text 3- Observe the toolbar does not appear
task-6013408
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fix allows companies to use their delivery address and GLN number when sending self-billing invoices through Peppol. Previously, even if a delivery address was configured on the company, it was ignored during invoice transmission. Now the system properly includes the delivery contact information in the exported invoice documents.
Original PR description
**PROBLEM** When selfbilling with peppol, we have no way of providing a GLN number, or modifying the delivery address. Even if we create a delivery address partner on the current company partner, it's not taken into account. **STEP TO REPRODUCE** 1. Create a delivery address on the current company, set up a GLN number. 2. Configure the purchase journal to do selfbilling. 3. Create a vendor bill with this journal and send it using peppol. 4. Download the xml, and look for the Delivery tag, and notice it doesn't have the GLN number. **FIX** We search for a delivery address on the current company. If there is one, we use it for the Delivery tag. opw-6014374
Fixed an issue where event ticket prices were incorrectly showing a struck-through original price when a fixed price rule was applied, making it appear as a discount. The system now properly distinguishes between discount rules and fixed price rules, ensuring pricing displays consistently with the eCommerce shop behavior.
Original PR description
Event tickets show a struck-through original price even when a "Fixed Price" pricelist rule is applied, making it incorrectly appear as a discount. This is inconsistent with eCommerce shop behavior.…
Event tickets show a struck-through original price even when a "Fixed Price" pricelist rule is applied, making it incorrectly appear as a discount. This is inconsistent with eCommerce shop behavior. ### Steps to reproduce 1. Create an event with a paid ticket (e.g., 100 EUR). 2. Create a pricelist with a "Fixed Price" rule for that ticket (e.g., 80 EUR). 3. Open the event registration page. 4. The 100 EUR appears struck-through next to 80 EUR. ### Cause Odoo's website only shows a struck-through original price for discount rules, not fixed price rules. By design, a fixed price replaces the original rather than reducing it. However, the event registration page used a simplified check: it compared the final price to the original and assumed any difference was a discount. This ignored the rule type, incorrectly flagging fixed price rules as discounts. ### Fix Rationale A new helper method on the event ticket model now queries the applied pricelist rule to determine if it qualifies as a discount. opw-5993477
This fix ensures that units of measure are now displayed on backorder lines in delivery slip reports, matching the display of other delivery lines. Previously, backorder lines were missing unit information due to a group restriction that has now been removed, providing clearer and more consistent delivery documentation.
Original PR description
**Steps to reproduce:** * Install the **Stock** module with demo data. * Create a delivery with quantity **N** and click **Mark as To Do**. * Set the delivered quantity to less than the demanded…
**Steps to reproduce:**
* Install the **Stock** module with demo data.
* Create a delivery with quantity **N** and click **Mark as To Do**.
* Set the delivered quantity to less than the demanded quantity .
* Validate the delivery, with the creation of a **backorder**.
* Print the **Delivery Slip** report.
**Observed behavior:**
* Backorder lines appear **without units of measure**, while
other lines correctly display their units.
**Cause:**
* The backorder line includes a **group restriction** that hides
the unit unless the *Unit of Measure* setting is enabled.
**Fix:**
* Remove the group restriction so units of measure are
always visible on backorder lines same as others.
<details>
<summary>Click here to see the results:</summary>
Before:
<img src="https://github.com/user-attachments/assets/5f21139a-a4ab-4c39-8b16-3c68c94a163e" />
After:
<img src="https://github.com/user-attachments/assets/dd4de18b-dc2e-4686-8435-30864fe40aa4" />
</details>
---
> NOTE - This fix done after receiving confirmation from PO(dala)
---
opw-5265051
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr