Thursday, September 12, 2024
22 changes
1 change
Resolved issues and error corrections
Branches created under a company using the German SKR04 chart of accounts now inherit the correct chart from the parent company. This prevents setup errors caused by selecting the wrong German accounting template and helps companies create branches reliably.
Original PR description
Issue when adding a branch for a company with a parent using "German chart of accounts SKR04" localization. Steps to reproduce: - Install the l10n_de and account modules. - Create a company with the localization “German chart of accounts SKR04.” - For this company, attempt to create a branch. Explanation of the issue: The _guess_chart_template function incorrectly returns the SKR03 chart template instead of SKR04 for the new branch. As a result, the _pre_reload_data function, which creates the missing xmlids, is not triggered. Solution: To resolve this issue, I prioritize using the chart template from the parent company if available, instead of relying on the _guess_chart_template function. opw-4141944
14 changes
New functionality added to Odoo
Spreadsheet pivot tables now let users show measures in alternative formats, such as percentages of row or column totals. This makes it easier to compare results and understand relative performance directly in documents and spreadsheets.
Original PR description
This commits adds the "Show value as" feature to measures. This allow users to display the value of a measure in a different way, like percentage of column total, percentage of row total, etc. Task: [4045799](https://www.odoo.com/odoo/2328/tasks/4045799?cids=1)
7 changes
Resolved issues and error corrections
Users were unable to close the share panel in the Knowledge application once it was opened. This fix resolves the issue by refining the logic that prevents the panel from closing—now it only stays open when a modal dialog is active, rather than blocking closure whenever any element has focus. This restores the expected behavior where users can easily toggle the share panel open and closed.
Enhancements to existing features
Indian payroll now has a dedicated structure type that groups all Indian payroll structures together. This makes payroll configuration clearer and easier to manage for companies operating in India.
Original PR description
This PR enhances the payroll structure and types by introducing a new structure type and integrating all Indian structures into it. task-3505344
The Aged Receivable report now lets users look a set number of days beyond a past reporting date while still excluding later invoices, credit notes, and receipts. This helps auditors and finance teams identify debts that were still unpaid after a defined follow-up period, supporting doubtful debt assessment.
Original PR description
Add a "X days after" filter to the Aged Receivable report. This computes the report at "as of date" + X days but excludes any invoice/credit note/receipt with accounting dates > "as of date." This filter helps identify doubtful debt at a past date while applying later reconciliations, ignoring irrelevant entries after the specified date. Example: - Invoice in December - Payment in January - Matching in February => In April, the auditor asks the status of all the lines of the report on the 31/12 which are not matched at the 31/03, to create doubtful debt. task-4008838
Accounting teams can now create exceptions that effectively remove a lock date, rather than only moving it to another date. This makes lock date management more flexible while preserving the existing exception workflow.
Original PR description
Currently we do not allow removing lock dates completely with an exception (except in the special 'everyone' / 'forever' case in which we just change the actual lock date instead of creating an exception). It was designed like this for technical reasons. An exception stores a "new date" for all the lock date field; a missing value for a lock date field means "no change". E.g.: `exception.sale_lock_date == False` means the exception does not change the sale lock date. After this commit we (pseudo-) allow removing a lock date with an exception. We "simulate" the removal of a lock date by setting the "new date" to a very early date. 1000-01-01 was chosen for technical reasons. It should be before any needed accounting entries. (See comment in the code). related: task-3891414 (lock dates rework)
Accounting entries are now secured when they are posted rather than later in the process, helping ensure records are protected earlier and more consistently. A new Secure Entries wizard also helps companies secure past accounting entries up to a chosen date, supporting stronger compliance workflows.
Original PR description
### commits #### [IMP] account: back to hash on post In the related community PR we move from hash on send (back) to hash on post See community PR. This commit adapts enterprise to the changes. #### [IMP] account: new secure entries wizard In the related community PR we add the Secure Entries Wizard. It's a wizard to secure (hash) all moves up to including a certain dates. See community PR. This commit adapts enterprise to the changes. ### task community PR: https://github.com/odoo/odoo/pull/178915 documentation PR: https://github.com/odoo/documentation/pull/10906 upgrade PR: https://github.com/odoo/upgrade/pull/6458 task-4095970
The Indian payroll yearly salary reports now generate PDFs directly and include both completed and paid payslips. Employee reports adjust to the selected date range up to 12 months, and currency symbols follow the current company for clearer local reporting.
Original PR description
In this PR, - The preview of the report is removed from the yearly salary by head The report will now generate the PDF directly - Payslips in done and paid state are calculated in the yearly salary by head report - Yearly salary by employee is dynamic based on the start-end date, which is not going to exceed 12 months. - The currency symbol is based on the current company. Task - 3981488
Customers can now see cancellation guidance even when an appointment has already been paid, avoiding confusion on the validation screen. If cancellation is not allowed from the summary page, they receive a clearer alert with available staff contact details when possible.
Original PR description
Before, users were sometimes lost when it came to cancelling a paid appointment, as the validation screen did not have any cancelling link. In this PR, we show the link even for paid bookings. However, we do not allow cancelling from the event summary page. Therefore, we display an alert when trying to cancel a paid event. The wording is improved to include name, email and phone of the staff user. It is also updated in existing 'no-cancel' message and status (to `no_time_left`). To do this, the controller is slightly reworked to include an overridable method to return the cancel status. Task-4143212
Sales orders and projects can no longer be moved to a different company when they are linked to shifts belonging to another company. This prevents inconsistent company data and ensures teams update the related shifts first before changing the sales order or project company.
Original PR description
After this commit, it is no longer possible to change the company of an SO or a project if they have been tied to shifts that are not in the company we want to change the SO/project. One must change the company of the shifts before changing the company of the SO/project. Ther rationale is that we want to avoid inconsistent situations where the shifts and the SO/project have different companies. task-3857690
Businesses in Brazil can now import official NF-e XML files for vendor bills related to goods, reducing manual entry and improving compliance with local invoicing standards. The import fills bills using existing company data and can automatically create the vendor when needed; service bills remain out of scope due to city-specific formats.
Original PR description
This adds support for importing electronically invoiced vendor bills for goods. We follow the official Brazilian specification [1]. Service bills are out of scope because each city has its own format.
This populates the bill with data that already exists in the database, the only exception is that the vendor will be automatically created if it doesn't yet exist.
task-3860901
[1] Esquema XML NF-e/NFC-e - Pacote de Liberação nº 9o on
https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspThe UAE payroll module now uses updated payslip printouts tailored to employee status. Active employees receive the monthly salary slip format, while archived employees receive the end-of-service payslip, helping payroll teams provide the right document automatically.
Original PR description
Link to task: [#4133896](https://www.odoo.com/web#model=project.task&id=4133896) This update to the UAE HR payroll module introduces the following changes: - New EOS Payslip Printout: This format will be used as the primary payslip for archived employees. - Updated Monthly Salary Slip Printout: This format will be used for active employees. These enhancements ensure the correct payslip format is automatically selected based on the employee's status.
The Accounting dashboard has been refreshed to better support accountants in reviewing key financial information. This improvement should make day-to-day reporting and monitoring clearer and more useful for business users.
Original PR description
…hboard Task: 4109556
Resolved issues and error corrections
This change removes automation-related setup from the Approvals app because it could unintentionally move customers from the standard price plan to a custom plan. Approvals users keep the expected app behavior without triggering an unwanted pricing change.
Original PR description
Approvals app has a dependence on automation and automation makes user go from standard price plan to custom price which shouldn't happen.
This fix prevents a validation error when adding a new work order step to a manufacturing order after another step has already started. It keeps work order dependencies in the correct sequence, so production teams can update operations without creating false circular dependencies.
Original PR description
### Steps to reproduce: - Create a MO for a product without BOM (no need of components) - Go to the "Work Orders" tab and create 2 operations: op1 and op2 - Confirm the MO - Start the operation…
### Steps to reproduce: - Create a MO for a product without BOM (no need of components) - Go to the "Work Orders" tab and create 2 operations: op1 and op2 - Confirm the MO - Start the operation waiting for an other WO (op2) - Create a third operation: op3 - Save #### > Validation Error: You cannot create a cyclic dependency. ### Cause of the Issue: During the creation of op3, all the workorders of our MO will be confirmed to ensures that the links of the 3 operations are correctly made: https://github.com/odoo/odoo/blob/d2ce6622f2d6f1917dc319112a688e35a73c2088/addons/mrp/models/mrp_workorder.py#L469-L474 This will trigger a call of the `_link_workorders_and_moves` to re-link them all. However, during this call since op2 has been started the order of the workorders will be op2 > op1 rather than op1 > op2 and sincethe MO has no bom nor `operation_id` the records will not be reordered correctly before being linked: https://github.com/odoo/odoo/blob/d2ce6622f2d6f1917dc319112a688e35a73c2088/addons/mrp/models/mrp_production.py#L1472-L1473 https://github.com/odoo/odoo/blob/d2ce6622f2d6f1917dc319112a688e35a73c2088/addons/mrp/models/mrp_production.py#L1485-L1487 This will create a loop on the m2m dependency since op1 will be blocked by op2 and op2 is already blocked by op1. This is detected by the framework which raises the error. opw-4105603 X-original-commit: dda575f8c9fcdfcb3a1a72429d5c05ede86a7c4e
The barcode app now uses text buttons instead of relying on icons alone, making actions easier for users to understand. Related manufacturing and self-order kiosk dialogs were also adjusted for a more consistent, centered presentation.
Original PR description
*: mrp_workorder, pos_self_order_iot This commit aims to add more text to the UI of the barcode app, in case users don't know the meaning of the illustrations. A text is shown in a button now instead. For the IOT module, the template has been tweaked, to allow visual consistency with the Install Kiosk action dialog. Titles are centered horizontally. task-4160938
Original PR description
Currently, the share panel cannot be closed once it has been opened. This commit resolves the issue by preventing the share panel from closing only when the active element is a modal. Steps to…
Currently, the share panel cannot be closed once it has been opened. This commit resolves the issue by preventing the share panel from closing only when the active element is a modal. Steps to reproduce the issue: 1. Open Knowledge. 2. Click on the share button to open the share panel. 3. Click on the share button again to close the share panel. => The share panel remains open. TO BE: The share panel should close. Details: In the `KnowledgeTopbar` component, we added external event listeners to detect when the dropdown menu is opened, closed, or about to close. When the dropdown is about to close (i.e., when the `hide.bs.dropdown` event is triggered), we check if the active element is the HTML document. If the focus is on another element, we prevent the dropdown from closing. This mechanism was added to prevent the dropdown from closing when users are adding new members through the invite modal. Using the `useActiveElement` hook, the active element can change when a component is mounted. When the web editor in Knowledge is mounted, the active element becomes the editor toolbar. As a result, the active element is no longer the HTML document, and the event listener always prevents the dropdown from closing. To resolve this issue, we will now check if the active element is a modal before preventing the dropdown from closing. This ensures that the dropdown behaves as expected and the share panel can be closed when necessary. Reference: https://github.com/odoo/odoo/pull/175880 task-4179706
This fix resolves an issue where creating a new article from the Knowledge editor would incorrectly display the article in both the "workspace" and "private" sections of the sidebar. The fix prevents unnecessary updates to temporary records, ensuring new articles appear only in the "private" section as intended.
Original PR description
When the no-content helper is shown and the user clicks on the "New" button to create a new article, the sidebar lists the newly created article in the "workspace" and in the "private" section. This…
When the no-content helper is shown and the user clicks on the "New" button to create a new article, the sidebar lists the newly created article in the "workspace" and in the "private" section. This is an undesirable behavior as the newly created article should only appear in the "private" section. When no record is passed to the form view, the form view creates a virtual record. When the user clicks on the "New" button, the system will create a new article and open it using the `openArticle` function defined in the component environment. When calling the `openArticle` function, the function will check if the article has a title and, if it hasn't, it will fetch the first heading of the article and use it as title (see: `ensureArticleName`). If the record is not virtual, the function `openArticle` will then persist the changes made on the current record before opening the new record. For its part, the sidebar listens to the changes made on the loaded record (using a record observer) and updates its state based on the record changes. When calling the `ensureArticleName`, the title of the virtual record changes and the sidebar detects that change and adds a new entry for the virtual record. The sidebar will then add another entry for the newly created record. To fix the issue, the `openArticle` function will no longer call the `ensureArticleName` function when the current record is virtual. The virtual record state will hence no longer be updated when opening a new article. As a result, the sidebar will not detect any change and will no longer create an entry for the virtual record. Note that there was actually no reason to update the title of the virtual record as it gets discarded when leaving Knowledge. Steps to reproduce the issue: 1. Delete all articles from the database 2. Open the Knowledge editor (you should see the no-content helper) 3. Click on the "New" button => There is two entries for the new article: one in the "workspace" section and one in the "private" section. TO BE: There should only be one entry in the "private" section. task-4160386
This fix restores the ability to renew and upsell subscriptions that have been transferred to another company. Previously, a check was preventing renewal orders from being generated because the system couldn't access invoices from the original company. This update removes that problematic check, allowing subscriptions to continue functioning properly after company transfers.
Original PR description
This reverts commit 8bd19ee1dbba0c8dce36a20bdd1e99922084ea24. This fix prevented a valid use case from functioning: when transferring a subscription to another company, we lose access to the invoices made by the original company. Because of this we would incorrectly prevent the generation of renewal and upsell orders (The subscription was invoiced but invoice_ids does not reflect it). Other alernatives are also problematic like using invoice_status (which fluctuates for subscriptions) or last_invoice_date (Which could break if the next invoice date is changed manually). opw-4116538
This update fixes a crash that occurs when the Kenya eTIMS system attempts to fetch tax notices but the API returns an error. Previously, the system would fail with an error message instead of handling the situation gracefully. Now it properly manages API errors so the automated process can continue running without interruption.
Original PR description
When ```KE eTIMS: Fetch KRA notices from eTIMS``` cron runs and eTIMS API returns an error, a traceback will appear. Steps to reproduce the error: - Install ```l10n_ke_edi_oscu``` - Set up Kenya…
When ```KE eTIMS: Fetch KRA notices from eTIMS``` cron runs and eTIMS API returns
an error, a traceback will appear.
Steps to reproduce the error:
- Install ```l10n_ke_edi_oscu```
- Set up Kenya eTIMS Integration
- Run ```KE eTIMS: Fetch KRA notices from eTIMS``` cron
Traceback:
```
KeyError: 'noticeList'
File "odoo/tools/safe_eval.py", line 391, in safe_eval
return unsafe_eval(c, globals_dict, locals_dict)
File "ir.actions.server(909,)", line 1, in <module>
File "home/odoo/src/enterprise/saas-17.4/l10n_ke_edi_oscu/models/l10n_ke_edi_oscu_notice.py", line 35, in _cron_l10n_ke_oscu_get_notices
notice_map = {notice['noticeNo']: notice for notice in data['noticeList']}
ValueError: <class 'KeyError'>: "noticeList" while evaluating
'model._cron_l10n_ke_oscu_get_notices()'
File "odoo/addons/base/models/ir_cron.py", line 562, in _callback
self.env['ir.actions.server'].browse(server_action_id).run()
File "home/odoo/src/custom/trial/saas_trial/models/sentry.py", line 33, in run
res = super().run()
File "odoo/addons/base/models/ir_actions.py", line 989, in run
res = runner(run_self, eval_context=eval_context)
File "addons/website/models/ir_actions_server.py", line 61, in _run_action_code_multi
res = super(ServerAction, self)._run_action_code_multi(eval_context)
File "odoo/addons/base/models/ir_actions.py", line 821, in _run_action_code_multi
safe_eval(self.code.strip(), eval_context, mode="exec", nocopy=True, filename=str(self)) # nocopy allows to return 'action'
File "odoo/tools/safe_eval.py", line 405, in safe_eval
raise ValueError('%s: "%s" while evaluating\n%r' % (ustr(type(e)), ustr(e), expr))
```
https://github.com/odoo/enterprise/blob/019a7cdd5a3071c0948656bdcacc95b63c2e8842/l10n_ke_edi_oscu/models/l10n_ke_edi_oscu_notice.py#L35 When eTIMS API returns an error, data will be empty,
So, it will lead to the above traceback.
sentry-5804573762, 5809459581This fix resolves a bug where the name of a time off allocation would be reset whenever the allocation type was changed. The issue occurred because the system was relying on an automatic field update that would overwrite the user's custom name. The fix ensures that custom names are preserved when users modify the allocation type.
Original PR description
### NOT FOR MASTER **17.0 -> Master - 0.1** Steps to reproduce the bug: - Go to Time Off -> Allocation -> Create - put a name - change the allocation type -> the name is reset Expected result: The name should not be reset to the old value Reason: The displayed name is relies on the private_name field to get its value. And thus every time an onchange is triggered the name is reset. Fix: Put the private_name field in the form view instead of the name field. Because we rely on the onchange of name on the dashboard to task-3713656 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A recent update removed a method that older client views still depend on, causing errors when selecting printers. This fix restores the method to prevent system errors and ensure printer selection works smoothly for all users.
Original PR description
We removed the ```select_iot``` method here https://github.com/odoo/enterprise/pull/68325 Since, the client's non-updated views still call it, and get a traceback. ```AttributeError: The method 'select_iot' does not exist on the model 'select.printers.wizard'``` We add it again to fix the issue. Sentry-5804153543
The Journal Report was crashing when automatically expanding journals on first load if the system encountered dividers or journal groups instead of actual journals. This fix ensures the report only auto-expands valid journal entries, preventing crashes when the report is reopened or used with multiple companies.
Original PR description
options['journals'] contains a list of dictionaries. In the typical case, they each will correspond to a selectable account.journal. Though, they can also contain journal groups, and in multicompany,…
options['journals'] contains a list of dictionaries. In the typical case, they each will correspond to a selectable account.journal. Though, they can also contain journal groups, and in multicompany, some of them may serve as dividers between companies (for ease of rendering in the template). Those latter elements will then have 'divider' under their 'id' key, instead of a model id. The Journal Report, when being opened for the first time unfolds the first available journal, by default, taking therefore the first element from options['journals'], generating a report line id from it, and adding this id under the 'unfolded_lines' of the options in its _custom_options_initializer. The thing is, doing so, no check was done that the id being used was indeed an account.journal's. A journal group id or 'divider' could also be used. When 'divider' was added, the report crashed as soon as the options were used as previous_options in a subsequent call to get_options, since it tried to parse it as an integer. We fix that by properly filtering the available journal ids to only contain actual account.journal ids.