Daily updates from Odoo
Friday, June 12, 2026
36 changes · master
New functionality added to Odoo
This update allows Odoo to import product data directly from PrestaShop stores running version 1.7 and later. This simplifies the process of bringing existing e-commerce catalogs into Odoo, saving time and effort for our users. It expands Odoo's capabilities to integrate with a wider range of online marketplaces.
Original PR description
Adds support for importing PrestaShop (PS) products from PS version 1.7 and up.
This update introduces the ability for employees to manage multiple company vehicles through Odoo. Previously, each employee was limited to a single vehicle, which is now being expanded to better accommodate business needs and employee requirements. This change simplifies vehicle tracking and reporting.
Original PR description
WIP to allow multiple company cars per employee
Enhancements to existing features
This update enhances the softphone's contact search functionality during call transfers. It now prioritizes internal users (colleagues) when searching, making it faster and easier to transfer to someone within the company. This improves the user experience by reducing irrelevant search results and streamlining the transfer process.
Original PR description
The softphone displays searched contacts grouped by the first letter of their name. This commit creates an extra group "Internal" at the top regrouping all internal users of the database, only when a search is performed, only while searching for a contact to which a call has to be transferred. Indeed, when transferring, it is likely you want to transfer to one of your colleague, and after a 2-3 letters search, it should be enough for your colleague to be nearly alone in its "Internal" group, while searching for "James" could lead to 100 "James" in the "J" section regrouping all the contacts your company is dealing with. Follow-up of task-5404888 task-5871346
This update expands the meal voucher report to include data for all companies within an organization, including parent and child branches. Previously, the report was limited to a single company. This change improves reporting accuracy and provides a more complete view of employee expenses.
Original PR description
- Added selection of company (only top-level can be selected so the report won't be partial or context dependant) - Company selection is done automatically if there's only one valid candidate - The report cannot be validated without a top level company and a top-level company cannot be selected if the user has not access to it - Used branch_ids to gather all branches that need to be computed [a root branch can be defined as a branch that has no parent or a branch which root_id is equal to its id] - Used sudo to make sure all subbranches can be computed #task-6220264
This update allows users to efficiently edit multiple sales orders simultaneously through a new 'mass editing' feature on the sales order list views. This streamlines the process of updating large numbers of orders, saving significant time and improving operational efficiency. Previously, changes required editing each order individually.
Original PR description
Enable multi_edit on sales order list views to allow mass editing. See also:https://github.com/odoo/odoo/pull/266345 task-6227460
This pull request updates the design of the Frontdesk welcome screens, enhancing their responsiveness and overall appearance. The changes aim to provide a more modern and user-friendly experience for new Frontdesk users. This is an important improvement to the user interface.
Original PR description
Follow-up of: - https://github.com/odoo/enterprise/pull/119827 Redesign of the welcome screens. Improved responsiveness and design task-6022341
This update simplifies the process for companies using fiscal years different from the calendar year. Previously, users had to manually configure return type periods for each type, which was difficult to find and manage. Now, companies can easily set these periods at the start of their returns set, improving efficiency and accuracy.
Original PR description
When a company has its fiscal year different than the calendar year, return types periodicities rarely follow an universal rule. Those rules vary a lot depending on the country. Currently, the only way for users to configure them is to open the return types and configure the desired periodicity & start date for each return type individually -> The discoverability is bad. Users should be able to configure it easily at the start of the returns set task: 5913359
This update improves the Field Service product to align with the new field service feature, streamlining the setup process. Additionally, a simplification was made to the planning role configuration, removing a requirement for resource assignments and allowing for more flexible resource selection within the auto-planning feature.
Original PR description
…duct This commit updates the Field Service product to better fit the new field service feature. task-5264800
This update simplifies the appraisal process for all users by adding a helpful message and adjusting access controls. Light users now have a streamlined view with simplified fields, while managers retain full editing capabilities for goal assignments. This enhances usability and ensures the right level of access for each user type.
Original PR description
### Dashboard: Added a helper message "Request an Appraisal with your manager to assess your work" to the empty state view of appraisals. ### Goals Form: - Set employee_id to invisible for light users to simplify the view. - Restricted the visibility of the "Save as Template" button to exclude light users. - Updated the manager_id field to be editable for light users, allowing them to assign or update their supervisors on specific goals. task-6133003
This update improves AI chat by allowing it to display rich, clickable previews of website records like products and events. Previously, AI responses only showed record names. Now, users can quickly access detailed information directly from the chat, boosting efficiency and engagement. This enhancement leverages website data to provide a more comprehensive and user-friendly experience.
Original PR description
### Summary This PR adds **AI preview cards** for website records. When an AI agent returns supported website content, the chat can now show rich, clickable cards instead of only plain record names.…
### Summary This PR adds **AI preview cards** for website records. When an AI agent returns supported website content, the chat can now show rich, clickable cards instead of only plain record names. Supported records include products, product variants, events, blog posts, appointment types, courses, lessons, and jobs. ### What changed #### Record preview flow Add `_ai_tool_prepare_record_previews` to prepare AI search results for display before the final answer is posted. The tool keeps the result order, stores preview links in the message body, and exposes metadata that the frontend can use to either render visual cards or keep normal records' links visible when cards are not available. #### Website card rendering Introduce `ai.preview.card.mixin` for website models that support visual previews. Each website bridge module provides its own `_ai_get_preview_cards_render_context`, so preview cards reuse the same public website templates and styling as the corresponding website pages. #### Frontend integration Add the `AIPreviewCardSet` component, preview-card cache, styling, and carousel behavior. Cards are rendered in website AI chat and embedded livechat. For embedded livechat, cards are injected through a light-DOM slot so website styles can still apply across the livechat shadow DOM. #### Website-aware pricing Add `ai.product.pricing.mixin` to expose website-aware pricing metadata for products, appointments, and paid slide channels. --- task-id-5153868
This update clarifies payslip corrections by showing the exact amount adjusted on PDF reports, rather than displaying original figures. It presents the difference in key figures like salary and worked days, making it easier to understand the change. The system now automatically handles related refunds and payments for accurate accounting.
Original PR description
When a payslip is corrected, the resulting correction payslip represents an adjustment, not a full re-statement of earnings. Showing absolute values on the PDF was confusing: the employee would see…
When a payslip is corrected, the resulting correction payslip represents an adjustment, not a full re-statement of earnings. Showing absolute values on the PDF was confusing: the employee would see the same gross/net figures as the original, making it unclear what actually changed. This PR makes correction payslips display the difference from the original in the PDF report (worked days, salary lines, totals), so it is immediately clear what was adjusted and by how much. On a correction PDF report, the Qty, Amount, and Rate columns are handled: - If only one of these three fields has changed, the report shows the delta for that field and the original values for the others, so that the product of the columns matches the total delta. - If two or more fields has changed, only the Total delta is shown, as a calculated product of multiple deltas would be misleading. To support this, two computed fields are introduced on hr.payslip: is_correction_payslip (True when the slip has an origin and is not a refund) and correction_net_delta (the net wage difference vs. the origin). A few related improvements are bundled: - The reverted (refund) payslip is automatically validated and created as a refund of the origin, while the correction payslip is left in draft. - Reverted payslips are excluded from PDF generation and e-mail notification. - When paying a correction, the system groups the amount between the correction and its corresponding reverted payslip and marks both as paid once the payment is confirmed (unless the reverted payslip was already paid). - When a negative correction delta occurs (the employee was overpaid), the workflow uses the existing negative-net warning: the correction sets 'has_negative_net_to_report' and 'negative_net_to_report', so the usual warning and salary attachment flow will handle recovery on next payslips. - The "wrong version" and issues detection now accounts for worked-day-level versions and time-off changes on already-paid payslips. - The related payslips smart button has been extended to corrections and reverts to access their origin and its related slips.
This update modernizes the Romanian D300 VAT report generation within Odoo, aligning with the latest requirements from the ANAF (Romanian tax authority). It now creates an XML file, completing the necessary flow for submitting the report and ensuring compliance. This improves the accuracy and reliability of financial reporting for Romanian businesses using Odoo.
Original PR description
Rename VAT report fom Romania and generate XML file to complete flow for D300 return complying with the latest ANAF specifications. https://static.anaf.ro/static/10/Anaf/Declaratii_R/300.html task-5423935 Forward-Port-Of: odoo/enterprise#109849
This pull request completely redesigns the appointment booking page, focusing on a cleaner mobile experience and simplified flow. Key changes include a foldable calendar, harmonized user selection, streamlined data loading, and automated confirmation features, resulting in a more intuitive and efficient booking process.
Original PR description
The slot selection page in appointment has been changed a large number of times. Adding a lot of small features to a complex flow made the code a mix of old and new, mixing interaction features and…
The slot selection page in appointment has been changed a large number of times. Adding a lot of small features to a complex flow made the code a mix of old and new, mixing interaction features and DOM manipulations. Parts were starting to get outdated, and the flow extremely complex to maintain, as comporting a lot of variation depending on the appointment type setup. Main changes --- In order to modernize the UI of the page, as well as to provide a cleaner mobile experience, we redesign it completely, rebuilding the js code and templates around the existing fundations. - The calendar is now foldable in a dropdown - The user / resource selection is harmonized: cards are used for both values of select_first (entity / date) - Selection is also foldable in a dropdown when starting with the entity. - Loaders and helpers are harmonized and streamlined into fewer cases / elements on the page. - When capacity is managed, 2 is selected as default if possible. We fallback to 1 otherwise. - The two-column design is abandoned. Also, some auto-confirmation is implemented: - When clicking on an entity, when it is last thing to select, submit the slot selection. - When selecting the time for the slot, submit the selection if no additional step is required. Technical Improvements --- - The previous way to refresh the availability was to rerender the full calendar template in the controller, return it and replace its outerHtml in the page. This is not dynamic nor interactive. We changed this old behavior to a more classical approach: the controller only returns a JSON with relevant data, and we render the calendar directly from the JS. We therefore moved the template into a JS one. - Controllers are cleaned from redundant data, and reworked to match previous change. - JS is streamlined as much as possible, reducing unjustified differences between similar elements. Interaction features are exploited as much as possible Other changes --- - Currently, we only compute one month of availability at a time for performance reasons. Keep this behavior, but replace the context key by real arguments in the controller. Also enable this behavior for flexible appointments - Remove 'discard' button when adding guests - Some ui polishing of various views in the booking flow - Added a small summary, only visible on mobile, at the top of the registration page. This allows a quick look in the booking details on mobile before starting filling details. Task-5358867
Resolved issues and error corrections
This update resolves an issue where users were locked out of the documents list view after attempting to edit a row. The fix ensures the view correctly exits edit mode when a user clicks away, restoring normal functionality and preventing user frustration. This improves the overall user experience.
Original PR description
Problem: When a user selects a row, attempts to edit a cell, and then clicks away without saving, the view becomes unusable. The selected row remains highlighted, and the system prevents the selection of other lines. The user is locked out until they click the "Save" or "Discard" buttons. Cause: The UI becomes stuck in edit mode. The `onGlobalClick` event handler within `documents_list_renderer` was missing the method call to exit edit mode. Solution: Updated `onGlobalClick` to correctly trigger the method to leave edit mode. task-6059836 Forward-Port-Of: odoo/enterprise#119594 Forward-Port-Of: odoo/enterprise#113000
This update resolves an issue where cancelled journal entries were incorrectly displayed in the reconciliation view, preventing successful reconciliation and causing data inconsistencies. The fix removes a recent change that allowed draft entries in the reconciliation view, ensuring cancelled entries are properly excluded.
Original PR description
Issue: Cancelled journal entries were visible in the "Journal Items to Reconcile" view (action_move_line_posted_unreconciled) because the action domain had no filter to exclude them. This caused…
Issue: Cancelled journal entries were visible in the "Journal Items to Reconcile" view (action_move_line_posted_unreconciled) because the action domain had no filter to exclude them. This caused reconciliation failures, no reconciliation happened, and the cancelled record remained in the view. This regression was introduced during a refactor to allow draft entries in the reconciliation view, where the posted-state condition was removed from the domain: Enterprise commit: https://github.com/odoo/enterprise/commit/003cffabda7d91a6d10d58942ed972ca5e17366d As a result, cancelled journal items also became visible, causing reconciliation attempts to fail while the records remained in the view. Also, we are not allowed to reconcile cancelled move lines, and we already have the validation for this [here](https://github.com/odoo/odoo/blame/a236f67776616f6facdefb0117a6ffdde9b7c84c/addons/account/models/account_move_line.py#L2627) Issue is reproducible on runbot. Here is the video reference: https://drive.google.com/file/d/1ojIDxHn5Yst8gVFy8JyhwtJoDSSSJsmK/view?usp=sharing - OPW: 6247870 Forward-Port-Of: odoo/enterprise#119017 Forward-Port-Of: odoo/enterprise#118773
This update fixes a bug where credit limit warnings weren't correctly accounting for bank payments. Now, the system accurately calculates outstanding balances, including bank payments, ensuring warnings only appear when a customer exceeds their credit limit. This improves financial reporting accuracy and prevents unnecessary alerts.
Original PR description
Before this fix: The credit limit warning calculation only considered credit notes but ignored outstanding bank payments when computing the partner's effective outstanding balance. For example, if a…
Before this fix: The credit limit warning calculation only considered credit notes but ignored outstanding bank payments when computing the partner's effective outstanding balance. For example, if a customer had a credit limit of 1,000 and an invoice of 2,000 was created, then a bank payment of 1,500 was received, the warning would still incorrectly appear showing the customer exceeded their limit (2,000 > 1,000), even though the actual outstanding amount was only 500. After this fix: The credit limit warning now properly includes outstanding bank payments in the calculation. Two cases are handled: - Bank payments received but not yet matched to any invoice, these are identified by their open suspense account entry and deducted from the partner's outstanding exposure. - Bank payments already matched to the invoice, the reconciled amount is read from the invoice's receivable line and deducted accordingly. So with this fix, after a 1,500 bank payment, the system correctly recognises the outstanding amount as 500 and does not show a warning since it is within the 1,000 credit limit. task-5427613 Forward-Port-Of: odoo/enterprise#119829 Forward-Port-Of: odoo/enterprise#118957
This update resolves an error that occurred during DHL delivery confirmations when the scheduled delivery date was missing or set to a past time. The system now automatically adds one hour to the delivery date, preventing the error and ensuring successful order confirmations. This improves the reliability of DHL shipping confirmations.
Original PR description
When confirming the delivery of an order using DHL shipping method we get an error that the date must be in the future. This happens when the scheduled date was not set, or set for a time in the past. This commit automatically sets the time to 1 hour in the future and bypasses the user error. opw-6148927 Forward-Port-Of: odoo/enterprise#116211
This update fixes a bug in the year-end tax calculations for Indonesian employees. Previously, a hardcoded rule incorrectly set tax allowances for employees using contract types other than 'Permanent Employee'. The update introduces new employee types and adjusts the rule to accurately calculate gross-ups for all employee types, ensuring correct PPh 21 calculations.
Original PR description
The JABATAN salary rule condition was hard-coded to check against `hr.contract_type_employee`, so employees using any other employee type would incorrectly get JABATAN = 0, producing a wrong tax allowance in year-end / termination PPh 21 recalculation.
Introduce two new Indonesia-specific employee types: "Permanent Employee" and "Non-Permanent Employee". The JABATAN rule now checks against the employee type code ("PERMANENT"), allowing users to tag multiple types as permanent if needed.
task-6215687This update fixes an issue where the 'Cancel Reason' wasn't being properly transmitted to the Peruvian EDI (SUNAT) documents when reversing invoices. The change ensures that all cancellation details, including the user-provided reason, are accurately reflected in the electronic credit note, meeting regulatory requirements. This improves data accuracy and compliance for Peruvian businesses using Odoo.
Original PR description
### Issue before this commit: When reversing an invoice in a Peruvian company, the "Cancel Reason" entered in the credit note window is not propagated to the Peruvian EDI tab of the resulting Credit…
### Issue before this commit: When reversing an invoice in a Peruvian company, the "Cancel Reason" entered in the credit note window is not propagated to the Peruvian EDI tab of the resulting Credit Note. Only the Credit Reason is successfully reported. ### Steps to reproduce the issue: 1. Download Accounting and l10n_pe 2. Switch to PE company 3. Create an invoice and confirm it 4. Create a credit note for the invoice with a cancel reason and a credit reason and click the reverse button 5. See that in the Peruvian EDI tab only the Credit Reason is reported but not the Cancel Reason ### Cause of the issue: In the l10n_pe_edi module, the override of the _prepare_default_reversal method maps the l10n_pe_edi_refund_reason to the new move's values, but completely omits the mapping of the wizard's textual reason field to the l10n_pe_edi_cancel_reason field of the resulting credit note. ### Reason to introduce the fix: To ensure the generated credit notes contain all required information for the Peruvian EDI (SUNAT). Mapping the cancel reason guarantees that the electronic document accurately reflects both the refund code and the descriptive cancellation text provided by the user. opw-6238525 Forward-Port-Of: odoo/enterprise#119610 Forward-Port-Of: odoo/enterprise#118479
This update corrects issues with VoIP call records not accurately reflecting user presence, particularly when calls were stuck in an ongoing state. It ensures call records are consistently updated, improving the accuracy of call status displays and preventing misleading presence indicators. This improves the overall user experience and data reliability.
Original PR description
[FIX] voip: make sure any create/write on voip.call syncs user presence Commit [1] introduced a "in-call" presence icon. Before this commit, code updating call records had to call a specific function…
[FIX] voip: make sure any create/write on voip.call syncs user presence
Commit [1] introduced a "in-call" presence icon. Before this commit,
code updating call records had to call a specific function if user
presence potentially had to be changed after the record update. While
not hacking create/write to do that might be prettier, it is also
subject to mistakes and one was already made: demo data call record
creation did not update user presence properly. Commit [2] indeed
introduced calling/ongoing call demo data and the user presence was not
correct just after database initialization.
This commit fixes that by now potentially syncing in writes and always
syncing on create.
[FIX] voip: unstuck user call presence sooner in case of stuck calls
At the moment, the Odoo phone has a freshness system for call records
that appear still calling/ongoing for a strange duration. Indeed, there
are still cases where a call ended and we could not detect it. For
example, the user simply closing the tab where a call is ongoing (we try
to warn the user before he leaves but if agrees to leave anyway, the
call is just stopped when connexions are lost but the call record stays
marked as "ongoing"). In those cases, we have 2 things:
- A once-a-month cron checks all cases that are calling for more than
5 minutes or ongoing for more than 4 hours. It moves them to "ended
unexpectedly".
- The displayed status in views, shows "calling" / "ongoing" only if the
record is not older than 5 min / 4 hours. Otherwise it shows "ended
unexpectedly" already (as if the cron already did its job), despite
the record still having the "calling" / "ongoing" status.
It is weird and non-perfect but this allows to not have a "heavy" cron
job and consistent-enough call records display in views.
Of course, the long-term plan is to have more reliable call records
status (PBX, ...).
A new problem related to this appeared though. Since [1], a call icon
is used as the discuss presence icon in case the user is currently on a
call. The "currently on a call" data being transferred based on a field
"has_active_call" synchronized on call operations. Problem: in the case
mentioned above (call stuck in ongoing), that field will stay wrong for
a full month, showing the user as being on call. This commit makes it
so the check for active calls now considers fresh-enough calls (just
like the display in views does). It is only updated on a new call
operation though, so if an user has a stuck call, he will still be shown
as being on call until he starts/ends another call (or manually correct
the stuck call record).
Again, hopefully, stuck call records will be a thing of the past soon
enough so that issue will be minimized.
Note: this also uses `effective_start_date` instead of `start_date` to
check for stale calls, as it handles the potential no start_date while
ongoing that would stay stuck forever (that should not happen but,
better safe than sorry).
[FIX] voip: not consider incoming calling calls for presence status
Commit [1] introduced a "in-call" presence status. Commit [2], alongside
several fixes (e.g. parents of this commit and mentioned commit),
introduced new call demo data, including calling/ongoing calls:
- One incoming calling for Mitchell Admin
- One outgoing calling for Marc Demo
- One incoming ongoing for Marc Demo
- One outgoing ongoing for Marc Demo
Consequence: both Mitchell Admin and Marc Demo always have the "in-call"
presence icon, which might not be the best for demo. Still nice to test
VoIP but misleading for the rest.
In the end, we can have the best of both worlds: at the moment Mitchell
Admin only has an incoming calling call... and actually, that kind of
situation should not lead to being consider as "in-call". Calling
someone does, but receiving a call that we are potentially ignoring at
the moment does not.
This commit makes it so incoming calling calls are not considered for
presence anymore, at the same time thus making Mitchell Admin presence
not impacted by default VoIP demo data.
[1] - https://github.com/odoo/enterprise/commit/f1e0c41fa7b4f425e45303e5e912bf093c56480a
[2] - https://github.com/odoo/enterprise/commit/f16faa029220ca7152289180c4de78783bab03be
task-6239844
Forward-Port-Of: odoo/enterprise#118645This update resolves an issue preventing users in Peru from generating closing entries within their tax reports. The fix introduces a dedicated Peruvian tax report variant, ensuring accurate VAT calculations and restoring the automatic closing account configuration process. This improves the reliability of financial reporting for Peruvian businesses.
Original PR description
### Issue Since the introduction of the Tax Returns feature in 18.3, it was no longer possible to generate a Closing Entry as the button has been replaced by Returns The Return mechanism implies that…
### Issue Since the introduction of the Tax Returns feature in 18.3, it was no longer possible to generate a Closing Entry as the button has been replaced by Returns The Return mechanism implies that you need a Return Type in order to make a Closing Entry using the Validate button Additionally, using the Generic Tax Report by default creates a risk in Multi-VAT environments, as it mixes taxes from all countries instead of isolating Peruvian taxes ### Cause The new 18.3 accounting workflow requires at least one active Return Type associated with a country-specific report variant to display the Return options and process the closing entry Peru was relying on the Generic Tax Report, without a dedicated report variant No Return Type was configured, which blocked Odoo's automatic VAT closing workflow and prevented the system from prompting the user to configure the required closing accounts ### Steps to reproduce - Install `l10n_pe_reports` and `accountant` - Switch to a PE Company - Go to the Tax Report Before the fix, no Returns button is available for any of the existing reports, making it impossible to use Odoo's automatic process to configure the tax accounts and trigger the closing entry ### Notes This is fixed by creating a dedicated Peruvian tax report variant directly in Enterprise that inherits from the generic tax report A custom handler is added to force the domain filtering on Peruvian taxes only, and a corresponding Return Type is defined to restore the full closing entry process safely opw-5978673 Forward-Port-Of: odoo/enterprise#117891
This update fixes an issue where DATEV exports incorrectly included EU-specific fields for customers outside the European Union. The change ensures that the correct country information ('Land' field) is populated for non-EU customers, aligning with DATEV's data format requirements. This improves data accuracy and compliance for international reporting.
Original PR description
### Issue: In DATEV customer and supplier exports, partners outside the European Union still had the `EU-Land` and `EU-UStID` fields filled However, these fields must only be used for EU countries…
### Issue: In DATEV customer and supplier exports, partners outside the European Union still had the `EU-Land` and `EU-UStID` fields filled However, these fields must only be used for EU countries For non-EU countries, the `Land` field should be filled instead, and is required whenever the country is not Germany https://developer.datev.de/en/file-format/details/datev-format/format-description/debitorskreditors ### Cause: `_l10n_de_datev_get_partner_list` did not distinguish between EU and non-EU countries As a result, any partner with a VAT number could populate `EU-Land` and `EU-UStID`, even if the country was outside the EU Greece also requires a special case: its VAT prefix is `EL` so the `EU-Land` too, while the country code used in `Land` must remain `GR` ### Steps to reproduce: - Install `l10n_de_reports` and switch to the DE company - Create a customer in Switzerland with a valid VAT number - Create and confirm an invoice for that customer - Go to Accounting → Audit Reports → General Ledger - Select the full year - From the gear menu, export DATEV DATA (zip) - Open the `EXTF_customer_accounts` file ### Before the fix: `EU-Land` and `EU-UStID` are filled for the Swiss customer, while `Land` is empty ### After the fix: `EU-Land` and `EU-UStID` are empty for non-EU countries such as Switzerland, while `Land` is correctly filled `Land` is filled using the following priority: 1. Partner country_code 2. Country extracted from the VAT number 3. Empty opw-5902565 Forward-Port-Of: odoo/enterprise#119780 Forward-Port-Of: odoo/enterprise#113835
This update resolves an issue where users were encountering errors when attempting to use property fields within auto-fields in the Sign module. The fix restricts property field selection, ensuring data integrity and preventing the original error.
Original PR description
Currently, an error occurs when user tries to select a property field in auto field. Steps to replicate: - Install `sale_management` and `sign`. - Open Sales > Products > Products > Open any product.…
Currently, an error occurs when user tries to select a property field in auto field.
Steps to replicate:
- Install `sale_management` and `sign`.
- Open Sales > Products > Products > Open any product.
- From the Gear icon, Click Edit Properties and save the record.
- Enable Debug mode if you are using a version lower than 19.0 .
- Open Sign > Configuration > Field Types.
- Create a new Field > Give a name > Select model as `Product`.
- Select Field as `Property > Property 1` and click save.
Error:
- saas-18.3 and later:
```
File '/home/odoo/odoo18/enterprise/sign/models/sign_item_type.py', line 57, in _check_auto_field_exists
auto_field_value = record.mapped(sign_type.auto_field)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File '/home/odoo/odoo18/community/odoo/orm/models.py', line 5472, in mapped
field = records._fields[field_name]
^^^^^^^^^^^^^^^
AttributeError: 'Property' object has no attribute '_fields'. Did you mean: 'field'?
```
- saas-18.2:
```
File '/home/odoo/odoo18/enterprise/sign/models/sign_item_type.py, line 41, in _check_auto_field_exists
auto_field_value = record.mapped(sign_type.auto_field)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File '/home/odoo/odoo18/community/odoo/orm/models.py', line 5744, in mapped
if len(records) > PREFETCH_MAX:
^^^^^^^^^^^^
TypeError: object of type 'bool' has no len()
```
Cause:
- As the user gave auto fill field as a Property field the [line] called `mapped()` to access its value, this caused the error to occur.
- This occurs because `mapped()` expects a `recordset` (models.Model), but instead it receives a Property object, which does not have `_fields`.
Solution:
- Using `'allow_properties': 'False'`, the property fields wont appear in the list of field selection.
[line]: https://github.com/odoo/enterprise/blob/cdaeb79e1f623831fffa553dbb658698367c7e19/sign/models/sign_item_type.py#L41
sentry-7378769090
Forward-Port-Of: odoo/enterprise#119641
Forward-Port-Of: odoo/enterprise#113091This update resolves a performance issue impacting the calculation of payroll data (DPV). The fix optimizes a key process within the Be-HR payroll module, leading to faster and more efficient payroll processing. This ensures accurate and timely payroll calculations for our Belgian clients.
Original PR description
Forward-Port-Of: odoo/enterprise#118996 Forward-Port-Of: odoo/enterprise#118929
This update resolves an issue where PDF reports for Mexican SAT Invoices didn't accurately reflect changes in the underlying CFDI XML data. Now, the reports directly use the CFDI data, ensuring accurate representation of product information, taxes, and discounts. This improves the reliability of Mexican invoice reporting within Odoo.
Original PR description
In Mexico, the pdf of a SAT Signed Invoice should be the graphical representation of the CFDI XML. This introduce us a problem as sometimes the information used to create the CFDI in Odoo changes or is ommited (product or contact information, hidden taxes, discount lines, etc.) To fix this, now the invoice report for Signed Mexican Invoices are now generated taking directly the values from the CFDI document, replacing most of the information taken from the invoice. task-4983567
This update significantly speeds up the process of adding and removing participants from marketing campaigns, particularly for large campaigns. By optimizing the underlying code, the sync time has been reduced from over 51 seconds to just 0.65 seconds. This improves campaign management efficiency and responsiveness.
Original PR description
Replace search_read with search_fetch to avoid unnecessary _read_format call in backend context. Use OrderedSet instead of a custom _uniquify_list helper to get O(1) membership tests when computing records to add or remove from campaigns. Benchmark on a campaign with 115k participants: | Before PR | After PR | |:---------:|:--------:| | 51.71s | 0.652s | opw-6055334 Forward-Port-Of: odoo/enterprise#119589 Forward-Port-Of: odoo/enterprise#117656
This update fixes a bug that prevented worked day lines from being generated for employees using attendance-based work schedules. The change ensures that payroll calculations accurately reflect employee hours, regardless of their flexible working arrangements. This improves payroll accuracy and reporting for all employees.
Original PR description
### **Steps to reproduce:** - Install Payroll and Attendance apps. - Create an employee with a flexible working schedule and work entry source as attendance. - Create an attendance record for this…
### **Steps to reproduce:** - Install Payroll and Attendance apps. - Create an employee with a flexible working schedule and work entry source as attendance. - Create an attendance record for this employee. - Create and compute a payslip for this employee. ### **Observed Behavior:** Worked Day lines are not generated, and Basic Wage is calculated as 0. ### **Expected Behavior:** Worked Day lines should be populated based on attendance records. ### **Root Cause:** During payslip computation, [_compute_worked_days_line_ids](https://github.com/odoo/enterprise/blob/4339010eb1e1633a67573d08e032f3922b0bec49/hr_payroll/models/hr_payslip.py#L1846) only generated work entries for versions having a `resource_calendar_id` at [1]. As a result, fully flexible employees without a working schedule were excluded from work entry generation, preventing worked day lines from being computed. [1]- https://github.com/odoo/enterprise/blob/4339010eb1e1633a67573d08e032f3922b0bec49/hr_payroll/models/hr_payslip.py#L1890-L1898 ### **Fix:** Remove the `resource_calendar_id` filter when calling `generate_work_entries` in `_compute_worked_days_line_ids` so work entries are also generated for fully flexible employees using attendance-based work entries. **opw-6146452** Forward-Port-Of: odoo/enterprise#119673 Forward-Port-Of: odoo/enterprise#117409
This update corrects a bug where order filters on the Ticket Screen in Point of Sale weren't updating correctly when a different provider state was selected. The fix ensures that the Ticket Screen reloads with the correct filters, allowing users to accurately view and manage orders from UrbanPiper. This improves the reliability of order management within the POS system.
Original PR description
Steps to Reproduce ------------------------- - Install Point of Sale and configure UrbanPiper. - Open a POS session and select a provider state from the notification popup to review orders. - While on the Ticket Screen, select a different provider state to review other orders. Issue ------- - Orders are not updated according to the newly selected state. - Previously applied filters remain unchanged. Cause -------- - Since the user is already on the Ticket Screen, changing only the provider state does not trigger a re-render. - The page was already rendered with the old filters. Fix ---- - The Ticket Screen is first switched away and then re-rendered. - This forces the screen to reload with the updated state and filters. Task: 6079663 Forward-Port-Of: odoo/enterprise#119906 Forward-Port-Of: odoo/enterprise#104546
This update corrects a technical issue preventing the accurate generation of BIR 2306/2307 tax certificates for businesses using FWVAT group taxes. The change expanded the tax lookup to include 'group tax children' which were previously excluded, ensuring correct tax identification. This resolves a reporting discrepancy impacting tax compliance.
Original PR description
The `_get_l10n_ph_tax_ids` method only searched for taxes with type_tax_use='purchase', excluding group tax children which use type_tax_use='none'. This broke BIR 2306/2307 certificate generation for FWVAT group taxes. The ATC code and description matching already ensure the correct tax is found. task-6146238
This update resolves an issue where sign requests scheduled for the future were immediately visible on the portal to the signer. The fix correctly filters out scheduled requests, ensuring that requests only appear when they are ready to be signed.
Original PR description
## Issue When scheduling a sign request, the request appears immediately on the portal for the requested signer. ## Steps to reproduce 1. Install *Sign* (`sign`) 2. Create and send a sign request -…
## Issue
When scheduling a sign request, the request appears immediately on the portal for the requested signer.
## Steps to reproduce
1. Install *Sign* (`sign`)
2. Create and send a sign request
- Signer 1: Any portal user (e.g., Joel Willis)
- Use the clock icon to schedule the signature request to a future date
3. Log in as the portal user used in step 2
4. Navigate to Signature Requests
5. **The signature request already appears in the list, even though it was scheduled for a future date.**
## Cause
The portal filters the sign requests shown based on the `is_mail_sent` field, which does not properly reflect when the signature request is shared to the user.
https://github.com/odoo/enterprise/blob/9898272f17809decf6c5bb4600aca46f9ffae6f0/sign/controllers/portal.py#L40
In fact, when scheduling a signature request, the `is_mail_sent` field is unconditionally set to `True`, even if the signature request will only be sent later.
https://github.com/odoo/enterprise/blob/9898272f17809decf6c5bb4600aca46f9ffae6f0/sign/models/sign_request_item.py#L289
## Fix
Since the `"scheduled"` `sign_request_item.state` option introduced by https://github.com/odoo/enterprise/commit/ed8d5a653e01b1378f0020e2f7a7c2d39fadf3e9 in 19.1, we can easily filter out the sign request items that are scheduled. That state is automatically updated by the `_cron_update_state`, introduced by the same commit as the `"scheduled"` option.
https://github.com/odoo/enterprise/blob/9898272f17809decf6c5bb4600aca46f9ffae6f0/sign/models/sign_request.py#L493-L503
opw-6227472
Forward-Port-Of: odoo/enterprise#119007
Forward-Port-Of: odoo/enterprise#118491This update fixes a bug that allowed internal transfer validations to proceed without scanning the destination location. Previously, deleting a line would cause validation to succeed even if the location hadn't been scanned. The fix ensures validation only occurs after a destination location has been properly scanned, improving data accuracy and preventing incorrect transfer approvals.
Original PR description
Currently, when a user deletes a line and validates internal movement in the barcode system, the system allows validation even though specifying the destination location after each scan is required.…
Currently, when a user deletes a line and validates internal movement in the barcode system, the system allows validation even though specifying the destination location after each scan is required. ## Steps to produce: - Install the Inventory module - Go to Settings and enable Storage Locations. - Inventory > Configuration > Operation Types > Internal Transfers > Barcode App - Configure the Destination Location to require scanning after each product. - Create an Internal Transfer for Pedal Bin, demand 1. - Mark the transfer as To Do and open it in the Barcode app. - Add quantity using +1, then scan the barcode for the Pedal Bin(Barcode: 6016478556493). - Delete the newly added line and attempt to Validate. ## Observed Behavior: The system should prevent transfer validation when the destination location has not been scanned and display a notification to the user, similar to the behavior before user deleted the newly added line. ## Root cause: This issue occurs because when the delete button is pressed, the deleteLine function [1] removes the line, but the deleted line becomes the selected line due to [2] being triggered before the UI updates. As a result, the selected line is now undefined. Since the selected line is undefined, it fails to meet the condition at [3] during validation. This prevents notifications from being triggered and allows the transfer to be validated before the destination location has been scanned. [1]: https://github.com/odoo/enterprise/blob/3476d15bf8e75eb6530658dd623861b60963ab40/stock_barcode/static/src/models/barcode_model.js#L826-L836 [2] : https://github.com/odoo/enterprise/blob/327d4478128f33fb2e0c477533bd4983178abf17/stock_barcode/static/src/components/line.js#L129-L133 [3]: https://github.com/odoo/enterprise/blob/6ff158ca3a6d2d2b3d285a7f8317622844811688/stock_barcode/static/src/models/barcode_picking_model.js#L945-L948 ## Solution: We can prevent users from validating if any line has an unscanned destination location when destination-location scanning is mandatory after scanning each product. To enforce this behavior, we can track whether a line has been modified and whether a destination location has been scanned and applied to that line. This allows us to identify which lines still require destination location scanning before validation can proceed. However, line state information is currently discarded and recreated on every save. As a result, information about lines that were updated and already had their destination location scanned is lost. This may incorrectly require users to rescan the destination location, even though it was previously scanned. To address this, we preserve the destination-scanned and modified state by carrying it forward from existing lines to their corresponding newly created versions using a loop. This ensures that destination location scan status is retained and users are not asked to rescan unnecessarily. opw-6069614 Forward-Port-Of: odoo/enterprise#119870 Forward-Port-Of: odoo/enterprise#113618
This update corrects a bug in the accrual reports (like 'Bill To Receive') that was causing group totals to display as zero. The fix ensures that the aggregated amounts are calculated accurately, which is essential for accountants to perform period-end financial analysis. This improves the reliability of these key reports.
Original PR description
### Issue before this commit: In accrual reports (e.g., "Bill To Receive", "Billed Not Received", "Invoices To Be Issued", and "Invoices Not Delivered"), when grouping the list view by fields such as…
### Issue before this commit: In accrual reports (e.g., "Bill To Receive", "Billed Not Received", "Invoices To Be Issued", and "Invoices Not Delivered"), when grouping the list view by fields such as Vendor, the group header totals for the "Received", "Billed", and "Amount" columns display 0.00 even if the interanl lines of the group are not 0.00. ### Steps to reproduce the issue: 1. Download Purchase Accounting and Sale Accounting 2. Go to one of this pages: Billed Not Received, Bill To Receive, Invoices To Be Issued, and Invoices Not Delivered 3. Ensure the view is in its default grouping (grouped by Vendor or Customer) 4. Observe the group header rows for the Received (or Delivered), Billed (or Invoiced), and Amount columns. They all display 0.00 5. Expand a group that contains records with values greater than zero 6. Observe that the individual records populate correctly, but the aggregated group header row continues to display 0.00. ### Cause of the issue: The commit ddc1b681656ea8c70f3231cda20b5a58b9ff7dd6 adapted the code to retrieve the new accrual reports but attempted to fetch grouped records using group[0].id as the dictionary key, while the grouped() method actually used the recordset object as the key. This mismatch caused the dictionary lookup to fail, resulting in 0.00 sums. https://github.com/odoo/enterprise/blob/c8535a7a0e2eae811048a34a0bae187a1fa45311/account_accountant/models/analytic_mixin.py#L40-L48 ### Reason to introduce the fix: This fix restores the core analytical utility of the accrual reports, which are crucial for accountants during period-end closings to evaluate totals at a glance. opw-6232273 Forward-Port-Of: odoo/enterprise#118399
This update ensures that shift workloads remain consistent after undoing the automatic planning process. Previously, undoing auto-plan would reset the allocated hours, leading to inaccurate workload tracking. The fix preserves the original workload value while allowing the percentage to adjust, improving the reliability of shift scheduling.
Original PR description
Steps to Reproduce --- 1. Open the Planning module 2. Create an open shift with allocated_hours 3. Click Auto Plan 4. Click Undo on the auto-plan notification Issue --- Undoing an auto-plan operation…
Steps to Reproduce --- 1. Open the Planning module 2. Create an open shift with allocated_hours 3. Click Auto Plan 4. Click Undo on the auto-plan notification Issue --- Undoing an auto-plan operation triggers recomputation of allocated_hours, causing the shift to lose its original workload value. Current Behaviour --- When resource_id is set to False during undo: - _compute_allocated_hours is triggered (depends on resource_id) - _compute_allocated_percentage is triggered (depends on allocated_hours) - Both fields are recalculated, potentially changing allocated_hours from its pre-assignment value Expected Behaviour --- Undoing auto-plan should preserve allocated_hours at its pre-assignment value while allowing allocated_percentage to adapt to the new context (open slot vs assigned resource). Fix --- Use protecting context manager in action_rollback_auto_plan_ids to prevent allocated_hours from being recomputed when resource_id is removed. This allows allocated_percentage to recalculate naturally based on slot duration while keeping allocated_hours stable. task - 4952149 Forward-Port-Of: odoo/enterprise#119941 Forward-Port-Of: odoo/enterprise#102864
This update fixes an issue where planned dates were lost when converting projects to project templates. The change ensures that the original planned dates are retained when creating a template, improving project tracking accuracy. This resolves a previous bug impacting project scheduling workflows.
Original PR description
Steps to reproduce: -------- - Open a project with a planned date set. - Create Template of that project. - Observe the created project template. Issue: ---------- The planned dates of the project are lost when converting the project into a template. Cause: ----- When we create a project template from a project, the project gets archived.Because a new project template record is created, and the start and expiration fields have copy=False, those dates are not being copied. Fix: ------- Explicitly pass the planned date when copying the project, so the project template keeps the original planned date. task-5872500 Forward-Port-Of: odoo/enterprise#119997 Forward-Port-Of: odoo/enterprise#115035
Code cleanup and technical improvements
This update refactors how Odoo uses reactive calls within several core modules, optimizing performance and enhancing stability. Specifically, it replaces single-argument reactive calls with proxy calls, a change introduced with Owl3. This impacts modules like Accounting, HR, and Documents, leading to smoother operation and reduced potential issues.
Original PR description
With Owl3, uses of `reactive` with only one arg can be changed to `proxy` calls. This commit changes all those uses in addons in the range [a..!w]. *: account_accountant,account_reports,documents,hr_contract_salary,hr_payroll,iap_extract,knowledge,planning,social,
This update refactors how Odoo handles reactive data calls, specifically targeting areas where single-argument reactive calls were used. The change, part of the Owl3 upgrade, improves performance and stability by utilizing a more efficient proxy mechanism. This impacts several core Odoo modules including web_enterprise, web_gantt, and web_studio.
Original PR description
With Owl3, uses of `reactive` with only one arg can be changed to `proxy` calls. This commit changes all those uses in addons in the range [w..]. *: web_enterprise,web_gantt,web_grid,web_studio