Daily updates from Odoo
Tuesday, December 10, 2024
20 changes
2 changes
Enhancements to existing features
Australian TPAR taxes, fiscal positions, and reporting are moved out of the standard Australian accounting setup into an optional child chart of accounts. This keeps the default setup lighter for most Australian businesses while still allowing companies that need TPAR support to add it later.
Original PR description
The TPAR taxes, fiscal positions and report are not something that is used by most companies in Australia. As of now, 18 out of 35 taxes in the Australian package are TPAR taxes. This doesn't make much sense to install so much data for it to be useless by most users. So we will instead put the TPAR data into a child COA, that can be installed if needed. This PR also contains a commit that allows to install a child chart template when a company is using a parent one, in order to allow installing additional data later on if it becomes needed. Task id #4062853
Odoo Studio now uses the newer URL format so users keep a clearer navigation path and breadcrumb history while editing. This makes moving between screens more reliable, including cases where Studio opens from views without a saved underlying action.
Original PR description
Supports action stack in url, navigation is better, actions and breadcrumbs are btter handled and can be respawn. task-4356704
16 changes
New functionality added to Odoo
Discuss now offers a dedicated video call button that starts a call with the camera enabled, reducing extra steps for users who want face-to-face conversations. Incoming call invitations also clearly indicate when a video call is being requested and let participants join with their camera on.
Original PR description
Add a new button to make a video call, which is equivalent to making a call and enabling camera. Invitation screen shows this is an incoming video call, people can join with camera on with the video camera button. Task-4354198  <img width="191" alt="Screenshot 2024-12-05 at 17 28 18" src="https://github.com/user-attachments/assets/54c91f47-9862-423d-a123-2eb67a58c84a"> <img width="717" alt="Screenshot 2024-12-05 at 17 28 42" src="https://github.com/user-attachments/assets/5d78b9ed-7b49-430d-8b6b-5cd0859ff4bd">
Spanish accounting users can now export the Libro Diario, a chronological journal of accounting entries, directly to Excel. This makes it easier for companies to review, share, and provide the legally expected transaction record in the required structure.
Original PR description
Objective --------- Libro Diario is just a big name for "Journal" in Spanish, but it's also a precise report that is expected to reflect a chronological report of all Accounting Entries in a…
Objective --------- Libro Diario is just a big name for "Journal" in Spanish, but it's also a precise report that is expected to reflect a chronological report of all Accounting Entries in a Database. It's expected to be published and available to show all the transactions recorded by a Company. It's basically an export of the General Ledger with all the accounting entries, not grouped by Account but by Accounting Entries, sorted by date, and to show a full sequence. The Libro Diario should posess the following columns and each row should contain an account move line: - "Entry": ascending numbering for each move, starting at 1. - "Line": numbering of the move line inside the move, starting at 1. - "Date": accounting date of the move; as mentionned, moves should be sorted by dates - "Account code" - "Account name" - "Description": label of the move line - "Document": account move name - "Debit" - "Credit" Solution --------- 1. Add a custom General Ledge Handler that adds the option to export the Libro Diarios 2. Since `_get_line` returns the AMLs grouped by accounts, it is easier to fetch the query that gets all the AMLs data (`_get_query_amls`) and then postprocess the amls data to generate the matrix of data passed to the XLSX builder. Doing so forces us to manually initialize the currency table. task-4294391
Enhancements to existing features
Sales commission reporting now handles quarterly payment grouping more accurately and makes forecasts easier to review for future periods. Sales managers can better track expected commission performance by salesperson, even when no achievements have been recorded yet.
Original PR description
taskid: 4376927
Document access checks have been optimized to avoid overly complex database queries. This should make permission-related actions in Documents significantly faster, improving responsiveness for users working with document access rights.
Original PR description
## Description Most read `ir.rule` on documents are based around the searchable field `user_permission`. Both `documents.document` and `documents.access` rely on it, and its' implementation creates a…
## Description Most read `ir.rule` on documents are based around the searchable field `user_permission`. Both `documents.document` and `documents.access` rely on it, and its' implementation creates a recursive application of the ir.rule, as `documents.document` calls `_search_user_permission`, which reads on `documents.access`, whos `ir.rule` rely on `document_id.user_permission`, re-applying the same domain from `_search_user_permission`. This recursive-like behaviour creates excessively large queries with a lot of subquery, exploding the costs of it above the `jit_above_cost` threshold (500k by default), leading to slow execution, due to the JIT optimizer, which normally should be reserved for long analytical queries. ## Patch Adding `auto_join=True` on `documents.access.document_id` will transform some of the subqueries in joins, and is done in `sudo` context, avoiding re-application of the `ir.rule` while resolving itself. The simplification of the query leads to lower query cost that is bellow the `jit_above_cost` threshold, removing the slow optimisation step, leading to faster execution, as it was the main bottleneck. ## Benchmark On a db with a moderately sized `documents_document` table: | Timings | Before | After | Speed up | |-------------------------------|--------|-------|----------| | `action_update_access_rights` | 7s | 550ms | 12.7x | ## Reference task-4381572
Resolved issues and error corrections
Quotations created from repair orders now keep the correct product quantities when opened in Point of Sale. This prevents items added during a repair from appearing with a zero quantity, helping staff process the quotation accurately.
Original PR description
When opening a quotation created from a repair order in the PoS the quantity of the products would always be 0. Steps to reproduce: ------------------- * Create a repair order for whatever product * Add some product to the list with the "Add" option * Start and End the reparation * Create a quotation for the repair order * Open the quotation in the PoS > Observation: The quantity of the product in the pos is 0 Why the fix: ------------ If the sale order line has no `valued_move_ids` it means that it's linked to a repair. In this case we take the product_uom_qty into account for the pos order line quantity. opw-4261097
The replenishment list no longer applies the "to replenish" filter automatically, avoiding repeated calculations that could slow down the page. Users can still apply or save this filter manually when they need to focus on products that require ordering.
Original PR description
The filter to replenish use the `qty_to_order` field. However when adding a filter multiple function are called. `web_search_read`, `search_panel_select_range, `search_panel_select_multi_range`…
The filter to replenish use the `qty_to_order` field. However when adding a filter multiple function are called. `web_search_read`, `search_panel_select_range, `search_panel_select_multi_range`
However they all use the search domain and in the default search there is the `to replenish` filter with [('qty_to_order', '>', 0)] And each time they trigger while it's not needed to recompute them.
We think about storing the qty_to_order_computed but it's not optimal to store a value that needs to be updated everyday, just to cache it.
Instead we will remove the default filter. It's a good trade off since it's only needed when people create their orderpoints automatic themself. In general, it's not needed since the automatic rr are deleted and created on missing quantity. For people that create the automatic rr they can still use the filter and move it default but it could continue the performance issue
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-prCustomers could hit an error when opening invoices linked from project tasks in the portal, especially when a sales order had multiple invoices. This fix correctly handles the updated invoice data format so portal users can access their invoices without a crash.
Original PR description
Currently a traceback occurs when the user opens an invoices from the tasks in the portal. To reproduce this issue: 1) Install sale, timesheet 2) Open a sale order having a project or create a…
Currently a traceback occurs when the user opens an invoices from the tasks in the portal. To reproduce this issue: 1) Install sale, timesheet 2) Open a sale order having a project or create a confirmed SO with product type as service 3) Create multiple invoices for that SO 4) Now open the related tasks of that SO having invoices from the portal 5) Click on `invoices` from side panel Error:- ``` AttributeError: 'list' object has no attribute 'ids' ``` This error is occurring from the below line https://github.com/odoo/odoo/blob/88c0f9d953d077510961243080dcab2cc1920c27/addons/sale_timesheet/controllers/portal.py#L43-L50 Clearly, we get invoices as a list of dict in values from the below line. https://github.com/odoo/odoo/blob/88c0f9d953d077510961243080dcab2cc1920c27/addons/account/controllers/portal.py#L126-L133 Initially, we get the recordsets of invoices in `values['invoices']`. But because of the recent changes from the below commit, we get a list of recordset values, from which we can access the value of invoice ID. https://github.com/odoo/odoo/pull/174812/files#diff-3b907221102acd53c211a3a6b50b00543dcbbc865d50ef4451bea465f7300cbaR107-R112 We can resolve this issue by looping in invoices and access the invoice id. similarly like this https://github.com/odoo/odoo/blob/48629b94dac45dad0766fbaeef0f71934a5adcc4/addons/account/controllers/portal.py#L90 sentry-6117277208
This fixes applicant creation from job platform emails so recruiters no longer see generic email subjects used as candidate names. Applications from sources like Indeed will keep the actual sender name, making candidate lists easier to read and manage.
Original PR description
Emails sent by some job platforms (e.g. Indeed) result in applicants with a display name like: [Action required] New application for Developer, San Francisco, CA This makes it hard for recruiters to…
Emails sent by some job platforms (e.g. Indeed) result in applicants with a display name like: [Action required] New application for Developer, San Francisco, CA This makes it hard for recruiters to efficiently use the recruitment app. These emails don't use `hr.job.platform`, because the platform (e.g. Indeed) sends out the email under an application-specific `From: `, e.g. `"Joren Van Onder" <jov2ueneo87n_g88@indeedemail.com>` So the `hr.job.platform` mechanism isn't needed. Before this commit, when an application like this was received, the name on the hr.applicant (computed field based on candidate_id) would become the email subject name. This is the default behavior of `mail.thread`: it fills `_rec_name` with the subject if not set [1]. To fix it, always force partner_name in `hr.applicant`s `message_new()` (this already was being done if an `hr.job.platform` matched). [1] https://github.com/odoo/odoo/blob/f4990442904a23a387f21822b91d096f5eb987fc/addons/mail/models/mail_thread.py#L1412-L1422 opw-4383191
Worldline payment references are now kept intact when transaction IDs are processed. This prevents payout reconciliation errors and avoids possible reference collisions caused by accidentally shortened payment IDs.
Original PR description
Fixup of #185951 When removing the trailing _0 in transaction IDs from the API response, any trailing 0 in the PAYID gets truncated as well, due to the use of `rstrip()`. A series of consecutive transactions are then saved with the following provider_reference values: 8390248265 8390248266 8390248267 8390248268 8390248269 839024827 8390248271 which leads to mismatching reconciliations of payouts for the truncated ones, and may cause collisions of PAYIDs with older transactions.
Fixes issues that could cause the timesheet timer header to appear empty or fail when starting, stopping, or discarding timers in list views. This improves reliability for users tracking time, including when entries are grouped or no timesheetable projects exist.
Original PR description
Currently, the timesheet header is not working correctly in the list view. There are a bunch of issue that this commit aims to fix: An empty header is displayed when the start button is pressed, and…
Currently, the timesheet header is not working correctly in the list view. There are a bunch of issue that this commit aims to fix: An empty header is displayed when the start button is pressed, and trying to either stop it or discard it will triggers an error The grouped by function triggers a similar issue as the one above when trying to start & stop the timer When there are no timesheetable project inside the database, an error is triggered too when starting the timer. Source of the issues : - when trying to start a timer in the list view, the function 'cleartimesheetname' is triggered. The problem is that function triggers an update on the listview. This update then triggers a second execution of the 'onWillUpdateProps' of the timesheet_timer_hook class. This second execution is not expected in the flow and set the value of the timesheet of the header to 'false'. - when the view is grouped, the record are not loaded inside the the folded section. This means that when we search for the record inside the 'popRecord' function of the timesheet_timer_hook class, we find nothing. In this use case though, the record is supposed to be found and set. - when there are no timesheetable project, the method 'popRecord' will set the timesheet of the header back to 'undefined'. Solution : - Removed the 'cleartimesheetname' method, as it is no longer usefull. A check up in the write/create of the model will prevent the required field 'description' from being null. The 'enterEditMode' has also been restricted to the kanban view, since doing this in the list view was also triggering an extra call to 'onWillupdateprops' - Checked the view to get a dynamicRecordList we can use to correctly set the data. More information inside the comment in the code. - added a condition inside the 'popRecord' method so that in no longer set the timesheet to undefined when we dont need it to task - 4268687 affected version 18.0-master
This change corrects a recent condition that caused errors when exporting Spain's Mod 347 report. It ensures the report can still generate the required export file when period comparison is needed, reducing disruption for accounting users.
Original PR description
The condition previously added leads to an error when exporting mod 347 in l10n_es as generating the export file for this report always requires period comparison. Previous pr: https://github.com/odoo/enterprise/commit/045fd08c11d5f1407e971da52ea29654ac28aa93#diff-5fc5051f5c0211c0eec96b892e7d29e01b68d804417443502d17bccd8333d7ecR659
This update fixes several issues affecting accounting reports, payroll editing, POS tax matching, appraisals, preparation displays, and Studio visibility rules. It also improves WhatsApp voice message handling so received audio can be played directly in discussions, reducing errors and improving day-to-day usability.
Original PR description
Avoid calling registry with a fix mode name to allow model ihnritance for new model
Example:
```
Class SaleOrderMutation(models.Model):
_name="sale.order.mutation"
_inherit = ["sale.order.line"]
```Italian point of sale receipts now handle rounding adjustments correctly when sending data to fiscal printers. This prevents printer crashes when totals are rounded up or down, helping checkout operations continue smoothly.
Original PR description
When managing rounding adjustments at the point of sale (either excess or defect), Odoo modifies the amount to be paid accordingly. This requires sending an XML tag `printRecSubtotalAdjustment` to the fiscal printer, which is populated differently based on whether the adjustment increases or decreases the total. Without this tag the printer goes wrong and crashes. The issue is resolved by ensuring the adjustment value is properly quoted in the XML. Proper XML formatting prevents the crash. Example: ``` Product price: 1.23 Rounding: 0.02 Total: 1.25 ``` or ``` Product price: 1.23 Rounding: -0.03 Total: 1.20 ``` --- CLA signed here: https://github.com/odoo/odoo/pull/186833
This update prevents quantity adjustment buttons from appearing on full package lines in the Barcode app, avoiding errors when users move entire packages. It also ensures barcode-specific forms are only used in the right context, reducing unexpected errors in inventory workflows.
Original PR description
**[FIX] stock_barcode: move entire package button** > Before this commit, the buttons to add quantity on a barcode line were also displayed for package lines. It shouldn't be the case and it doesn't work (traceback when clicked.) This commit fixes that. **[FIX] stock_barcode_*: views priority** > *: stock_barcode_mrp, stock_barcode_picking_batch > > This commit adds missing priority on primary `stock.move.line` form inherited views: > - `stock_barcode_mrp.stock_move_line_product_selector` > - `stock_barcode_picking_batch.stock_move_line_product_selector_inherit` > > Without this field, those views will have the default priority and will sometime be displayed instead of the default move line form view (`stock.view_move_line_form`) which causes a traceback because those views were explicitly created for the Barcode app and use specific widget which is no usable in other contexts. task-4329041
This fixes an error that could stop customers from opening invoices linked to helpdesk tickets in the portal. Users can now access those invoices normally, improving the support portal experience and reducing support interruptions.
Original PR description
A traceback occurs when the user opens an invoice from the tickets in the portal. Error:- ``` AttributeError: 'list' object has no attribute 'ids' ``` This error is occurring from the below line https://github.com/odoo/enterprise/blob/a2cfc7c223dfe915a1965d08c2e1f91cfeabe2f6/helpdesk_account/controllers/portal.py#L40-L47 Initially, we get the recordsets of invoices in `values['invoices']`. But because of the recent changes from the below commit, we get the list of recordset values, from which we can access the value of invoice ID. https://github.com/odoo/odoo/pull/174812/files#diff-3b907221102acd53c211a3a6b50b00543dcbbc865d50ef4451bea465f7300cbaR107-R112 Community PR:- https://github.com/odoo/odoo/pull/190062 sentry-6117277208
Barcode scanning now avoids accidentally loading every product when handling GS1 barcodes. This prevents slowdowns and reduces the risk of incorrect or delayed warehouse scanning results.
Original PR description
In the `get_specific_barcode_data_batch` method, we convert the search domain if we use GS1 nomenclature.
In some point, we have this code:
```python
converted_barcodes_domain = expression.OR([
converted_barcodes_domain,
[(barcode_field, 'ilike', barcode)]
])
```
The issue with that is `converted_barcodes_domain` is first an empty list, so the call to `expression.OR` results into `[(1, '=', 1)]]` domain. That means when we will search products with this domain, we will get every products.
This fix ensures `converted_barcodes_domain` is not empty before to call `OR`, otherwise we simply assign the converted domain to the variable without the use of `OR`.2 changes
Resolved issues and error corrections
This update resolves an issue where appointment templates weren't consistently rendering correctly. The fix ensures the website appointment template no longer relies on updates to the underlying appointment module, guaranteeing stable template rendering across Odoo versions. This improves the user experience for appointment scheduling.
Original PR description
Versions -------- - 17.0 - saas-17.2 - saas-17.4 - 18.0 Steps ----- 1. Install appointment pre efd76940c999; 2. install website post efd76940c999. Issue ----- Template rendering issue. Cause ----- The commit added a xpath to website_appointment relying on an updated appointment module, which isn't always the case in stable. Solution -------- Make the xpath in website_appointment not rely on the appointment change. opw-4394557
This update resolves a bug where users managing appraisals without specific group access were unable to view appraisal feedback. The fix ensures that users with manager roles for an appraisal can correctly access the feedback, regardless of their group membership. This improves usability and prevents workflow disruptions for managers.
Original PR description
To reproduce: ============= - assign a user U without any group access to Appraisal app as manager of an appraisal - login as this user U and ask for feedback on the appraisal - fill the feedback, and change it's deadline to the past - try to consult the answers as user U -> redirected to survey expired error page Problem: ======== the access to appraisal feedback is checked based on the user's group access, but the user can be the manager of the appraisal without any group access to the appraisal app Solution: ========= in addition to the group access, check if the user is the manager of the appraisal opw-4354685