Daily updates from Odoo
Monday, June 15, 2026
233 changes
33 changes
Enhancements to existing features
This update enhances the visual quality of Odoo invoices generated through the account_edi_ubl_cii module. The changes include a refined header and footer, a disclaimer indicating the document is not official, and branding to identify invoices as 'Generated by Odoo'.
Original PR description
The previous UI was a little bit raw. To improve the client experience, we made the following changes: - Modify an inherited internal layout to improve header and footer. - Add a pill that says "Generated by Odoo". - Add a sentence mentioning that it is not an official document. Task-6132980 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260393
This update enhances the way quantities are handled in the Point of Sale system, specifically within the 'decrease quantity' popup. It now allows for formatting and parsing of quantities, providing greater flexibility and control, while also ensuring that constraints (like preventing negative quantities) can be enforced by other modules.
Original PR description
We now allow formatting and parsing quantity on an orderline when using the decrease quantity popup. This allows overriding from other modules to add contraints (e.g. `pos_blackbox_be` prevents from setting negative quantities). see odoo/enterprise#119702 task-5942777 Forward-Port-Of: odoo/odoo#269936 Forward-Port-Of: odoo/odoo#269487
This update improves the speed and efficiency of selecting timesheets by prioritizing recently used projects, tasks, and helpdesk tickets within the systray timer. The timer now learns from your activity, surfacing the records you've tracked time on most frequently, reducing the need for manual searches.
Original PR description
Before this PR --- The systray timer used the default search ordering, making users repeatedly search for projects, tasks, and helpdesk tickets they had recently tracked time on. After this PR --- The systray timer now ranks projects, tasks, and helpdesk tickets according to recent timesheet activity. Frequently used records are surfaced first while preserving the existing prefill behavior, making timer selection faster and requiring fewer manual searches. task - 6216535 Forward-Port-Of: odoo/enterprise#118299
Resolved issues and error corrections
This update resolves a visual bug in the product view where price and cost fields were misaligned. The fix corrects an HTML issue that caused both fields to be rendered as a single cell, ensuring proper display and alignment of cost information within product listings. This improves the user experience and data accuracy.
Original PR description
[FIX] product: fix visual bug cost alignment Issue: Price and Cost were not aligned with other fields in products view. Steps to reproduce: It's present in every product in version 19.3. Cause: Both label and field were inside the same div with colspan="2". Analyzing the HTML, this methodology was converting both the label and the field to the same o_cell not separating properly. Fix: Moved the label to outside the div and removed colspan="2", also added invisible to label. opw-6277458
This update fixes a naming inconsistency within the HTML editor module. The resource used to identify removable nodes was previously incorrect and has now been updated to the correct name, ensuring the editor functions as intended. This ensures the HTML editor operates reliably.
Original PR description
Commit [1] references `unremovable_node_predicates`, while the resource had already been renamed to `is_node_removable_predicates` following commits [2] and [3]. This commit updates the resource name accordingly. [1]: https://github.com/odoo/odoo/commit/66bed84dd0947271471520372e2ffc1c0822a471 [2]: https://github.com/odoo/odoo/commit/7082116417fe52cd9c10f139aa3d48ba77cdfd55#:~:text=unremovable_node_predicates [3]: https://github.com/odoo/odoo/commit/d57a2e50cf25a113b6c43a7927503fac1ff35ac3#:~:text=is_node_removable_predicates --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where the Datev export incorrectly displayed currency amounts due to a mismatch between the invoice currency and the company currency. The fix ensures that currency calculations in the Datev export align with the invoice's currency, improving the accuracy of financial reports for German clients.
Original PR description
There is an issue in the Datev export functionality. In the current functionality, the code calculates a delta between the taxes in the `tax_totals` and the ones on the journal items. Issue is, the tax amounts from tax_totals were always in company currency, while the entry itself can use a foreign one. This replaces the use of company currency with the use of the invoice's currency and appropriately adjusts the test featuring foreign currency. Steps: Create a foreign currency. Create an invoice with a taxed product using the currency. Export the ledger to Datev. Inspect the resulting csv. Note that neither the final listed price, nor the rate listed for the currency align with the ones in the db. opw-6275889 Forward-Port-Of: odoo/enterprise#120293
This update resolves an issue where inventory counts weren't accurately recording products without lot numbers. Previously, scanning these products incorrectly updated existing inventory lines. Now, the system correctly creates new inventory lines for lotless products during counts, ensuring accurate stock tracking.
Original PR description
### Steps to reproduce: 1. Create a product tracked by lot 2. Put 10 units in WH/Stock without lot 3. Inventory > Operations > Adjustments > Physical Inventory 4. Select the line referring to your…
### Steps to reproduce: 1. Create a product tracked by lot 2. Put 10 units in WH/Stock without lot 3. Inventory > Operations > Adjustments > Physical Inventory 4. Select the line referring to your product and request an inventory count + Show Expected Quantity 5. Open the barcode app > Count Inventory 6. Scan your product #### > The line is not selected, in particular, next scans will be re-interpreted as product scans rather than new serial creation for your product. ### Cause of the issue: Scanning your product search a line to select if any: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L1432-L1435 https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L1630-L1632 However, the `findLine` will fail since this method calls the `_canOverrideTrackingNumber` to determine if the lot of the barcodData matches the one of the line: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L1859-L1863 But, the override of the `_canOverrideTrackingNumber` method for the `BarcodeQuantModel` does not handle the absence of lotName in the barcodeData correctly as it does not consider that a line without lot can be overridden by an empty lotName: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_quant_model.js#L729-L731 Note however that the super call does: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L795-L798 ### Issue 2: ### Steps to reproduce: - Steps 1 -> 5 - Click on your product line to select it - Scan a new lot to add one new unit referring to that lot - Confirm (1) - Apply Now #### > User Error: Quant's editing is restricted, you can't do this operation Since the line is selected, you have a currentLine during the `processBarcode` and hence the existing line will be updated using the `lotName``: https://github.com/odoo/enterprise/blob/cf3c2fce8a6b7b2d7547d44a0e4423f887986d52/stock_barcode/static/src/models/barcode_model.js#L1560-L1584 However, writing on the line will then try to write on the related quant during the validation process which will be forbiden since we are not allowed to change the lot of an existing quant: https://github.com/odoo/odoo/blob/e3b0ca11d99b2ef819cdad68b169112cd73668b6/addons/stock/models/stock_quant.py#L351-L360 Now, the issue is that actually due to the nature of the line and of the barcode data, the line lot is not expected to be updated but rather a new line is expected to be created: https://github.com/odoo/enterprise/blob/cf3c2fce8a6b7b2d7547d44a0e4423f887986d52/stock_barcode/static/src/models/barcode_model.js#L795-L798 Additional issue: Fixing issue 1 and 2 highlight and other issue of the validation process: - Steps 1 -> 6 > The line gets selected - Scan a newlot > a new subline is added referring to 1 unit of your new quant - Confirm (1) > Some serials where not counted, set them as missing #### > Check your quants: the 10 unit lotless quant was not updated but a new quant for 1 units was created for your newlot ### Cause of the issue: Applying all quantities is expecting to toggle them as counted before applying to update the existing quants: https://github.com/odoo/enterprise/blob/c8535a7a0e2eae811048a34a0bae187a1fa45311/stock_barcode/static/src/models/barcode_quant_model.js#L72-L82 https://github.com/odoo/enterprise/blob/c8535a7a0e2eae811048a34a0bae187a1fa45311/stock_barcode/static/src/models/barcode_quant_model.js#L287-L296 However, only line tracked by serial numbers are set as counted: https://github.com/odoo/enterprise/blob/c8535a7a0e2eae811048a34a0bae187a1fa45311/stock_barcode/static/src/models/barcode_quant_model.js#L60-L63 opw-6212923 Forward-Port-Of: odoo/enterprise#118373
This update resolves a delay in Odoo's web map tests by adjusting how the tests wait for responses. The change prevents tests from hanging indefinitely due to potential slowdowns, leading to faster and more reliable test execution. This improves the overall stability and performance of the web map feature.
Original PR description
This commit replaces the waitFor timeout in map view tests with runAllTimers to cope with potential execution slowdowns and avoid waiting for too long while executing the tests. runbot-error-939600
This update resolves an issue where HR users without payroll access couldn't view employee type configurations. The fix adds the 'HR Manager' group permission to the relevant field, ensuring all users can access this critical setting. This prevents errors and maintains consistent functionality.
Original PR description
**Steps to Reproduce** 1. Create a database on v19.3. 2. Install `hr` and `hr_payroll`. 3. Create or log in as a user who only has access rights for the Employee app (`hr`) and no Payroll access. 4.…
**Steps to Reproduce**
1. Create a database on v19.3.
2. Install `hr` and `hr_payroll`.
3. Create or log in as a user who only has access rights for the Employee app (`hr`) and no Payroll access.
4. Go to **Employees → Configuration → Employee → Employee Types**. Opening the Employee Types menu raises the following error:
```python
You do not have enough rights to access the field "employee_type_id" on
Employee Contract (hr.version). Please contact your system administrator.
Operation: read
User: 2
Groups: allowed for groups 'Payroll / Assistant'
```
**Issue Description:**
The field `employee_type_id` is defined in both modules with different group restrictions:
* In `hr/models/hr_version.py`, the field is restricted to **HR Managers**. [field](https://github.com/odoo/odoo/blob/f7e87637d5c47047ebffda0f3c929c25022c3f27/addons/hr/models/hr_version.py#L184)
* In `hr_payroll/models/hr_version.py`, the field is extended with the **Payroll / Assistant** group.
[field](https://github.com/odoo/enterprise/blob/acd831acd0f59f7b8c15bccfb6da0c3969fc3f6d/hr_payroll/models/hr_version.py#L41) When both modules are installed, access to `hr.version.employee_type_id` requires Payroll permissions.
In v19.3, PR #241780 introduced the `employee_count` [computation](https://github.com/odoo/odoo/blob/f7e87637d5c47047ebffda0f3c929c25022c3f27/addons/hr/models/hr_employee_type.py#L25) on `hr.employee.type`. During this computation, `_read_group()` is executed on `hr.employee` using the domain.
[pr] : https://github.com/odoo/odoo/pull/241780/changes
HR-only users (without hr_payroll.group_hr_payroll_user) cannot read the field, causing below traceback.
**Solution**
added `group_hr_manager` group to the field `employee_type_id` so both groups can view employee_type.
**Traceback**
```python
File "/home/odoo/src/odoo/saas-19.3/addons/hr/models/hr_employee_type.py"
line 25, in _compute_employee_count
employee_count_by_employee_type = dict(self.env['hr.employee']._read_group(
...
File "/home/odoo/src/odoo/saas-19.3/odoo/orm/models.py", line 2732, in
check_field_access
raise AccessError(error_msg)
odoo.exceptions.AccessError: You do not have enough rights to access the field
"employee_type_id" on Employee Contract (hr.version).
Operation: read
User: 8
Groups: allowed for groups 'Payroll / Assistant'
```
opw-6246367
upg- 4302826
tgb- 2751This update corrects a potential issue in the Swiss payroll module where users could incorrectly request refunds on payslips. Swiss regulations limit payments to one per month, so the system now guides users to cancel and re-create a payslip for any necessary adjustments. This ensures compliance with Swiss payroll rules.
Original PR description
Prevent refunds for CH payslips since only one payslip per month is allowed for Swiss payroll. Users should cancel the payslip and create a new one to apply corrections. task-5951981 Forward-Port-Of: odoo/enterprise#107943
This update fixes an issue where the 'Due' button wasn't appearing for customers when balances existed only at the line level within journal entries. The change improves the accuracy of balance detection, ensuring the button is always visible for all customers, regardless of how they're linked to accounting records.
Original PR description
Steps to Reproduce: 1. Install Accounting module (without Point of Sale). 2. Create a customer. 3. Create a journal entry with that customer set only at line level. 4. Post the journal entry. 5. Open…
Steps to Reproduce: 1. Install Accounting module (without Point of Sale). 2. Create a customer. 3. Create a journal entry with that customer set only at line level. 4. Post the journal entry. 5. Open the customer form. Issue: The Due smart button is not visible on the partner form even though an outstanding balance exists for the customer. Note: This issue does not reproduce when Point of Sale is installed, as the POS module overrides `_compute_has_moves` with its own implementation that checks the outstanding balance directly. Root Cause: The `_compute_has_moves` method queries only `account.move `for partner matching. When a partner is referenced only at the account.move.line level, the partner is never picked up by this query, resulting in `has_moves = False` and the Due button remaining hidden. Fix: Replaced the EXISTS-based implementation with a UNION-based approach as the EXISTS implementation evaluated the query per partner row, whereas UNION processes all partners in a single batch query. Additionally extended the UNION to also include account.move.line partner matching, ensuring partners referenced only at the line level, are correctly detected and has_moves is set to True. Result: The Due smart button is now correctly visible for all partners with an outstanding balance, regardless of whether the partner is set at the journal entry level or only at the line level. owp = 6243562 Forward-Port-Of: odoo/enterprise#120294 Forward-Port-Of: odoo/enterprise#119084
This update resolves an issue where reloading the Point of Sale while the system was in a specific state caused data loss and errors. The fix prevents a race condition between sending a beacon and initiating a new POS request, ensuring a smoother and more reliable reload experience. This improves overall POS stability for users.
Original PR description
When the user reloads the POS while the session is in opening_control, the beforeunload sendBeacon and the new pos_web request race. If the beacon is processed first it deletes the session and load_data fails. task-6259527 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268668 Forward-Port-Of: odoo/odoo#267190
This update fixes an issue where employee out-of-contract payments weren't being correctly deducted when multiple contract versions existed. The system now accurately calculates deductions based on the contract's start date, ensuring accurate payroll processing for employees with amended contracts.
Original PR description
…rsions on same contract **Steps to reproduce**: - Create a contract version from May 1 to May 14. - Create another contract version starting on May 15, then create an amendment version from May 20. - Generate a payslip for May using the May 20 version. - The employee receives the full monthly wage. The out of contract period (May 1 to May 14) is not deducted. **Reason**: - OUT worked days are linked to the first version of the contract starting on May 15. - When computing the OUT ratio, the system only considers worked days linked to the exact version being processed. - As a result, the May 20 amendment version does not see the OUT worked days and no deduction is applied. **Fix**: - Compute the OUT ratio using the contract start date instead of the current version, ensuring OUT worked days are correctly taken into account across all versions of the same contract. Task: 6259341 Forward-Port-Of: odoo/enterprise#119893
This update resolves a technical issue where the Urbanpiper order information screen incorrectly displayed customer details even after the customer was removed. The fix ensures that customer information is only shown when a customer is actually linked to the order, improving the user experience and preventing error messages.
Original PR description
Steps to reproduce: ==== - Place an order through Urbanpiper. - Edit the order and remove the customer. - Open the ticket screen and click the info button. - A traceback occurs. Cause: ==== - Customer details were rendered even when no customer was linked to the order. Fix: ==== - Display customer details only when a customer is present on the order. task-6233812 Forward-Port-Of: odoo/enterprise#120290 Forward-Port-Of: odoo/enterprise#118147
This update corrects a bug where bank statement CSV imports were incorrectly multiplying amounts by 100. The fix ensures that debit and credit values are parsed correctly, regardless of whether the 'account_bank_statement_extract' module is installed. This prevents inaccurate financial data import.
Original PR description
Steps to reproduce --- 1. With Accounting installed, import a bank statement CSV that has separate Debit and Credit columns using number separators (e.g. a line with "1.234,56"). 2. Map the columns…
Steps to reproduce --- 1. With Accounting installed, import a bank statement CSV that has separate Debit and Credit columns using number separators (e.g. a line with "1.234,56"). 2. Map the columns to Debit and Credit and import. The imported amounts are multiplied by 100: "1.234,56" is imported as 123,456.00. Issue --- This only happens when both `account_bank_statement_import_csv` and `account_bank_statement_extract` are installed, which is the default in any Accounting database since both modules are auto-installed. `account_bank_statement_extract` turns debit and credit into real Monetary fields on `account.bank.statement.line`: https://github.com/odoo/enterprise/blob/af863c5a53d0ab50fe67cb9ea910391d4a1979dd/account_bank_statement_extract/models/account_bank_statement_line.py#L7-L8 Because they are now real fields, the generic importer already converts those columns to floats: https://github.com/odoo/odoo/blob/bfa39854e56da4bf23295d62f63d66973ad0d78e/addons/base_import/models/base_import.py#L1281-L1285 The CSV statement wizard then parses the same columns a second time: https://github.com/odoo/enterprise/blob/d7ab7ee1287342638006e290ede20b955aae8370/account_bank_statement_import_csv/wizard/account_bank_statement_import_csv.py#L92-L93 The first pass correctly reads "1.234,56" as "1234.56", but the second pass sees a lone dot, mistakes it for the thousands separator, strips it, and produces 123456. The wizard now parses debit and credit only when they are virtual fields, so when they are real fields the values parsed by the generic importer are reused instead of being parsed twice. Without `account_bank_statement_extract`, debit and credit exist only as virtual import fields, so the generic importer skips them and the wizard parses them once. That is why the regression stays hidden until the extract module is present. opw-6227083 --- Forward-Port-Of: odoo/enterprise#118979
This update corrects a bug in how Odoo imports products from UBL invoices. Specifically, when searching by product name, the system incorrectly linked multiple products to the same line, leading to inaccurate data. This fix ensures that products are correctly associated during import, preventing data inconsistencies.
Original PR description
**PROBLEM** When retrieving a product by name, there is no cache_key for the search_method criteria. This leads to the cache_key frozendict being an frozen dict with None values. This means, once we retrieve a first product with the search_method criteria, all following product will match its cache_key, so we ends up associating a product to all subsequent lines, even if they don't have anything in common. **STEP TO REPRODUCE** 1. Create a product with the name: "CASTELTORRE MERLOT DELLE VENEZIE 75CL 10,5i" (it's important the name is not exactly matching) 2. Import the xml which is attached to the bug fix ticket. 3. Notice the product column on all the lines after a certain point have the CASTELTORRE product, even though the corresponding line in the ubl is for another product. opw-6227280 Forward-Port-Of: odoo/odoo#265987
This update fixes an issue where extra spaces in code blocks within the To-Do creation feature were incorrectly displayed as ` ` characters. The fix converts these spaces to regular spaces, ensuring accurate syntax highlighting and a cleaner user experience. This improves the overall readability and functionality of the code editor.
Original PR description
Step to reproduce: - Go to To-Do → Create New - Type text with multiple consecutive spaces in the same line - In the same line → insert a /code block Description of the issue: Multiple spaces are converted into ` ` inside the code block. Cause: When the code block is processed for syntax highlighting, its `innerHTML` is used as the source text. During this process, ` ` is not handled as a result it remains as literal text, so syntax highlighting displays ` ` instead of a normal space. Solution: Convert ` ` into a normal space before the content is used for syntax highlighting. task-6184686 Forward-Port-Of: odoo/odoo#267970 Forward-Port-Of: odoo/odoo#263053
This update significantly improves the speed of searching for partners (customers and suppliers) within the Point of Sale module. By optimizing the search process and reducing unnecessary sorting, the system now responds much quicker, especially when dealing with large customer databases. This enhances the efficiency of sales staff and improves the overall user experience.
Original PR description
Improve partner search response time on large databases (1M+ rows): - Implement smart field selection based on input type (phone, email, text). - Use prefix search (=ilike) for identifiers and exact match for barcodes. - Remove expensive sorting by complete_name in the backend. - Increase search limit to 500 to reduce network round-trips. task-id: 6143737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265943 Forward-Port-Of: odoo/odoo#260347
This update ensures that overtime hours recorded in the system are accurately recognized as additional working time. Previously, these hours weren't being fully accounted for, leading to potential discrepancies in employee tracking and payroll. This fix improves the accuracy of time and attendance data.
Original PR description
make sure that Overtime Hours entries is concidered as extra hours Task: 6279514 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269539
This update corrects a calculation error in the Saudi HR payroll module that impacted GOSI contributions for employees with unpaid leave. The fix prortions contributions based on actual worked days, ensuring accurate deductions for employees taking time off. This improves payroll accuracy and compliance for Saudi operations.
Original PR description
Task: 6279514 Forward-Port-Of: odoo/enterprise#119990
This update fixes an issue where long-term sick leave payments weren't correctly calculated due to an outdated system. The change ensures existing sick leave data is properly processed, guaranteeing accurate unpaid sick leave payments as required by Belgian regulations. This prevents incorrect payroll calculations.
Original PR description
Following this task: https://www.odoo.com/odoo/project/1251/tasks/5942163, sick time offs are automatically split between paid/unpaid when the leave is created. However, existing data was not upgraded, and might result on sick leaves not being unpaid when they should. This commit re-introduces the method to ensure legacy compatibility with existing sick leaves. Upgrading the data by splitting/creating new sick leaves would be too heavy. task-6297274
A bug was preventing users from reordering extra images on product pages through the website editor. This update corrects a technical issue related to how image attachments are handled, ensuring that users can now successfully move images to the first position without encountering errors. This improves the user experience for managing product visuals.
Original PR description
**Problem:** On the shop, moving one of a product's extra images to the first position through the website editor raises a server error. **Steps to reproduce:** 1. Have a product whose TEMPLATE has a…
**Problem:** On the shop, moving one of a product's extra images to the first position through the website editor raises a server error. **Steps to reproduce:** 1. Have a product whose TEMPLATE has a main image set and at least one template-level extra image with different content. 2. Open the shop, open that product, and enter edit mode. 3. Move the extra image to the first position. 4. Observe the error. **Current behavior:** The reorder fails with "Attachment modified when accessing it from a Binary field". **Expected behavior:** The extra image becomes the product's main image and the others keep their order. **Cause of the issue:** Moving an additional image to the first position promotes it to the main image, so `resequence_product_image` swaps the `image_1920` value of the main record and the additional image. The swap was done with a single tuple assignment, where both right-hand reads are lazy values still bound to their attachments. Writing the first field rewrites its attachment in place, which changes that attachment's checksum; the second value is then read from the same attachment and its cached checksum no longer matches, tripping the binary field's concurrent modification assertion. https://github.com/odoo/odoo/blob/55c7c8be9a7a78d683f5b8b6e1703fb051dddd2f/odoo/orm/fields_binary.py#L345-L346 This only surfaces for a narrow combination, which is why it is easy to miss (e.g. on runbot demo data and in the existing tests): The main image being swapped must be a `product.template` record, i.e. the moved image is a template-level extra image. For variant extra images the main image is `product.product.image_1920`, a computed field whose inverse writes elsewhere, so no attachment is mutated in place and no error occurs. https://github.com/odoo/odoo/blob/55c7c8be9a7a78d683f5b8b6e1703fb051dddd2f/addons/product/models/product_product.py#L132 https://github.com/odoo/odoo/blob/55c7c8be9a7a78d683f5b8b6e1703fb051dddd2f/addons/product/models/product_product.py#L249-L255 The product's main image must be set and its content must differ from the moved image (identical content keeps the same checksum). The values must be read from their attachments (the case on a real request; in-memory tests cached them as plain bytes and passed). **Fix:** Reading both image contents into memory before writing decouples each write from the other's attachment, so mutating one attachment can no longer invalidate the value being written to the other. opw-6249950
This update resolves a visual inconsistency in the way account reports display line items. The change ensures that all report lines have the correct styling, improving the overall presentation and readability of financial reports. This improves the user experience for generating and viewing financial data.
Original PR description
commit introducing the issue: https://github.com/odoo/enterprise/commit/6608d5c21a7fb9d57786c2a7618b878e244bd420
This update fixes a potential issue where certified point-of-sale configurations could allow users to enter negative quantities on order lines. This restriction has now been implemented across both the backend and frontend of the system, ensuring data accuracy and preventing incorrect inventory calculations. This change improves the reliability of our POS system for certified users.
Original PR description
Certified pos configs should not allow to set negative quantities on order lines. We now prevent it from both backend and frontend. see odoo/odoo#269487 task-5942777 Forward-Port-Of: odoo/enterprise#120513 Forward-Port-Of: odoo/enterprise#119702
This update resolves an issue preventing the import of electronic invoices (like XRechnungen) using email addresses as Peppol EAS endpoints. The fix allows the '@' character in email addresses, correcting a validation error that previously blocked partner creation. This ensures seamless import of invoices with standard email formats.
Original PR description
### Issue When importing an electronic bill (such as a German XRechnung) that uses the Peppol EAS 'EM' (Email) with an email address as the endpoint, the import fails during the automatic partner…
### Issue When importing an electronic bill (such as a German XRechnung) that uses the Peppol EAS 'EM' (Email) with an email address as the endpoint, the import fails during the automatic partner creation An error is logged in the chatter stating that the Peppol endpoint is not valid and should contain only letters and digits Since 'EM' stands for Email, the system should allow the '@' character and validate the endpoint format ### Cause While the export logic supported the 'EM' EAS, the validation flow triggered during automatic partner creation on import was too restrictive The global regex `PEPPOL_ENDPOINT_INVALIDCHARS_RE` did not include the '@' character, causing the validation to fail for any email address Additionally, there was no specific format check implemented for the 'EM' EAS type to ensure the endpoint is a valid email string ### Steps to reproduce - Install `account_edi_ubl_cii` - Go to Accounting / Vendors / Bills - Upload an electronic invoice containing an EM EAS and an email endpoint (you can use the added test file or the one from the ticket) Before the fix, an error is raised in the chatter and the partner cannot be created automatically opw-6205745 Forward-Port-Of: odoo/odoo#266894
This update addresses a missing rule in the calculation of employer costs within the Odoo Enterprise system. Following a review, a crucial rule was identified and added to ensure accurate employer cost reporting. This improves the reliability of payroll and HR data.
Original PR description
In this previous PR https://github.com/odoo/enterprise/pull/106839 the computation of the employer cost was fixed and many rules were flagged as needed in that computation. After a report, we found one of the rules was missing so we add it in this PR. Task: 6088412 Forward-Port-Of: odoo/enterprise#112681
This update fixes a visual issue where suggestion icons weren't appearing in the Assistant when it detected activities like 'Working on task'. The fix ensures the Assistant correctly identifies activity types, allowing the icons to display as intended. This improves the user experience and provides clearer guidance within the Assistant.
Original PR description
- When the Assistant detected activities such as 'Working on task', the suggestion icon was not displayed because the event type was not assigned. Unlike `aw.rule` matches, the Odoo URL resolver only set the label and related record information, but did not set the activity type required by `getIcon()`. - Expose the activity type through `get_assistant_data` and assign the activity type when resolving model URLs in extractWatcherActivity. task-6259793 Forward-Port-Of: odoo/enterprise#120370
This update ensures website configuration builds consistently by automatically generating necessary snippet templates for selected themes. Previously, a configuration error would cause a retry, leading to duplicate menu items. Now, templates are created upfront, resolving the issue and improving the website building process.
Original PR description
Steps to reproduce: - Start from a database where the eCommerce app is not installed. - Open the website configurator. - In the first step, choose "I want an eCommerce". - In the Pages and Features…
Steps to reproduce: - Start from a database where the eCommerce app is not installed. - Open the website configurator. - In the first step, choose "I want an eCommerce". - In the Pages and Features step, select all Pages. - Select a theme that adds an eCommerce category snippet, for example "Treehouse". - Build the website. => During the first `configurator_apply`, `website_sale` is installed after the theme and the configured menu items are already created. => The homepage rendering then needs a `website_sale` configurator snippet template requested by the theme, but it was not generated during that first call. => The client retries `configurator_apply`. It now succeeds because `website_sale` is fully installed, but page and menu creation runs again and duplicates the menu items. Before this commit, primary snippet template generation only read the manifest of the module being generated. When `website_sale` was installed from the first `configurator_apply`, it did not see addon snippets declared by the already installed theme. The first call could therefore fail while rendering the homepage after pages and menus were created. After this commit, generation also reads installed theme addon snippets that target the module being generated. The `website_sale` configurator templates requested by the selected theme are created before the first homepage rendering, so `configurator_apply` does not retry after creating menu items. task-5973739 Forward-Port-Of: odoo/odoo#261022
This update resolves a bug where the employee field in the appraisal module wouldn't automatically populate when using the appraisal smart button from the employee record. The fix ensures the correct employee ID is passed to the appraisal action, streamlining the appraisal request process. This improves usability and reduces manual data entry.
Original PR description
[FIX] hr_appraisal: fix auto-fill of employee in appraisal Bug production: 1 - employee app -> department -> select employees -> select any employee -> use appraisal smart button in top ->…
[FIX] hr_appraisal: fix auto-fill of employee in appraisal
Bug production:
1 - employee app -> department -> select employees -> select any employee -> use appraisal smart button in top -> employee_id is not coming
Bug cause:
1 - When we press smart button of appraisal action_send_appraisal_request in hr_employee is called.
2 - It send the self.env.context as a context and active_model and active_id.
3 - In hr_appraisal, _get_default_employee function calculates the default employee_id by looking to context and especially by looking to active model and id.
3.1 - If active_model is hr.employee and there is active_id, it finds the employee automatically (that is the case when we are coming directly from employee -> smart button hr_appraisal)
3.2 - When we first click to department and then we click to employee and smart button, active_model is hr.department and default_employee_id cannot be calculated in default version.
Bug solution:
1 - I have passed the default_employee_id to the context in action_send_appraisal_request function. Since we know the employee in the action_send_appraisal_request function we can pass it directly.
task - 6285434
Forward-Port-Of: odoo/enterprise#119737This update prevents the Timesheet Assistant from incorrectly matching events to projects or tasks with disabled timesheets. The change improves data accuracy and ensures the assistant only focuses on active projects, streamlining workflow and reducing potential errors. This was achieved through backend and frontend updates to filter and manage project/task matching rules.
Original PR description
Currently, the Timesheet Assistant (ActivityWatch) can match events to projects or tasks that have timesheets disabled, either via Custom Rules or Historical Memory.
This commit resolves the issue across the entire pipeline:
- Backend: Updated `resolve_assistant_models_targets` to efficiently filter out records where `allow_timesheets` is False using a search domain.
- Frontend: Updated the `loadData` JS pipeline to intercept and wipe any project/task IDs rejected by the backend, ensuring they cleanly fall back into a single "Unmatched" group.
- Views: Added the `[('allow_timesheets', '=', True)]` domain to `project_id` and `task_id` fields in `aw.rule` views to prevent users from creating invalid rules.
Task: 6267401
Forward-Port-Of: odoo/enterprise#120303
Forward-Port-Of: odoo/enterprise#119403This update corrects a previous issue where sale order reports incorrectly translated the customer's GST/HST number based on the user's language setting. The fix ensures that reports accurately display address information in the customer's preferred language, improving data accuracy and user experience for international customers.
Original PR description
Issue: --- User lang is used to translate address info instead of partner lang. Steps to reproduce: 1- Setup Canada company. 2- Create a partner with GST/HST number set and English lang. 3- Create a SO with the created partner. 4- Change user language to French. 5- Download SO report. The `GST/HST number` is translated to French. Cause: --- This is due to bba2fc505f5d0b4770eacc6877155b1aeda6d772. In the fix c679a9670494c8e6fca92e94d8dba9cca254cb16 we fixed the issue but the doc lang set is added after address set. opw-6252648 Forward-Port-Of: odoo/odoo#269842
This update ensures that stock reports automatically print when a Point of Sale (POS) order is validated. Previously, the print job wasn't triggered, causing delays in stock reporting. The change adds a system to retrieve and execute report actions, streamlining the process and improving inventory tracking.
Original PR description
Validating a `pos.order` creates a stock move in inventory. However, when configuring reports to automatically print on validation, the print job wasn't triggered from the pos. We added a way to retrieve report actions and execute them. Task: 5392414 Forward-Port-Of: odoo/odoo#269614 Forward-Port-Of: odoo/odoo#239084
Code cleanup and technical improvements
This update simplifies the automated bank reconciliation process within Odoo Enterprise. The code has been reorganized for better readability and maintainability, addressing a previous complexity issue. This change enhances the reliability and efficiency of bank statement matching.
Original PR description
Reworked the try_auto_reconcile function to make it more readable by creating helper functions and splitting the function into multiple smaller ones. task-6171727 Forward-Port-Of: odoo/enterprise#120500 Forward-Port-Of: odoo/enterprise#116958
20 changes
Enhancements to existing features
This update enhances the visual quality of Odoo invoices generated through the account_edi_ubl_cii module. The changes include a refined header and footer, a clear disclaimer indicating the document is not official, and a "Generated by Odoo" pill for transparency. These improvements contribute to a better user experience.
Original PR description
The previous UI was a little bit raw. To improve the client experience, we made the following changes: - Modify an inherited internal layout to improve header and footer. - Add a pill that says "Generated by Odoo". - Add a sentence mentioning that it is not an official document. Task-6132980 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260393
This update now automatically logs the reasons why orders fail to synchronize with Lazada. Previously, users had to manually investigate order details to understand synchronization issues. This enhanced logging provides clearer insights and helps our team quickly identify and resolve synchronization problems, improving order fulfillment accuracy.
Original PR description
Before this commit, the only way to know why an order was not synchronized was to inspect the order details and infer the reason from the code. This commit now logs those reasons. Forward-Port-Of: odoo/enterprise#120212
Resolved issues and error corrections
This update resolves an issue where the 'smart button' on the appraisal module wouldn't automatically select the correct employee. The fix ensures that the employee ID is correctly passed when using the appraisal action, regardless of the user's navigation path within the system. This improves the user experience and prevents data entry errors.
Original PR description
[FIX] hr_appraisal: fix auto-fill of employee in appraisal Bug production: 1 - employee app -> department -> select employees -> select any employee -> use appraisal smart button in top ->…
[FIX] hr_appraisal: fix auto-fill of employee in appraisal
Bug production:
1 - employee app -> department -> select employees -> select any employee -> use appraisal smart button in top -> employee_id is not coming
Bug cause:
1 - When we press smart button of appraisal action_send_appraisal_request in hr_employee is called.
2 - It send the self.env.context as a context and active_model and active_id.
3 - In hr_appraisal, _get_default_employee function calculates the default employee_id by looking to context and especially by looking to active model and id.
3.1 - If active_model is hr.employee and there is active_id, it finds the employee automatically (that is the case when we are coming directly from employee -> smart button hr_appraisal)
3.2 - When we first click to department and then we click to employee and smart button, active_model is hr.department and default_employee_id cannot be calculated in default version.
Bug solution:
1 - I have passed the default_employee_id to the context in action_send_appraisal_request function. Since we know the employee in the action_send_appraisal_request function we can pass it directly.
task - 6285434This update fixes an issue where multiple taxes applied on Brazilian sales orders were displayed on a single line, making them difficult to read. The change adds a line break to separate tax details, improving clarity and usability for users. This ensures accurate tax reporting for Brazilian customers.
Original PR description
Upon creating a SO in the Brazilian localization and computing taxes, tax details are displayed on the SO lines. However, when multiple taxes are applied, all tax details are shown on a single line, making them difficult to read. Add a line break between tax details so that each tax is displayed on a separate line. Before: https://www.awesomescreenshot.com/image/61178015?key=703ceba935bbf0b97f4b45c649722827 After: https://www.awesomescreenshot.com/image/61178078?key=3b980b91b7657aa48dec9b825549ebeb opw-6234768
This update corrects a translation issue in sale order reports, ensuring addresses are displayed in the correct language based on the partner's settings, not the user's. Previously, the GST/HST number was incorrectly translated to French. This change ensures accurate reporting for international customers.
Original PR description
Issue: --- User lang is used to translate address info instead of partner lang. Steps to reproduce: 1- Setup Canada company. 2- Create a partner with GST/HST number set and English lang. 3- Create a SO with the created partner. 4- Change user language to French. 5- Download SO report. The `GST/HST number` is translated to French. Cause: --- This is due to bba2fc505f5d0b4770eacc6877155b1aeda6d772. In the fix c679a9670494c8e6fca92e94d8dba9cca254cb16 we fixed the issue but the doc lang set is added after address set. opw-6252648
This update resolves an issue where reloading the Point of Sale while the system was in a specific state caused data loss and errors. The fix prevents a race condition between sending data and loading new information, ensuring a smoother and more reliable user experience for Point of Sale operations. This improves the overall stability of the POS system.
Original PR description
When the user reloads the POS while the session is in opening_control, the beforeunload sendBeacon and the new pos_web request race. If the beacon is processed first it deletes the session and load_data fails. task-6259527 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268668 Forward-Port-Of: odoo/odoo#267190
This update ensures that stock reports automatically print when a Point of Sale order is validated. Previously, the print job wasn't triggered, but this change adds a system to retrieve and execute report actions, streamlining the order fulfillment process. This improves efficiency and reduces manual steps.
Original PR description
Validating a `pos.order` creates a stock move in inventory. However, when configuring reports to automatically print on validation, the print job wasn't triggered from the pos. We added a way to retrieve report actions and execute them. Task: 5392414 Forward-Port-Of: odoo/odoo#269614 Forward-Port-Of: odoo/odoo#239084
This update resolves a critical issue where VoIP registration would fail due to a delayed response when a user left a session open and inactive. The fix automatically recreates the registration process, ensuring consistent connectivity and preventing error dialogs. This improves the user experience and reliability of VoIP calls.
Original PR description
Leaving a session open and idle (page open, no activity at all) eventually pops an error dialog: UncaughtPromiseError > RequestPendingError REGISTER request already in progress, waiting for final…
Leaving a session open and idle (page open, no activity at all) eventually pops an error dialog:
UncaughtPromiseError > RequestPendingError
REGISTER request already in progress, waiting for final response
at Registerer.register (sip.js)
at Registerer.register (registerer.js)
at UserAgent.attemptReconnection (user_agent_service.js)
When the WebSocket transport drops while a REGISTER is in flight (which happens on an idle tab: SIP.js sends a periodic re-REGISTER before the registration expires, and the socket may be closed by an idle timeout or by the machine going to sleep in the meantime), the final response never comes back. SIP.js only clears its internal `waiting` flag from the REGISTER response callbacks (onAccept/onReject/onRedirect); it is never reset on transport loss or request timeout. The Registerer is then stuck `waiting` forever, and every subsequent register() rejects with a RequestPendingError.
On top of that, our wrapper's register() did not return the SIP.js promise, and attemptReconnection() called it without awaiting, so the rejection escaped the surrounding try/catch and surfaced as an unhandled promise rejection. Worse, the WebSocket error was resolved right after, so the user appeared reconnected while VoIP registration was actually dead until the page was reloaded.
This commit makes register() recreate the underlying SIP.js Registerer when it is stuck `waiting` (a clean instance starts with waiting=false), and return the promise so callers can await it. attemptReconnection() now awaits it, so any rejection goes through the existing retry/back-off logic instead of bubbling up as an uncaught error.
The recreation is intentionally conditional: disposing a healthy registerer would send an unregister (REGISTER expires=0) racing with the fresh register (expires=600) and could leave us unregistered, so we only recreate when a request is actually stuck.
Forward-Port-Of: odoo/enterprise#120424
Forward-Port-Of: odoo/enterprise#119701This update corrects a bug that caused bank statement imports to incorrectly multiply amounts by 100. This issue occurred when both the bank statement extraction and import modules were active. The fix ensures accurate import of currency values by preventing the CSV wizard from parsing debit and credit columns a second time.
Original PR description
Steps to reproduce --- 1. With Accounting installed, import a bank statement CSV that has separate Debit and Credit columns using number separators (e.g. a line with "1.234,56"). 2. Map the columns…
Steps to reproduce --- 1. With Accounting installed, import a bank statement CSV that has separate Debit and Credit columns using number separators (e.g. a line with "1.234,56"). 2. Map the columns to Debit and Credit and import. The imported amounts are multiplied by 100: "1.234,56" is imported as 123,456.00. Issue --- This only happens when both `account_bank_statement_import_csv` and `account_bank_statement_extract` are installed, which is the default in any Accounting database since both modules are auto-installed. `account_bank_statement_extract` turns debit and credit into real Monetary fields on `account.bank.statement.line`: https://github.com/odoo/enterprise/blob/af863c5a53d0ab50fe67cb9ea910391d4a1979dd/account_bank_statement_extract/models/account_bank_statement_line.py#L7-L8 Because they are now real fields, the generic importer already converts those columns to floats: https://github.com/odoo/odoo/blob/bfa39854e56da4bf23295d62f63d66973ad0d78e/addons/base_import/models/base_import.py#L1281-L1285 The CSV statement wizard then parses the same columns a second time: https://github.com/odoo/enterprise/blob/d7ab7ee1287342638006e290ede20b955aae8370/account_bank_statement_import_csv/wizard/account_bank_statement_import_csv.py#L92-L93 The first pass correctly reads "1.234,56" as "1234.56", but the second pass sees a lone dot, mistakes it for the thousands separator, strips it, and produces 123456. The wizard now parses debit and credit only when they are virtual fields, so when they are real fields the values parsed by the generic importer are reused instead of being parsed twice. Without `account_bank_statement_extract`, debit and credit exist only as virtual import fields, so the generic importer skips them and the wizard parses them once. That is why the regression stays hidden until the extract module is present. opw-6227083 --- Forward-Port-Of: odoo/enterprise#118979
This update fixes an issue where product imports (specifically from UBL invoices) incorrectly associated products based on name. The fix ensures that product matching uses a proper cache key, preventing incorrect product assignments and ensuring accurate data retrieval during import processes. This improves the reliability of UBL invoice processing.
Original PR description
**PROBLEM** When retrieving a product by name, there is no cache_key for the search_method criteria. This leads to the cache_key frozendict being an frozen dict with None values. This means, once we retrieve a first product with the search_method criteria, all following product will match its cache_key, so we ends up associating a product to all subsequent lines, even if they don't have anything in common. **STEP TO REPRODUCE** 1. Create a product with the name: "CASTELTORRE MERLOT DELLE VENEZIE 75CL 10,5i" (it's important the name is not exactly matching) 2. Import the xml which is attached to the bug fix ticket. 3. Notice the product column on all the lines after a certain point have the CASTELTORRE product, even though the corresponding line in the ubl is for another product. opw-6227280 Forward-Port-Of: odoo/odoo#265987
This update resolves an issue preventing the automatic creation of vendor partners when importing electronic invoices (like XRechnungen) using the Peppol EAS 'EM' (Email) method. The fix allows for the '@' character in email endpoints, addressing a validation error that was incorrectly rejecting valid email addresses. This ensures seamless import of invoices with email-based Peppol connections.
Original PR description
### Issue When importing an electronic bill (such as a German XRechnung) that uses the Peppol EAS 'EM' (Email) with an email address as the endpoint, the import fails during the automatic partner…
### Issue When importing an electronic bill (such as a German XRechnung) that uses the Peppol EAS 'EM' (Email) with an email address as the endpoint, the import fails during the automatic partner creation An error is logged in the chatter stating that the Peppol endpoint is not valid and should contain only letters and digits Since 'EM' stands for Email, the system should allow the '@' character and validate the endpoint format ### Cause While the export logic supported the 'EM' EAS, the validation flow triggered during automatic partner creation on import was too restrictive The global regex `PEPPOL_ENDPOINT_INVALIDCHARS_RE` did not include the '@' character, causing the validation to fail for any email address Additionally, there was no specific format check implemented for the 'EM' EAS type to ensure the endpoint is a valid email string ### Steps to reproduce - Install `account_edi_ubl_cii` - Go to Accounting / Vendors / Bills - Upload an electronic invoice containing an EM EAS and an email endpoint (you can use the added test file or the one from the ticket) Before the fix, an error is raised in the chatter and the partner cannot be created automatically opw-6205745 Forward-Port-Of: odoo/odoo#266894
This update ensures that overtime hours recorded in the system are accurately recognized as additional working time. Previously, these hours weren't being fully accounted for, leading to potential discrepancies in employee tracking and payroll. This fix improves the accuracy of time reporting.
Original PR description
make sure that Overtime Hours entries is concidered as extra hours Task: 6279514 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269539
This update corrects a calculation error in the Saudi HR payroll system related to government contributions (GOSI). Specifically, it now accurately prorates GOSI contributions based on the employee's actual worked days, excluding unpaid leave, ensuring accurate payroll processing for Saudi employees. This improves the reliability and compliance of the system.
Original PR description
Task: 6279514 Forward-Port-Of: odoo/enterprise#119990
This update resolves a technical issue where the Urbanpiper order information screen incorrectly displayed customer details even after the customer was removed. The fix ensures that customer information is only shown when a customer is actually linked to the order, improving the user experience and preventing error messages.
Original PR description
Steps to reproduce: ==== - Place an order through Urbanpiper. - Edit the order and remove the customer. - Open the ticket screen and click the info button. - A traceback occurs. Cause: ==== - Customer details were rendered even when no customer was linked to the order. Fix: ==== - Display customer details only when a customer is present on the order. task-6233812 Forward-Port-Of: odoo/enterprise#120290 Forward-Port-Of: odoo/enterprise#118147
This update fixes an issue where the tag container overlapped with the header on the sign page, particularly when translations resulted in a taller header. The changes automatically adjust the container's position and reduce its height to ensure a clean and consistent layout across different languages and content lengths.
Original PR description
Description: - The `.o_sign_template_tags_and_save` container relied on a hardcoded vertical offset (`top: 65px`) while being absolutely positioned. This assumed a fixed control panel height and…
Description: - The `.o_sign_template_tags_and_save` container relied on a hardcoded vertical offset (`top: 65px`) while being absolutely positioned. This assumed a fixed control panel height and caused the tags container to overlap with the header content when the neutralized red header bar expanded to multiple lines due to longer translated strings. - Replaced `top: 65px` with `top: auto` to remove the dependency on a fixed vertical offset and allow the element to be positioned according to its computed static position. - Reduced the height of `.o_field_widget.o_field_many2many_tags` from `50px` to `35px` to better fit the available space within the header area and prevent visual overlap between tag rows and surrounding elements. - This change preserves the existing positioning strategy while making the layout resilient to variable header heights caused by translations and other content-dependent UI variations. 19 - https://github.com/odoo/enterprise/blob/3db8db2eac3dff1485c6a1c977c80e573bfe6cab/sign/static/src/scss/sign_backend.scss#L486 Before fix: <img width="1874" height="443" alt="image" src="https://github.com/user-attachments/assets/196feab3-3460-4ed9-9f57-d7744e9c4e4b" /> After fix: <img width="1319" height="412" alt="image" src="https://github.com/user-attachments/assets/93ae5bcd-f0f0-4999-9cf7-f83b82d689ac" /> Forward-Port-Of: odoo/enterprise#118937
This update corrects a missing rule in the employer cost calculation process, ensuring accurate reporting for employer contributions. This change was identified following a review and directly addresses a previous fix to the overall calculation. It improves the reliability of payroll data.
Original PR description
In this previous PR https://github.com/odoo/enterprise/pull/106839 the computation of the employer cost was fixed and many rules were flagged as needed in that computation. After a report, we found one of the rules was missing so we add it in this PR. Task: 6088412 Forward-Port-Of: odoo/enterprise#112681
This update fixes a bug that prevented receipt printing from the Odoo App's Point of Sale interface. The fix allows users to print receipts for paid orders, mirroring the functionality available in the desktop version. This ensures consistent receipt printing across all Odoo App experiences.
Original PR description
**Steps to reproduce:** - Go on the Odoo App, start the pos - Go to orders, and go to paid ones - Click on review - Click on Print Receipt - It doesn't do anything, but it prints correctly on browser or desktop **Why the fix:** The Odoo app does not support the iframe printing, so we use this commit to make a hook function to be able to patch it in the enterprise related commit in pos_mobile. This is a backport of eb1e824 Enterprise PR: https://github.com/odoo/enterprise/pull/120043 opw-6186261
This update resolves an issue preventing printing receipts from the Odoo Mobile App. The fix allows the app to correctly print receipts, mirroring the functionality available on the desktop and web versions. It's a necessary update to ensure consistent printing across all Odoo platforms.
Original PR description
**Steps to reproduce:** - Go on the Odoo App, start the PoS - Go to orders, and go to paid ones - Click on review - Click on Print Receipt - It doesn't do anything but it prints correctly on browser or desktop **Why the fix:** This is a partial backport of 41e4549 that fixes the app to allow the way we created IFRAMES in PoS since 19.2, allowing us to print on the app again. Community PR: https://github.com/odoo/odoo/pull/265024 opw-6186261
This update fixes a visual issue where suggestion icons weren't appearing in the Odoo Assistant. The problem was due to a missing activity type, which prevented the icons from being correctly displayed. By adding this information, the Assistant now accurately shows suggestion icons for activities like 'Working on task'.
Original PR description
- When the Assistant detected activities such as 'Working on task', the suggestion icon was not displayed because the event type was not assigned. Unlike `aw.rule` matches, the Odoo URL resolver only set the label and related record information, but did not set the activity type required by `getIcon()`. - Expose the activity type through `get_assistant_data` and assign the activity type when resolving model URLs in extractWatcherActivity. task-6259793 Forward-Port-Of: odoo/enterprise#120370
This update ensures that website snippet templates are correctly generated during the website builder process. Previously, a configuration issue caused errors when using certain themes, but this fix guarantees that all necessary templates are created, resulting in a smoother website building experience for our users. It resolves a potential issue where the website wouldn't render correctly after building.
Original PR description
Steps to reproduce: - Start from a database where the eCommerce app is not installed. - Open the website configurator. - In the first step, choose "I want an eCommerce". - In the Pages and Features…
Steps to reproduce: - Start from a database where the eCommerce app is not installed. - Open the website configurator. - In the first step, choose "I want an eCommerce". - In the Pages and Features step, select all Pages. - Select a theme that adds an eCommerce category snippet, for example "Treehouse". - Build the website. => During the first `configurator_apply`, `website_sale` is installed after the theme and the configured menu items are already created. => The homepage rendering then needs a `website_sale` configurator snippet template requested by the theme, but it was not generated during that first call. => The client retries `configurator_apply`. It now succeeds because `website_sale` is fully installed, but page and menu creation runs again and duplicates the menu items. Before this commit, primary snippet template generation only read the manifest of the module being generated. When `website_sale` was installed from the first `configurator_apply`, it did not see addon snippets declared by the already installed theme. The first call could therefore fail while rendering the homepage after pages and menus were created. After this commit, generation also reads installed theme addon snippets that target the module being generated. The `website_sale` configurator templates requested by the selected theme are created before the first homepage rendering, so `configurator_apply` does not retry after creating menu items. task-5973739 Forward-Port-Of: odoo/odoo#261022
11 changes
Enhancements to existing features
This update enhances the visual appearance of Odoo invoices generated through the account_edi_ubl_cii module. The changes include a refined header and footer, a confirmation message indicating the document was created by Odoo, and a disclaimer stating it's not an official document. These improvements contribute to a more professional and user-friendly experience for our clients.
Original PR description
The previous UI was a little bit raw. To improve the client experience, we made the following changes: - Modify an inherited internal layout to improve header and footer. - Add a pill that says "Generated by Odoo". - Add a sentence mentioning that it is not an official document. Task-6132980 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260393
Resolved issues and error corrections
This update resolves an issue where bank statement imports were incorrectly multiplying amounts by 100. This was caused by a double-parsing of debit and credit fields when both the bank statement extraction and import modules are active. The fix ensures the correct amount is parsed the first time, preventing this inaccurate result.
Original PR description
Steps to reproduce --- 1. With Accounting installed, import a bank statement CSV that has separate Debit and Credit columns using number separators (e.g. a line with "1.234,56"). 2. Map the columns…
Steps to reproduce --- 1. With Accounting installed, import a bank statement CSV that has separate Debit and Credit columns using number separators (e.g. a line with "1.234,56"). 2. Map the columns to Debit and Credit and import. The imported amounts are multiplied by 100: "1.234,56" is imported as 123,456.00. Issue --- This only happens when both `account_bank_statement_import_csv` and `account_bank_statement_extract` are installed, which is the default in any Accounting database since both modules are auto-installed. `account_bank_statement_extract` turns debit and credit into real Monetary fields on `account.bank.statement.line`: https://github.com/odoo/enterprise/blob/af863c5a53d0ab50fe67cb9ea910391d4a1979dd/account_bank_statement_extract/models/account_bank_statement_line.py#L7-L8 Because they are now real fields, the generic importer already converts those columns to floats: https://github.com/odoo/odoo/blob/bfa39854e56da4bf23295d62f63d66973ad0d78e/addons/base_import/models/base_import.py#L1281-L1285 The CSV statement wizard then parses the same columns a second time: https://github.com/odoo/enterprise/blob/d7ab7ee1287342638006e290ede20b955aae8370/account_bank_statement_import_csv/wizard/account_bank_statement_import_csv.py#L92-L93 The first pass correctly reads "1.234,56" as "1234.56", but the second pass sees a lone dot, mistakes it for the thousands separator, strips it, and produces 123456. The wizard now parses debit and credit only when they are virtual fields, so when they are real fields the values parsed by the generic importer are reused instead of being parsed twice. Without `account_bank_statement_extract`, debit and credit exist only as virtual import fields, so the generic importer skips them and the wizard parses them once. That is why the regression stays hidden until the extract module is present. opw-6227083 --- Forward-Port-Of: odoo/enterprise#118979
This update resolves a bug preventing the car simulation button and related information from appearing correctly for Belgian employees with car orders. The fix addresses a race condition during salary calculation, ensuring the car details and simulation functionality are displayed reliably upon initial setup. This improves the user experience for employees configuring their salaries.
Original PR description
- Step to reproduce: open the salary configurator for a belgian employee with only a car to order linked to its version. Car info and simulation button are not appearing and the page reactivity is broken
- Cause:
- Broken page reactivity is due to a promise that never resolve in willStart super call because of race condition caused by overlapping calls to a debounced function
- Car model description is computed and displayed only when a new value is passed
- Simulation button is rendered only on select value change
- Solution:
- Execute `updateGross()` and `setUpBenefits()` sequentially in parent willStart to prevent overlapping salary recomputations during startup
- Implementing a condition that handle the case of the new car value being already set in the description computation function
- Triggering the new car change function in willStart so that the simulation button is rendered on page load
Task: 6241194This update corrects a visual issue where employee profile images were stretched in the Odoo system. The change adjusts the image display to ensure they fit properly within their designated areas, improving the overall user experience. This fix was implemented as part of a broader redesign effort.
Original PR description
Vertical images were stretched due to changes made during the form view's redesign (a58ed7d) and after adding a fixed size (6d40ab9). We've added an `.object-fit-contain` class to fix this issue and a rounded border to make the image's aligned with other similar views. task-5418517 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268027 Forward-Port-Of: odoo/odoo#262033
This update corrects a bug in how Odoo retrieves products by name, specifically when importing data from UBL invoices. Previously, the system incorrectly associated products based on partial name matches, leading to inaccurate product assignments. This fix ensures correct product identification during import processes.
Original PR description
**PROBLEM** When retrieving a product by name, there is no cache_key for the search_method criteria. This leads to the cache_key frozendict being an frozen dict with None values. This means, once we retrieve a first product with the search_method criteria, all following product will match its cache_key, so we ends up associating a product to all subsequent lines, even if they don't have anything in common. **STEP TO REPRODUCE** 1. Create a product with the name: "CASTELTORRE MERLOT DELLE VENEZIE 75CL 10,5i" (it's important the name is not exactly matching) 2. Import the xml which is attached to the bug fix ticket. 3. Notice the product column on all the lines after a certain point have the CASTELTORRE product, even though the corresponding line in the ubl is for another product. opw-6227280 Forward-Port-Of: odoo/odoo#265987
This update resolves an issue preventing the automatic creation of vendor partners when importing electronic invoices (like XRechnungen) using the 'EM' (Email) Peppol EAS. The fix allows for '@' characters in email endpoints, ensuring proper partner creation and import functionality. This improves the system's ability to handle common invoice formats.
Original PR description
### Issue When importing an electronic bill (such as a German XRechnung) that uses the Peppol EAS 'EM' (Email) with an email address as the endpoint, the import fails during the automatic partner…
### Issue When importing an electronic bill (such as a German XRechnung) that uses the Peppol EAS 'EM' (Email) with an email address as the endpoint, the import fails during the automatic partner creation An error is logged in the chatter stating that the Peppol endpoint is not valid and should contain only letters and digits Since 'EM' stands for Email, the system should allow the '@' character and validate the endpoint format ### Cause While the export logic supported the 'EM' EAS, the validation flow triggered during automatic partner creation on import was too restrictive The global regex `PEPPOL_ENDPOINT_INVALIDCHARS_RE` did not include the '@' character, causing the validation to fail for any email address Additionally, there was no specific format check implemented for the 'EM' EAS type to ensure the endpoint is a valid email string ### Steps to reproduce - Install `account_edi_ubl_cii` - Go to Accounting / Vendors / Bills - Upload an electronic invoice containing an EM EAS and an email endpoint (you can use the added test file or the one from the ticket) Before the fix, an error is raised in the chatter and the partner cannot be created automatically opw-6205745 Forward-Port-Of: odoo/odoo#266894
This update ensures that reservations are correctly maintained when moving stock between internal locations within Odoo. Previously, the order of reservations was reversed after relocation, leading to incorrect delivery prioritization. This fix reverses the order of reassignment to maintain the original reservation priority.
Original PR description
Version: ---------- - 18.0+ Steps to reproduce: ------------------- - Install `stock` module - Enable `Storage Locations` from Inventory settings - Create a tracked storable product with on-hand 8…
Version: ---------- - 18.0+ Steps to reproduce: ------------------- - Install `stock` module - Enable `Storage Locations` from Inventory settings - Create a tracked storable product with on-hand 8 units in `Shelf 1` - Create Delivery 1 for 5 units and click `Mark as To Do` - Create Delivery 2 for 5 units and click `Mark as To Do` - Verify reservations: - Delivery 1 reserves 5 units - Delivery 2 reserves remaining 3 units - Relocate all 8 units from `Shelf 1` to `Shelf 2` using the `Relocate` action from `stock quant` - Reopen both deliveries Issue: ------ After relocating stock between internal locations, reservations are reassigned in the wrong order: - Delivery 2 becomes fully reserved with 5 units - Delivery 1 is reduced to 3 reserved units This incorrectly swaps the original reservation priority between deliveries. Cause: ------ The relocation wizard starts from: `stock.quant.relocate.action_relocate_quants()` which calls `move_quants()`: https://github.com/odoo/odoo/blob/d3eebbd1c27e8a039bb55cdf2a82d464e06ffa8c/addons/stock/wizard/stock_quant_relocate.py#L70 `move_quants()` validates an internal stock move through `_action_done()`: https://github.com/odoo/odoo/blob/d3eebbd1c27e8a039bb55cdf2a82d464e06ffa8c/addons/stock/models/stock_quant.py#L1572 During validation, `_synchronize_quant()` moves the stock quantity from `Shelf 1` to `Shelf 2`. However, the already reserved delivery move lines still reference `Shelf 1`. This temporarily makes the source quant negative (`available_qty < 0`), triggering `_free_reservation()`: https://github.com/odoo/odoo/blob/d3eebbd1c27e8a039bb55cdf2a82d464e06ffa8c/addons/stock/models/stock_move_line.py#L695-L700 Inside `_free_reservation()`, move lines are ordered using `current_picking_first`: https://github.com/odoo/odoo/blob/d3eebbd1c27e8a039bb55cdf2a82d464e06ffa8c/addons/stock/models/stock_move_line.py#L816-L821 Since both deliveries share the same scheduled date, the fallback ordering uses `-cand.id`, causing Delivery 2 (higher id) to be processed before Delivery 1 (lower id). The reservation cleanup therefore happens in this order: - Remove Delivery 2 reservation (3 qty) - Remove Delivery 1 reservation (5 qty) The corresponding moves are then added to `move_to_reassign` in the same order: `[Delivery 2, Delivery 1]` https://github.com/odoo/odoo/blob/d3eebbd1c27e8a039bb55cdf2a82d464e06ffa8c/addons/stock/models/stock_move_line.py#L849 Later, `move_to_reassign._action_assign()` processes the moves in recordset order: - Delivery 2 reserves 5 units first - Delivery 1 only gets the remaining 3 units As a result, reservation priority is unintentionally reversed after relocation. Fix: ---- Before calling `_action_assign()`, reverse `move_to_reassign` This ensures reassignment preserves the original reservation order: - Delivery 1 is reassigned first and recovers 5 units - Delivery 2 receives the remaining 3 units The reservation state therefore remains consistent before and after internal stock relocation. --- opw-6218256 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269973 Forward-Port-Of: odoo/odoo#265169
This update ensures that overtime hours recorded in the system are accurately recognized as additional working time. Previously, these hours weren't being fully accounted for, leading to potential discrepancies in payroll and reporting. This fix improves the accuracy of time tracking and payroll calculations.
Original PR description
make sure that Overtime Hours entries is concidered as extra hours Task: 6279514 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269539
This update corrects a calculation error in the Saudi HR payroll module that impacted GOSI contributions for employees with unpaid leave. The fix prortions contributions based on worked days, accurately reflecting employee attendance and ensuring correct tax deductions. This improves payroll accuracy and compliance for Saudi Arabian businesses using Odoo Enterprise.
Original PR description
Task: 6279514 Forward-Port-Of: odoo/enterprise#119990
This update resolves a technical issue where the Urbanpiper order information screen incorrectly displayed customer details even after the customer was removed. The fix ensures that customer information is only shown when a customer is actually linked to the order, improving the user experience and preventing error messages.
Original PR description
Steps to reproduce: ==== - Place an order through Urbanpiper. - Edit the order and remove the customer. - Open the ticket screen and click the info button. - A traceback occurs. Cause: ==== - Customer details were rendered even when no customer was linked to the order. Fix: ==== - Display customer details only when a customer is present on the order. task-6233812 Forward-Port-Of: odoo/enterprise#120290 Forward-Port-Of: odoo/enterprise#118147
This update fixes an issue where the tags container overlapped with the header on the sign page due to longer translated strings. The changes automatically adjust the container's position and reduce its height, ensuring a clean and consistent layout regardless of translation lengths. This improves the user experience for all users.
Original PR description
Description: - The `.o_sign_template_tags_and_save` container relied on a hardcoded vertical offset (`top: 65px`) while being absolutely positioned. This assumed a fixed control panel height and…
Description: - The `.o_sign_template_tags_and_save` container relied on a hardcoded vertical offset (`top: 65px`) while being absolutely positioned. This assumed a fixed control panel height and caused the tags container to overlap with the header content when the neutralized red header bar expanded to multiple lines due to longer translated strings. - Replaced `top: 65px` with `top: auto` to remove the dependency on a fixed vertical offset and allow the element to be positioned according to its computed static position. - Reduced the height of `.o_field_widget.o_field_many2many_tags` from `50px` to `35px` to better fit the available space within the header area and prevent visual overlap between tag rows and surrounding elements. - This change preserves the existing positioning strategy while making the layout resilient to variable header heights caused by translations and other content-dependent UI variations. 19 - https://github.com/odoo/enterprise/blob/3db8db2eac3dff1485c6a1c977c80e573bfe6cab/sign/static/src/scss/sign_backend.scss#L486 Before fix: <img width="1874" height="443" alt="image" src="https://github.com/user-attachments/assets/196feab3-3460-4ed9-9f57-d7744e9c4e4b" /> After fix: <img width="1319" height="412" alt="image" src="https://github.com/user-attachments/assets/93ae5bcd-f0f0-4999-9cf7-f83b82d689ac" /> Forward-Port-Of: odoo/enterprise#118937
2 changes
Resolved issues and error corrections
This update resolves an issue where expense descriptions weren't automatically translated when using different database languages (like French). The fix ensures that OCR-extracted descriptions are correctly applied, preventing the expense title from remaining stuck on a placeholder and improving the accuracy of expense data across all Odoo environments.
Original PR description
### Issue On Runbot, trial, and client databases, the automatic extraction of the description does not work when a user changes the database language When an expense is first generated up to 19.0, it…
### Issue
On Runbot, trial, and client databases, the automatic extraction of the description does not work when a user changes the database language
When an expense is first generated up to 19.0, it requires a name and is temporarily given a localized placeholder like "Dépense sans titre..." in French
When the OCR results arrive, the system is supposed to detect this generic fallback string and overwrite it with the real extracted description
However, because of a language mismatch, the system fails to recognize its own placeholder. It incorrectly assumes the user manually entered that text and, to prevent losing user data, refuses to replace it
Before the fix, the title remains stuck on the placeholder
In very rare cases, the translation applies correctly, but it fails most of the time
### Cause
The OCR successfully finds the correct description, but in `_fill_document_with_results`, the expense name is not replaced
This seems to happen because `self` in `self._get_untitled_expense_name("")` carries a residual context that could override the correct language to use during the automated extraction process
Even though the user record and the detected language are correctly set to the alternative language, `default_receipt_name` appears to be generated in English ("Untitled Expense")
This would cause the subsequent string comparison with the actual translated name stored in the database to fail, blocking the update
### Fix
I made some tests in some generated RunBot and the user is correct and also the associated lang
I supposed self was containing lang details overriding the correct language to use
`self.env['hr.expense'].with_context(lang=user_id.lang)` seems to be working
### Steps to reproduce
The issue cannot be reproduced locally, follow these steps on a Runbot instance:
- Retrieve IAP OCR credentials from a trial database
- Enable Developer Mode in Settings
- Go to Settings -> Technical -> IAP -> IAP Accounts
- Add the credentials for the Document Digitization service
- Go to the Expenses app
- Change the user's language to French
- Import the expense image from the ticket
- Open the newly created Expense and click Refresh
Before the fix, the title should stay `Dépense sans titre...` If it's not the case, try a second import, it works times to times
opw-6103935
Forward-Port-Of: odoo/enterprise#118661This update resolves a technical issue where the Urbanpiper order information screen incorrectly displayed customer details even after the customer was removed. The fix ensures that customer information is only shown when a valid customer is associated with the order, improving the user experience and preventing unexpected errors.
Original PR description
Steps to reproduce: ==== - Place an order through Urbanpiper. - Edit the order and remove the customer. - Open the ticket screen and click the info button. - A traceback occurs. Cause: ==== - Customer details were rendered even when no customer was linked to the order. Fix: ==== - Display customer details only when a customer is present on the order. task-6233812 Forward-Port-Of: odoo/enterprise#120290 Forward-Port-Of: odoo/enterprise#118147
7 changes
Enhancements to existing features
This update enhances the appearance of Odoo invoices generated through the account_edi_ubl_cii module. The changes include a refined header and footer, a "Generated by Odoo" indicator, and a disclaimer stating that the document is not official, resulting in a more polished and professional user experience.
Original PR description
The previous UI was a little bit raw. To improve the client experience, we made the following changes: - Modify an inherited internal layout to improve header and footer. - Add a pill that says "Generated by Odoo". - Add a sentence mentioning that it is not an official document. Task-6132980 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260393
Resolved issues and error corrections
This update resolves inconsistencies in our automated tests related to how one2many fields interact with many2one records. The changes ensure tests are more reliable and predictable, leading to greater confidence in the stability of the Odoo platform. This backport addresses a previously unstable testing process.
Original PR description
This commit is a backport of [1] and [2] which fix non deterministic one2many tests involving a many2one. [1] https://github.com/odoo/odoo/pull/266344 [2] https://github.com/odoo/odoo/pull/256582 runbot error~243512 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269739
This update resolves an issue where reloading the Point of Sale while the system was in a specific state caused data loss and errors. The fix prevents a race condition between sending data and loading new information, ensuring a smoother and more reliable user experience when refreshing the POS.
Original PR description
When the user reloads the POS while the session is in opening_control, the beforeunload sendBeacon and the new pos_web request race. If the beacon is processed first it deletes the session and load_data fails. task-6259527 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268668 Forward-Port-Of: odoo/odoo#267190
This update corrects a bug where new tasks were incorrectly linked to the project's customer, leading to data inconsistencies. The fix ensures that task customer information remains accurate by preventing unintended updates to existing partner records. This improves data integrity and the reliability of project management.
Original PR description
Steps to reproduce: -------------------------------------------- 1. Install `website_project` module 2. Create a new project 3. Add a customer to the project 4. Go to customer > add email and phone…
Steps to reproduce:
--------------------------------------------
1. Install `website_project` module
2. Create a new project
3. Add a customer to the project
4. Go to customer > add email and phone
5. Create a new task in that project:
* Observe that the customer is the same as the project
6. Go to Website > Contact Us > Edit > Click on submit button
7. Set action to 'Create a Task' and select the created project in 'Project'
8. Click on Save and Open the URL in Incognito Mode
9. Go to the Contact Us page > Fill in the details > Submit
10. Comeback to our window and open tasks of the created project
Observation:
--------------------------------------------
1. A new task is created using the customer details entered in the form.
2. The existing task’s customer and the project’s customer are also incorrectly updated to this new customer.
Issue:
--------------------------------------------
The bug is in the `extract_data` method of the website form controller for projects.
A non-logged-in user submits the Contact Us form with name and an email that doesn't match any existing partner. The old code's `else` branch would set `partner_name` in the task record values without setting a `partner_id` https://github.com/odoo/odoo/blob/cd080047578b9992811608a5af73a982a414da39/addons/website_project/controllers/main.py#L65-L66
During task creation, the computed field `_compute_partner_id` automatically sets `partner_id` to the project's partner
https://github.com/odoo/odoo/blob/cd080047578b9992811608a5af73a982a414da39/addons/project/models/project_task.py#L1440-L1441
`partner_name` is defined as
https://github.com/odoo/odoo/blob/cd080047578b9992811608a5af73a982a414da39/addons/website_project/models/project_task.py#L12
In Odoo, a related field is essentially a shortcut to a field on a linked record The key attribute here is `readonly=False`. This tells Odoo:
* On read: Get the value from `self.partner_id.name`
* On write: Propagate the write back to `self.partner_id.name` (this is the inverse). So writing `task.partner_name = 'TEST'` is equivalent to writing `task.partner_id.name = 'TEST'`. It modifies the partner record itself, not just the task.
So, the partner record itself was renamed. Every record that references a partner now sees the new name
Solution:
--------------------------------------------
The fix passes `False` to `partner_id`, this way:
* The existing partner is untouched
* All other tasks and the sales order keep their correct customer
opw-6206080
Forward-Port-Of: odoo/odoo#264738This update corrects a bug in how Odoo retrieves products by name during import processes, specifically when using UBL invoices. Previously, the system incorrectly associated products based on partial name matches, leading to inaccurate product assignments. This fix ensures correct product identification during import, improving data accuracy.
Original PR description
**PROBLEM** When retrieving a product by name, there is no cache_key for the search_method criteria. This leads to the cache_key frozendict being an frozen dict with None values. This means, once we retrieve a first product with the search_method criteria, all following product will match its cache_key, so we ends up associating a product to all subsequent lines, even if they don't have anything in common. **STEP TO REPRODUCE** 1. Create a product with the name: "CASTELTORRE MERLOT DELLE VENEZIE 75CL 10,5i" (it's important the name is not exactly matching) 2. Import the xml which is attached to the bug fix ticket. 3. Notice the product column on all the lines after a certain point have the CASTELTORRE product, even though the corresponding line in the ubl is for another product. opw-6227280 Forward-Port-Of: odoo/odoo#265987
A test was failing in the Sendcloud delivery module due to a missing default accounting tax setting. This change adds default accounting data to the test environment, resolving the error and preventing future test failures. This ensures the delivery module's tests run reliably.
Original PR description
Without demo data, test `test_sendcloud_delivery_with_downpayment` fails because of the absence of a default `account_tax` > psycopg2.errors.NotNullViolation: null value in column "tax_group_id" relation "account_tax" violates not-null constraint Fixes runbot errors 243069 - 243677 - 939245 Forward-Port-Of: odoo/enterprise#119846 Forward-Port-Of: odoo/enterprise#118639
This update fixes an issue where the URL used for OAuth authentication with the Romanian tax authority (ANAF) was inconsistent. Previously, the URL was dynamically generated based on the user's access method, leading to authentication failures. This change ensures the correct, standard URL is used, resolving the problem and enabling proper tax reporting.
Original PR description
The `_compute_l10n_ro_edi_callback_url` method was using `request.httprequest.url_root` to build the OAuth callback URL. The URL is derived from the current HTTP request, meaning it reflects however the user accessed the session at that moment (e.g. internal IP, localhost, non-standard port). This produces a callback URL that does not match what was registered with ANAF, breaking the OAuth flow. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265000
3 changes
Resolved issues and error corrections
This update resolves an issue where demo leave allocations weren't correctly processed during an upgrade from Odoo 17 to 18. The fix ensures that leave allocations are properly validated and approved, regardless of whether the database was initially set up or upgraded, preventing data inconsistencies.
Original PR description
Steps: - Install an Odoo 17.0 database with the Indian Payroll module and demo data. - Upgrade the database to 18.0. Issue: - The Indian payroll demo data creates leave allocations and approves them…
Steps: - Install an Odoo 17.0 database with the Indian Payroll module and demo data. - Upgrade the database to 18.0. Issue: - The Indian payroll demo data creates leave allocations and approves them through an XML function call. - During a fresh installation, demo files are loaded in 'init' mode, so the approval function is executed and the allocations move from 'confirm' to 'validate'. - However, during a 17.0 >>> 18.0 upgrade, demo files are loaded in 'update' mode. Odoo automatically loads demo files with 'noupdate=True' from the load_demo() >> load_data() function: - This value is passed to the XML importer and becomes the default noupdate state for the file. Since the demo XML file does not explicitly override this value, the function tag uses 'noupdate=True'. - When the XML parser reaches the approval function, _tag_function() skips its execution because of noupdate = 'True' and mode = 'update' condition. - As a result, the approval function is not executed during the upgrade and the leave allocations remain in 'confirm' state. Subsequent demo payroll data expects validated allocations and fails during loading. Fix: - Explicitly set 'noupdate=0' on the demo XML file. This overrides the default 'noupdate=True' value applied to demo files, making the parser evaluate the section with 'noupdate=False'. - As a result, '_tag_function()' executes the approval method during upgrades, the demo leave allocations are validated in both fresh/new db installations and 17.0 >>> 18.0 upgrade scenarios. runbot error-https://runbot.odoo.com/odoo/error/230430 task-6268381 Forward-Port-Of: odoo/enterprise#119217
This update corrects a potential issue in the Swiss payroll module where users could incorrectly request refunds on payslips. Swiss payroll regulations limit payments to one per month, so the system now directs users to cancel and re-create the payslip for any necessary adjustments. This ensures compliance with Swiss tax laws.
Original PR description
Prevent refunds for CH payslips since only one payslip per month is allowed for Swiss payroll. Users should cancel the payslip and create a new one to apply corrections. task-5951981 Forward-Port-Of: odoo/enterprise#107943
This update fixes an issue where HR users couldn't update employee information, specifically related to generating payroll slips. The change allows HR users to modify employee records without errors, ensuring seamless data management. This resolves a restriction on accessing sensitive payroll data.
Original PR description
Steps to reproduce: -------------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company. 3. Create an employee and create a user with HR rights but without Payroll…
Steps to reproduce: -------------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company. 3. Create an employee and create a user with HR rights but without Payroll rights. 4. Log in with this new user. 5. Update any value on the employee form (e.g., marital status or add a tag). Issue: ----------- Updating the employee raises the following error: ```python You do not have enough rights to access the fields "slip_ids" on Employee (hr.employee). Please contact your system administrator. Operation: read User: 2 Fields: - slip_ids (allowed for groups 'Payroll / Officer: Manage all contracts') ``` Cause: --------- After this 4416eda, open payslips are recomputed automatically on every employee update: https://github.com/odoo/enterprise/blob/8f7a43eebdc8f7f46f9d61ab7084e036c20f778e/l10n_ch_hr_payroll_elm_transmission/models/hr_employee.py#L210-L213 `slip_ids` is restricted to payroll users: https://github.com/odoo/enterprise/blob/8f7a43eebdc8f7f46f9d61ab7084e036c20f778e/hr_payroll/models/hr_employee.py#L14 As a result, when an HR user without payroll rights updates an employee, accessing slip_ids raises an **AccessError**. Solution: ----------- Use sudo() when accessing slip_ids so HR users can update employee records without issue. **NOTE:** The issue has been resolved from version saas~18.4 with the following commits: 279f09a9587674c035c514f966788a4dddfe9794 and 75d66d8 opw-6210358 Forward-Port-Of: odoo/enterprise#117387
7 changes
New functionality added to Odoo
This update adds several new leave types to the payroll system, specifically designed to accommodate situations related to variable salary. These include options for family events, legal duties, and educational time off, ensuring employees can accurately reflect their time off when their compensation fluctuates. This enhancement improves payroll accuracy and employee support.
Original PR description
This commit adds those leaves for the loss on variable salary LEAVE550 Marriage (Employee) LEAVE551 Marriage of a Family Member YOUNG02 Child Ceremony (Communion / Secular Youth) LEAVE230 Birth Leave (Father / Co-parent) LEAVE650 Child Adoption / Long-Term Foster Care LEAVE450 Death of Partner or Child LEAVE451 Death of Parent or In-law LEAVE452 Death of Extended Family Member LEAVE453 Death (One Day Leave) LEAVE350 Civic or Judicial Duty LEAVE250 Urgent Family or Social Reason (Unpaid) LEAVE213 Extra Legal Time Off LEAVE260 Educational Time Off WORK207 Non-taxable service for political representatives LEAVE600 Solicitation Time Off Task-6275805
Enhancements to existing features
This update introduces support for calculating and reporting the 13th month for employees in Belgium, aligning with local regulations. Employers now need to track and prorate this amount, which impacts payroll calculations and reporting, ensuring accurate tax deductions and payslip information. The system now handles the complexities of calculating this 13th month based on work hours and leave types.
Original PR description
At the end of the year, or when ending collaboration with an employee, the employer may have to compute (not pay) the gross amount of the 13th month that the employee is supposed to get, and send it…
At the end of the year, or when ending collaboration with an employee, the employer may have to compute (not pay) the gross amount of the 13th month that the employee is supposed to get, and send it to a Special Social HORECA Fund. Then, this fund will take care of the rest of the paperwork to deduct taxes from the 13th month and send a payslip to the employee. Since the employer does not pay the 13th month, but the Social Fund, the employer has to send an equivalent of *12%* of the amount of the gross salary submitted to the ONSS, each month, to the social fund. For workers, the percentage is applied on *108%* of the gross salary. Those values concerning the 13th month do not impact the employee's payslip, but still have to appear on it. So an "is_informative" field has been added to tell whether it should be displayed in this special section of the payslip. - If you're an employee, then your non-proratized 13th month (i.e.: its max value) is the wage of your last payslip (i.e.: `employee_id.wage`) - If you're a worker (*ouvrier*), then the 13th month's max value is `your hourly wage * average max number of hours per month` You then need to proratize the result in relation to the number of days that have really been prestated and assimilated. **NOTE:** - **prestated days** are days you have really worked - **assimilated days** are leaves that still count as a work days (e.g.: legal leaves) The sectorial documentation describes multiple proratization methods, but they are all equivalent to this basic formula: `(hours you have prested and assimilated / max number of hours you can prestate or assimilate) * max 13th month you can get` **These work entries are always assimilable:** - legal leaves - extra legal leaves - public holidays - small unemployment - compensatory rest - civic duties - public mandates - union obligations - strikes - temporary unemployment - unemployment force majeure **These work entries are assimilable with a limit of time per year:** - maternity leaves: 15 weeks - union education: 12 days - military service: 6 months - compelling reasons: 10 days - paternity leaves: 10 days - military reserve calls': 74 days **The first 12 months of partial incapacities following a total incapacity can be assimilated.** But, the partial incapacity must be of at least of 66%, by 66%, they mean at least 2/3 of the week should be a time off due to the incapacity. Since we don't really have a way to define that, as of now, partial incapacities are not assimilated. **Long sick leave periods can be assimilated at a rate of _50%_:** - The period must be uninterrupted and of at least 6 months - If it's smaller than 6 months, then we can see accross neighboring years if it continues, and if it is more than 6 months - If in the end it's more than 6 months, you can assimilate the period of the current year (max 6 months per year) - No period can be assimilated twice (e.g.: a period of two years cannot be assimilated in both years) **Short sick leave periods can be assimilated:** - Up to 7 uninterrupted days per year can be counted assimilated. But, if you have more than a defined threshold of sick leave days, then none are counted. - If you have at least a year of seniority, then the threshold becomes 6 months (i.e.: you still have your days if the number of days are below six months). Otherwise, the threshold is 7 days. In both cases, max 7 days can be assimilated per year. **Some days after the end of the contract up to the end of the year can be assimilated:** - All days if the personnel is retired - All days of early reitrement (aka "Prépension") assimilated at a rate of 20% - Max. 6 months for dead personnel Even though this 13th month is not directly paid by the employer, it still is a gross wage for the employee, so, the value of the 13th month should be included in the computation of the CSS (*special social cotisation*) [PARTENA's sectorial documentation](https://drive.google.com/file/d/1i8bj425ccEW0ZGvNSaQvEV6VIedmLYCS/view): task-5477296
This update enhances the work order Gantt view by now displaying completed work orders, providing a more accurate representation of past production progress. Cancelled work orders remain hidden to maintain a clean and focused planning board. This improves planning and reporting accuracy.
Original PR description
The work order Gantt view previously hid both completed and cancelled work orders, which made the planning board look empty for past dates. This update ensures that completed (done) work orders remain visible to provide a clearer picture of actual production progress, while cancelled work orders remain hidden to prevent visual clutter. This commit's changes: - Updated the action domain to filter out only 'cancel' states, allowing 'done' work orders to be displayed in the Gantt view. - Updated the workcenter and employee Gantt view definitions to include a 'decoration-secondary' rule for the 'done' state. - Added custom SCSS to visually fade completed work order pills using reduced opacity. - Replaced the "Mark as Done" button in the Gantt popover with explicit status messages for completed work orders. - Cleared default search filters from the dependency Gantt actions, while explicitly keeping the `show_workcenter_status` context. task-6169405
Resolved issues and error corrections
This update corrects a misleading warning message displayed during pay run creation. Previously, users received warnings for pay runs where the employee was already included, even if the warning was incorrect. Now, the system only alerts users to pay runs where the employee is genuinely missing, improving accuracy and reducing unnecessary notifications.
Original PR description
Previously, when creating a new version of an employee, warnings would have been shown telling the user that the employee is missing in every pay run already created, even the ones where the employee was actually already included. Now, only the right pay runs missing the employee are shown on the warnings. task-6252396
This update corrects an issue where planning roles weren't being assigned correctly in the Enterprise system. The change ensures that the default planning role is set properly after other role assignments, streamlining the planning process for users. This improves the overall efficiency of project planning within Odoo Enterprise.
Original PR description
https://github.com/odoo/odoo/pull/265469
Features or functions removed from Odoo
This pull request removes several community-developed apps from the core Odoo Enterprise platform. These apps were identified as no longer essential and were removed to streamline the system and reduce potential maintenance overhead. This change improves the overall performance and stability of the Odoo Enterprise environment.
Original PR description
- Community https://github.com/odoo/odoo/pull/267998
Code cleanup and technical improvements
This update simplifies the underlying code for our account reporting modules. As part of a larger migration, the team has replaced older components (`t-custom-model`) with newer, more efficient structures (`t-model` and `t-model.proxy`). This ensures continued stability and performance.
Original PR description
* = [accountant_knowledge] As part of the migration from `owl 2` to `owl 3`, this commit replaces uses of `t-custom-model` with `t-model` or `t-model.proxy`. community: https://github.com/odoo/odoo/pull/269573
7 changes
Resolved issues and error corrections
A technical issue prevented users with limited time-off permissions from accessing the Attendances Gantt View when viewing leave requests. This fix ensures that the Gantt View correctly displays leave information for all users, regardless of their access rights. The change uses a security enhancement to correctly access necessary data.
Original PR description
Version: - 19.0 Steps to reproduce: - Install Attendances and Time Off - Create an internal user. - Give the user: Attendances Officer access & No Time Off Officer/Manager rights - Create an employee…
Version: - 19.0 Steps to reproduce: - Install Attendances and Time Off - Create an internal user. - Give the user: Attendances Officer access & No Time Off Officer/Manager rights - Create an employee linked to the user. - Configure the employee with a Flexible Working Schedule. - Create and approve a Time Off request for the employee. - Open: Attendances -> Gantt View - Navigate to the month containing the employee's approved leave. Issue: - An access error is raised when opening a month that contains the employee's approved leave. Cause: - In `_handle_flexible_leave_interval`, the code accesses `leave.holiday_id` to read fields such as `request_unit_half`, `request_unit_hours`, and `request_hour_from/to` on the `hr.leave` model. - When the current user has Attendances Officer rights but no Time Off access(rare cases), the ORM access check on `hr.leave` raises an AccessError, even though this read is purely for internal calendar computation and does not expose leave data to the user interface. Fix: - Added sudo() on holiday_id to access the employee's leave details and compute the work interval as expected. Task-6264510
This update ensures that data associated with IoT boxes used in point-of-sale systems is protected when those boxes are removed from the system. Previously, deleting an IoT box could lead to data loss. Now, the system verifies that the box's fiscal data isn't currently in use before allowing deletion, safeguarding important sales information.
Original PR description
Before unlinking an iot.box from the database, we must ensure that its fiscal data module is not currently used in any pos.config. task-id: 5144489
This update corrects a calculation error in the GOSI (Saudi Government Social Insurance) payroll contributions for employees with unpaid leave. The fix prortions contributions based on worked days, accurately reflecting employee attendance and ensuring correct deductions. This improves payroll accuracy and compliance in the Saudi Arabia region.
Original PR description
Task: 6279514
This update resolves an issue in the website editor for renting products where removing the quantity field caused an error. The fix ensures the system gracefully handles scenarios where the quantity field is no longer present, preventing tracebacks and improving user experience. This change was introduced in version 19.0.
Original PR description
Before this commit, the function `setAddQtyInputMax` in `/website_sale_renting_planning/static/src/interactions/website_sale.js` assumes `this.el.querySelector("input[name='add_qty']");` will always return not null but you can remove this field through the website error and cause a traceback.
https://github.com/odoo/enterprise/blob/c1d47899c90fcfa426e1863887111d3ea9f6f15e/website_sale_renting_planning/static/src/interactions/website_sale.js#L18-L39
Steps to reproduce issue:
Runbot 19.0
Open renting -> Products
Select a product (preferably one created by default runbot setup) Click the smartbutton to go to this products web page Open the website editor
Click Edit
Under the styles tab, de-select the quantity field See error message
**Only happens in 19.0**
Introduced in https://github.com/odoo/enterprise/commit/89962571c246caf05e669bb63ad933e67e74ab61
opw-6294612This update addresses a missing rule in the calculation of employer costs within the Odoo Enterprise HR module. Following a review, a crucial rule was added to ensure accurate cost determination, building upon previous improvements. This ensures compliance and accurate reporting of employer costs.
Original PR description
In this previous PR https://github.com/odoo/enterprise/pull/106839 the computation of the employer cost was fixed and many rules were flagged as needed in that computation. After a report, we found one of the rules was missing so we add it in this PR. Task: 6088412
This update resolves a technical issue where the Urbanpiper order information screen incorrectly displayed customer details even after the customer was removed. The fix ensures that customer information is only shown when a valid customer is associated with the order, improving the user experience.
Original PR description
Steps to reproduce: ==== - Place an order through Urbanpiper. - Edit the order and remove the customer. - Open the ticket screen and click the info button. - A traceback occurs. Cause: ==== - Customer details were rendered even when no customer was linked to the order. Fix: ==== - Display customer details only when a customer is present on the order. task-6233812 Forward-Port-Of: odoo/enterprise#120290 Forward-Port-Of: odoo/enterprise#118147
Code cleanup and technical improvements
This update refactors the bank statement import controller to avoid conflicts with other Odoo modules. By using a more generic controller and removing unnecessary code, the import process is now more reliable and efficient. This change ensures consistent behavior and reduces potential errors.
Original PR description
account_bank_statement_import_view was using the same controller used in account.move which caused some wrong behavior when some logic isn't shared between both modules, now account_bank_statement_import uses a generic controller that doesn't add unneeded behavior. As well as removing all of the account move classes from bank statement import and using generic ones or ones specific to account bank statement import. task-5892419
7 changes
Enhancements to existing features
This update enhances the user experience of Odoo's account EDI UBL reports by refining the PDF template's design. Specifically, the header and footer have been improved, and a disclaimer has been added to clarify that the document is not an official one. These changes focus on presentation and clarity.
Original PR description
The previous UI was a little bit raw. To improve the client experience, we made the following changes: - Modify an inherited internal layout to improve header and footer. - Add a pill that says "Generated by Odoo". - Add a sentence mentioning that it is not an official document. Task-6132980 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This update fixes a discrepancy in inventory reporting by ensuring that BOM calculations correctly consider the currently selected company. Previously, inventory counts could be inaccurate when switching between companies. This change improves the reliability of available quantity reports, leading to more accurate stock management.
Original PR description
## Problem If `qty_available` is computed with sudo (this can happen downstream of a `value_svl` compute), `bom_find` will discover boms that do not belong to the currently selected company. This can…
## Problem
If `qty_available` is computed with sudo (this can happen downstream of a `value_svl` compute), `bom_find` will discover boms that do not belong to the currently selected company. This can lead to discrepancies with the apparent available quantity.
## Solution
We will more strictly enforce the contextual companies when building the `_bom_find_domain`, looking at `self.env.context.get('allowed_company_ids')` and `self.env.companies.ids` as well as the original `company_id` and `self.env.context.get('company_id')`.
## Steps to Reproduce (runbot v18)
- 2 companies
- Storable product available to both companies
1. Create a BoM while on company 1, set to kit type, specify company 1, and consume at least one component
2. Switch to company 2 and receive 10 units (this should create inventory of the product itself, not the component)
3. On the product form, note 10 units on hand
4. Navigate to Inventory > Reporting > Stock, and search for the product. There are 0 units available (because you have no components)
opw-6228875This update resolves an issue where navigating between tasks within Odoo caused unexpected errors due to outdated information being restored from the browser's session storage. The fix ensures that only dynamic actions are reused, preventing errors related to invalid context data and improving overall task navigation stability.
Original PR description
Steps to reproduce: - Open any project task - Click a project notification that opens another task (requires the corresponding notification preference to be enabled) - Use the browser's Back and Forward buttons => Traceback: active_id is undefined When navigating to a form view via a URL (e.g. `/odoo/m-<model>/<id>`), the action service looks up the last action from session storage and reuses it if the model matches. This behavior, introduced in a4b179a7118916aac032ad252c0e421d452e553c, does not discriminate between dynamic and non-dynamic actions. Non-dynamic actions (those with an id) may rely on context values such as active_id that are only valid in their original execution context. Restoring such an action during browser history navigation causes a traceback because active_id is undefined. Fix by only reusing the session-stored action when it is a dynamic action (no id).
This update corrects a bug that prevented invoices using French PDP (Payment Data Provider) identifiers from being processed correctly. The issue stemmed from incorrectly retrieving PDP information from sub-contacts instead of the associated company. This change ensures invoices with French PDP identifiers can be sent successfully.
Original PR description
…cial partner **STEP TO REPRODUCE** 1. Install l10n_fr_pdp. 2. On the demo FR company contact, create a new contact of type invoice address. 3. Create an invoice with this new contact, and try send the invoice. 4. The pdp invoice constraints checking for pdp identifiers fails. **CAUSE** We use the partner to retrieve the peppol_eas and peppol_endpoint field values, but for subcontact, those field are empty. We should use the commercial_partner_id which correspond to the company we try to invoice instead. opw-6235830
This update fixes an issue where the sandwich rule incorrectly excluded public holidays from leave calculations. Now, when 'Include Public Holidays as Working Day' is selected, the system accurately determines the total leave duration, including weekend days that fall on public holidays. A new test case has been added to ensure this fix works as expected.
Original PR description
Problem: When a time off type is configured with "Include Public Holidays as Working Day", the sandwich rule was still treating public holidays as non-working days. This caused the sandwiched weekend days to not be included in the leave duration. Example: Employee applies leave from May 15 (Friday, Public Holiday) to May 18 (Monday). Expected duration is 4 days since May 15 is a working day and May 16-17 (weekend) should be sandwiched. Instead, only 1 day was calculated. Fix: Now when "Include Public Holidays as Working Day" is enabled, the correct number of days are calculated in the sandwich rule. Also added a test case to verify that public holidays are correctly treated as working days during sandwich rule evaluation. Task-4570118
This update fixes a validation error that occurred when importing Polish tax invoices (KSeF) via XML. The change relaxes a requirement for mandatory 'P_9A' and 'P_11' fields, allowing invoices with missing or zero values to be processed correctly. This ensures smoother invoice import and avoids interruptions in the automated tax processing workflow.
Original PR description
When importing bills, if `P_9A` and `P_11` are absent or zero, a `UserError` is raised: `No net or gross unit price found in the FA (3) for the line with the product.` **Steps to reproduce:** - Upload the problematic XML file as an attachment via `Settings -> Technical -> Attachments` - Create a `validator` server action with the code provided in the referenced ticket, with the `Add Contextual Action` flag set - Reload the page - Select the attachment in list view - Click the gear icon - Run the newly created server action KSeF FA(3) schema documentation: https://ksef.podatki.gov.pl/media/4u1bmhx4/information-sheet-on-the-fa-3-logical-structure.pdf Ticket [link](https://www.odoo.com/odoo/project.task/6211065) opw-6211065
This update resolves an issue where sending Jordanian e-invoices would trigger a 'divide by zero' error when a line item had a quantity of zero. The fix ensures invoices with zero quantities are now successfully processed and sent, preventing disruptions in the invoicing workflow. This improves the reliability of the Jordanian e-invoicing functionality.
Original PR description
Steps to reproduce: - Ensure Jordanian e-invoicing is installed - Create an invoice where one of the lines has a 0 quantitiy - Send the e-invoice JoFotara (Jordan EDI) Current Behavior: You will get a divide by 0 error popup Expected Behavior: No error and the invoice is sent opw-6262469 Forward-Port-Of: odoo/odoo#269341
3 changes
Resolved issues and error corrections
This update resolves a bug where Odoo incorrectly identified ZIP files when reading from buffers due to a problem in the underlying Libmagic library. The change adapts Odoo's system to use a custom fallback, ensuring accurate MIME type detection for ZIP files and related document formats, preventing potential errors in file handling.
Original PR description
Libmagic version 0.46 (currently available in Debian Trixie/Forky and Ubuntu Resolute) introduced a regression regarding ZIP file detection. While it correctly identifies a ZIP file when reading…
Libmagic version 0.46 (currently available in Debian Trixie/Forky and Ubuntu Resolute) introduced a regression regarding ZIP file detection. While it correctly identifies a ZIP file when reading directly from a file path, it fails when reading the exact same content from a buffer, returning a generic 'application/octet-stream' instead. Because `guess_mimetype` primarily evaluates buffers, this upstream bug breaks MIME type detection for ZIP files (and related formats like docx, xlsx, etc.) in Odoo environments running this libmagic version. Since we cannot directly fix the library itself, this commit adapts Odoo's `guess_mimetype` to fallback to our custom implementation when libmagic returns the generic 'application/octet-stream' to workaround this library's bug. Upstream libmagic fixes: - https://github.com/file/file/commit/f1adef05b8a85be50d28965b1fd21fcceacf7a4e - https://github.com/file/file/commit/60b2032b96fc185b37fb0f2152e834efb2edad6e Upstream python-magic issue: - https://github.com/ahupp/python-magic/issues/354 runbot-938197
This update corrects a potential issue in the Swiss payroll module where users could incorrectly request refunds for payslips. Swiss regulations limit employees to one payslip per month, so the system now directs users to cancel and re-create the payslip for any necessary corrections. This ensures compliance with Swiss payroll rules.
Original PR description
Prevent refunds for CH payslips since only one payslip per month is allowed for Swiss payroll. Users should cancel the payslip and create a new one to apply corrections. task-5951981
This update corrects a bug where Google Calendar attendee information was being dropped incorrectly when an attendee's email matched a configured alias. The fix ensures all attendees are accurately synchronized, preventing missed invitations and improving event planning. This resolves a previous issue impacting event accuracy.
Original PR description
_get_sync_partner excludes partners whose email matches a configured alias, returning a list shorter than the emails/google_attendees lists. zip() stops at the shortest, silently dropping the last Google attendee instead of the alias-matched one. Fix by replacing the positional zip with a by-email dict lookup, so each attendee is resolved independently and only the unresolvable one is skipped. opw-6086240