Monday, August 24, 2026
27 changes · saas-18.3
Resolved issues and error corrections
Users can now open credit card and cash journal statements directly from the accounting dashboard list views. This fixes a navigation issue that prevented reviewing individual statements from those lists.
Original PR description
Issue: When opening the credit card statements list view from clicking the "Statements" button in the accounting dashboard of a credit card journal, the resulting list view does not allow clicking on any of the items to enter the form view Steps to reproduce: 1. Create a credit card journal and some credit card statements 2. Go to the accounting dashboard, and click on the button with three dots to the upper right of the credit card journal card and click "Statements" 3. Try to click on any of the statements in the list view and it won’t open any of them Cause: The window action for credit card journals (action_credit_statement_tree) was missing the form view in the view_mode Solution: Add form to the view_mode of action_credit_statement_tree. The cash journal bank statements window action (action_view_bank_statement_tree) was also missing the form view, so it was added as well opw-6449315 Forward-Port-Of: odoo/odoo#282816
Project profitability reports now correctly show cost of goods sold when sales include stocked products under Anglo-Saxon accounting. This gives users a more accurate view of project profitability by preventing valid costs from being cancelled out in the report.
Original PR description
**Problem:** Since this PR https://github.com/odoo/odoo/pull/261798, both cogs lines have an analytic account, which causes the cogs to not appear on the project profitability report because cogs…
**Problem:** Since this PR https://github.com/odoo/odoo/pull/261798, both cogs lines have an analytic account, which causes the cogs to not appear on the project profitability report because cogs lines balance each other **Steps to reproduce:** - enable 'anglo saxon accounting' and 'analytic accounting' settings - create a storable product with automated std category, a cost of 10 and on hand quantity - create a service product and set the 'create on order' field to 'project' - confirm a SO for 1 unit of the product and 1 unit of the service - validate the delivery and create and confirm invoice - from the sale order, click on the project smart button - from the project click on the dashboard smart button **Current behavior:** the cogs section don't appear in the profitability report **Expected behavior:** it should appear with a line with a value of -10 **Cause of the issue:** since this PR https://github.com/odoo/odoo/pull/261798, both cogs line are linked to the analytic account. That's the expected behaviour but in the case of the project profitability reports, it prevents the user the see the cost of the product in the cogs section. That's because, inside the _get_revenues_items_from_invoices() method, bot cogs_line are added to the cogs_line list. https://github.com/odoo/odoo/blob/141cb292dc5e456161119e19f7a91665feaa0198/addons/sale_project/models/project_project.py#L699-L700 So when computing the amount_to_invoice for the costs ml_type, the balance of the lines will zero out each other and amount_to_invoice will be 0. https://github.com/odoo/odoo/blob/141cb292dc5e456161119e19f7a91665feaa0198/addons/sale_project/models/project_project.py#L703-L716 As a consequence, the cost of goods sold section won't be created https://github.com/odoo/odoo/blob/141cb292dc5e456161119e19f7a91665feaa0198/addons/sale_project/models/project_project.py#L718-L719 **fix:** only the line with an account of internal type 'expense' reflects the actual cost of the product sold in the context of the project. So when computing the profitability report that's the only line we should consider **test:** test_report_invoice_items_anglo_saxon_automatic_valuation checks that the cogs section is well displayed in the project profitability report. In the PR (mentionned above) which sets the analytic account on the stock cogs line, lines were added in the test to manually remove the analytic account on the stock cogs line to make the test pass. With the fix of this PR we can remove those additional lines in the test and it will check our use case well again. opw-6412409 Forward-Port-Of: odoo/odoo#283144
The Indian localization now correctly shows the “View Journal Item(s)” link in lower TCS tax warnings. This helps users quickly open the related accounting entries from the warning instead of having to search for them manually.
Original PR description
The `lower_tcs_tax` warning was using the "actions" key instead of "action". As a result, the warning message was displayed correctly, but the "View Journal Item(s)" action link was not shown.
The accounting dashboard now shows the full invoice or bill amount for documents marked "To Check" instead of only the unpaid balance. This avoids understating the value of documents that still require review, especially when they have been partially paid.
Original PR description
Currently, the "To Check" links on the dashboard display the residual amount of invoices and bills. Since the entire document needs to be checked regardless of partial payments, showing the remaining balance is misleading. This commit updates the `selects` list in `_get_to_check_payment_query` to use `amount_total` instead of `amount_residual`, ensuring the dashboard reflects the full value of the documents. Task-6478415 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Inventory transfers with zero requested quantity are now included when calculating past forecasted stock levels. This prevents past inventory forecasts from incorrectly showing negative quantities after certain unplanned physical transfers.
Original PR description
**Problem:** When creating a transfer that moves out a product with zero demand quantity, it will change the forecasted quantity of that product in the past. **Cause:** The query filtered out the stock move with zero demand quantity, which preventing the system from accounting for unplanned physical transfers when retroactively calculating past inventory balances **Steps to reproduce the issue:** 1. Create a stock picking with 0 demand quantity that moves a product from an internal location to a virtual location or production location. 2. The forecasted quantity of the product becomes negative in the past. **Fix:** Add another check in the query to include stock moves with zero demand quantity. **Notes:** Since the forecast report is made from a SQL view, this will require a -u to update the report. opw-6462883 Forward-Port-Of: odoo/odoo#283577
Product videos in the online shop carousel now load only when they are shown, so their preview image is generated at the correct size. This prevents blurry video covers on product pages and improves the shopping experience for customers viewing product media.
Original PR description
Steps to reproduce: =================== 1. Add a video (e.g. a YouTube URL) to a product from the Sales app. 2. Open the product page on the website. 3. Slide the carousel to the video. => The video…
Steps to reproduce: =================== 1. Add a video (e.g. a YouTube URL) to a product from the Sales app. 2. Open the product page on the website. 3. Slide the carousel to the video. => The video preview cover is blurry. Root cause: =========== The product images are rendered in a carousel (the shop_product_carousel template in ) where only the first slide gets the "active" class; https://github.com/odoo/odoo/blob/af1b3ee2e7ac56a35bff5e030c3a831c27dbcf24/addons/website_sale/views/templates.xml#L3224-L3226 every other slide is "display: none". A product video is rendered as a live <iframe> inside its slide, so when the video is not the first media its iframe loads while its container has no dimensions (0x0). The embedded player then initializes as a small mobile player and loads a low resolution cover thumbnail (120x90), which looks blurry once the slide is shown at full size. Reloading only the iframe while the slide is visible fixes it, a full page reload does not. Fix: ==== Defer loading the video iframes located on hidden slides their src is moved to a data-src attribute on start and restored once the slide becomes visible. The player then initializes at full size and loads a high resolution cover. opw-6349394 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274002
This fix prevents an error when users select text in an editor, type '/' to open the command menu, and apply a command such as a separator. It keeps the editor cursor in a valid position after restoring a save point, improving reliability during content editing.
Original PR description
#### Steps to reproduce: - In an editor field, select some text. - Type `/` to open the powerbox: the selected content gets deleted. - Apply any command, e.g. `Separator`. => Error: Selection is not…
#### Steps to reproduce: - In an editor field, select some text. - Type `/` to open the powerbox: the selected content gets deleted. - Apply any command, e.g. `Separator`. => Error: Selection is not in editor #### Description of the issue this PR addresses: - `makeSavePoint` overwrites the preserved cursors with the selection staged on the last reverted step, then re-applies the draft mutations. Here those mutations are the deletion of the selected content, done by `onBeforeInputInsertText` before `SearchPowerboxPlugin.onBeforeInput` makes the savepoint. Re-applying them removes the very nodes the staged selection points to, so the cursors end up detached. #### Desired behavior after PR is merged: - Only reset the cursors when there is no draft mutation, so the initially preserved selection is restored instead. - This check added in 19.0 [1], but it isn't in 18.0 to saas-18.4. [1]: https://github.com/odoo/odoo/pull/244758 task-6442210 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282162
This fix prevents temporary wizard screens from being treated as available targets for mass mailings. It keeps mailing recipient choices cleaner and avoids users selecting internal setup flows that should not receive campaigns.
Original PR description
The search function ` _search_is_mailing_enabled` mistakenly used `model.is_transient()` (where the model is the `ir.model` record itself) to filter the transient models, which always returns `False` since `ir.model` is a regular persistent model. As a result, transient models (wizards) were never filtered out. This commit fixes it by using`self.env[model.model].is_transient()` to call `is_transient` on the actual model. Task-6458883 Forward-Port-Of: odoo/odoo#282783
Clicking a table of contents entry now positions the selected heading at the top of the page instead of near the bottom. This makes long Knowledge articles easier to navigate and ensures readers immediately see the start of the chosen section.
Original PR description
Root cause: Since https://github.com/odoo/odoo/commit/f5cf856 the table of contents uses the scrollTo helper from web to reach the clicked heading. The helper only makes the element visible. When the…
Root cause: Since https://github.com/odoo/odoo/commit/f5cf856 the table of contents uses the scrollTo helper from web to reach the clicked heading. The helper only makes the element visible. When the heading is below the screen it is placed at the bottom border of the scrollable area, so the reader sees the heading but not the section under it. The second scrollTo call that was meant to correct this does nothing because the heading is already visible after the first scroll, so no branch of the helper runs. Fix: Pass isAnchor to the scrollTo call in scrollIntoView of table_of_content_manager.js. With this option the helper always places the element at the top of the scrollable area in both scroll directions, and the offset computed for sticky elements keeps working. The second scrollTo call is removed since one call is enough. This method is the one changed by the commit above and it is used by the editor and the readonly viewer, so both are fixed. Steps to reproduce: 1. Open the Knowledge app and create an article 2. Add several headings with paragraphs between them so the article is longer than the screen 3. Type /table and insert a Table of Contents at the top of the article 4. Click an entry of the table of contents that points to a heading below the visible part of the page => the page scrolls so the heading is at the bottom of the page instead of the top Ticket [link](https://www.odoo.com/odoo/project/49/tasks/6376092) opw-6376092
Archiving or deleting one user no longer removes a shared contact from restricted discussion channels if another active user for that contact still has the required access. This prevents accidental loss of channel membership for organizations that use multiple users tied to the same contact.
Original PR description
Before this commit, archiving or deleting a user removed its partner from every group restricted channel, even when another user of that partner was still active and in the group the channel requires. This happens because the members to unsubscribe are searched on partner_id alone, so the search cannot tell whether the partner keeps another user. This commit fixes the issue by unsubscribing a partner only when none of its remaining users has the group the channel requires. Forward-Port-Of: odoo/odoo#283807
This update fixes incorrect Hungary tax configuration data used in Odoo localization. It helps businesses using Hungarian accounting and e-invoicing rely on more accurate tax settings for compliance and day-to-day operations.
Original PR description
Adjusting incorrect tax configuration elements for Hungary. task-6397915 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282697
The accounting dashboard now shows the full invoice or bill amount for documents marked “To Check,” rather than only the remaining unpaid balance. This gives users a clearer view of the total value that still needs review, even when partial payments have already been made.
Original PR description
Currently, the "To Check" links on the dashboard display the residual amount of invoices and bills. Since the entire document needs to be checked regardless of partial payments, showing the remaining balance is misleading. This commit updates the `selects` list in `_get_to_check_payment_query` to use `amount_total` instead of `amount_residual`, ensuring the dashboard reflects the full value of the documents. Task-6478415 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a Safari-specific editing issue where pressing Shift+Enter in Knowledge articles created a new paragraph instead of a soft line break. Users on Mac Safari can now format article text as expected, reducing editing friction and inconsistent document layout.
Original PR description
**Steps to reproduce:** - Use a Mac with Safari - Install Knowledge app - Go to any article - Press Shift+Enter to try to enter a soft line break - Hard split is done instead **Issue:** Shift+Enter causes a `insertParagraph` event instead of `insertLineBreak` in Safari, which triggers the `SplitPlugin` instead of the `LineBreakPlugin`. **Fix:** Check if the browser is Safari and call `insertLineBreak` from the `SplitPlugin` (when needed) by listening to the "keydown" events. (note: I was not able to find any other key combination to properly trigger the `insertLineBreak` event in Safari) opw-6413507 Forward-Port-Of: odoo/odoo#281458
Self-billing invoices imported through Peppol are once again placed in the dedicated self-billing sales journal when available. The change also avoids an error screen for databases where the related self-billing component is missing, making invoice import more reliable.
Original PR description
This PR https://github.com/odoo/odoo/pull/277239 has been merged before being rebased on https://github.com/odoo/odoo/pull/259935/changes/568e3e1d4f100e22bd5e724a6afa6d0437f56830 This commit restores the possibility of importing a self-billing invoice into a dedicated self-billing sale journal, and prevents a traceback from being shown in case the user's DB has no `account_peppol_selfbilling` module installed (which is auto-installed with `account_peppol` by default, but we got a feedback of a user having this issue). task-no feedback : https://www.odoo.com/odoo/project/49/tasks/6481452 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283930 Forward-Port-Of: odoo/odoo#283581
Emails sent from mail groups now show the mail group name in the Reply-To field instead of the individual author's name. This makes group communications clearer for recipients and helps replies go to the expected group identity.
Original PR description
Steps to reproduce: -------------------------------------- 1. Install the `mail_group` module 2. Go to Settings > Technical > Email > Alias Domains 3. Create an alias domain, for example,…
Steps to reproduce: -------------------------------------- 1. Install the `mail_group` module 2. Go to Settings > Technical > Email > Alias Domains 3. Create an alias domain, for example, `localsystem.com` 4. Go to Settings > Technical > Discuss > Mail Groups 5. Open a mail group, for example, My Company News 6. Click the Emails smart button. 7. Create a new email, set the subject, author, and content, and accept the message 8. Go to Settings > Technical > Email > Emails and click Send Now if necessary 9. Inspect the Reply-To header of the received email. Current Behavior: -------------------------------------- The Reply-To address uses the display name of the author. `Reply-To: 'Mitchell Admin' <newsletter@localsystem.com>` Expected Behavior: -------------------------------------- The Reply-To address should use the display name of the mail group. `Reply-To: 'My Company News' <newsletter@localsystem.com>` Issue: --------------------------------------- When email notifications were sent from a mail group (`mail.group`), the `Reply-To` header incorrectly used the author's display name instead of the mail group's name (`self.name`) https://github.com/odoo/odoo/blob/8990a10aa786be4c124ba3d228e7e23c50886fad/addons/mail/models/models.py#L693-L696 Solution: --------------------------------------- 1. Extracted display name logic into a separate `_notify_get_reply_to_name` method, which is overridden in `mail.group` to use the group's name as the Reply-To display name. 2. Updated `_notify_get_reply_to_batch` to browse the specific `res_id` before calling `_notify_get_reply_to_formatted_email`, since the method only needs the record being processed instead of the entire multi-record in self. 3. Ensured safe batch processing by providing a singleton record to the `mail.group` override, allowing it to safely access `self.name` without causing Expected singleton errors. opw-6379281 Before: -------------- <img width="930" height="354" alt="image" src="https://github.com/user-attachments/assets/ef8a297b-28c4-4601-8c5f-b69e9ed43296" /> After: -------------- <img width="996" height="359" alt="image" src="https://github.com/user-attachments/assets/bd83a7ac-2026-4ad8-ac02-c167417fec7c" />
Fixes an issue where translating text edited inside a related-record dialog could show old or empty content instead of the user's latest changes. This ensures users can translate the current text reliably without first closing and saving the dialog, while keeping the existing behavior for editable lists.
Original PR description
Clicking the translate button saves the form's root record before opening the translation dialog, since https://github.com/odoo/odoo/commit/9da52919a03dbcee5209430918195158c0652099. A record opened…
Clicking the translate button saves the form's root record before opening the translation dialog, since https://github.com/odoo/odoo/commit/9da52919a03dbcee5209430918195158c0652099. A record opened in an x2many form dialog keeps its changes for itself until the dialog is saved, see https://github.com/odoo/odoo/blob/242f6d3cf7288853f163ac6986a3b7aa4279efaf/addons/web/static/src/model/relational_model/static_list.js#L193. Its pending changes are not part of the root record changes, so saving the root sends nothing to the server, and the translation dialog then shows the stored terms instead of the current content, or no terms at all when the stored value is empty. The fix changes openTranslationDialog in translation_button.js, the place that decides which record to save. When the record keeps its changes for itself (record._noUpdateParent), the record is saved directly, like the button did before the commit above. The root record is still saved in the other cases, so the editable list case that commit fixed keeps working. Steps to reproduce: 1. Activate a second language in Settings > Translations > Languages 2. Open the Surveys app, open a survey and click a question in the Questions tab 3. In the Description tab, change the description 4. Click the EN button on the description field => the translation dialog shows the terms of the previous description, not the current one Ticket [link](https://www.odoo.com/odoo/project.task/6237291) opw-6237291 Forward-Port-Of: odoo/odoo#269507
This fixes an edge case where a company sending an electronic invoice to itself could have the incoming copy incorrectly treated as a duplicate. The vendor bill can now be created as expected, avoiding missed documents in Peppol workflows.
Original PR description
Edge case: self-addressed messages (sender == receiver). i.e. a company genuinely invoicing itself. The outgoing invoice already carries the message UUID, so the duplicate check would wrongly discard the incoming document. Exclude those messages from the check so the vendor bill can still be created. task-no --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283663 Forward-Port-Of: odoo/odoo#283574
Sales users limited to their own documents can now cancel eligible sales orders that include loyalty rewards without encountering an access error. The fix ensures temporary loyalty point records are cleaned up correctly during cancellation, reducing workflow interruptions for sales teams.
Original PR description
Steps to produce: --- - Install `sale_management` and `sale_loyalty` module without demo. - From sales > products > discounts & loyalty, create new loyalty card program and save. - Now create new…
Steps to produce: --- - Install `sale_management` and `sale_loyalty` module without demo. - From sales > products > discounts & loyalty, create new loyalty card program and save. - Now create new product of 100$. - Create a user which have sales rights as `user: own documents only`. - With that user, create new sale order with product and confirm. - Try to cancel the order. Issue: --- - It shows the access error: ```py You are not allowed to delete 'Sale Order Coupon Points - Keeps track of how a sale order impacts a coupon' (sale.order.coupon.points) records. This operation is allowed for the following groups: - Sales/Administrator Contact your administrator to request access if necessary. ``` Root cause: --- - Users with the `Sales: Own Documents Only` access right only have read permissions ([1]). When they cancel a Sales Order, the `_action_cancel` method attempts to clean up the temporary pending points allocated to the order by calling `self.coupon_point_ids.unlink()`. Because this call is executed without elevated privileges, the system blocks the deletion and raises an Access Error Solution: --- - Added `.sudo()` to the `unlink()` call for `coupon_point_ids` in the `_action_cancel` method. This ensures the pending point records are cleaned up with the necessary elevated privileges. [1]https://github.com/odoo/odoo/blob/23af2b443735c6d3a2f64e44f9ea5da45638b052/addons/sale_loyalty/security/ir.model.access.csv#L16 opw-6453016 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283535 Forward-Port-Of: odoo/odoo#281477
This fix prevents an error that could block customers from generating ISO 20022 batch payments. It corrects an internal call introduced during a prior update so payment files can be created reliably again.
Original PR description
The aim of this commit is to allow customer to make their batch payment without facing a Traceback. Context: odoo/enterprise@35f5341b9b44cc16eaea311295a064189dd802cb introduced bug during a badly…
The aim of this commit is to allow customer to make their batch payment
without facing a Traceback.
Context:
odoo/enterprise@35f5341b9b44cc16eaea311295a064189dd802cb introduced bug
during a badly handled forward port.
The method was removed in saas-18.3 in favor of a function. The forward-port
was half handled and now surfaces to Odoo's own production.
Generating a batch payment could generates the following Traceback:
```py
File "/home/odoo/src/enterprise/saas-19.3/account_iso20022/models/account_journal_sepa_ct.py", line 69, in _get_PstlAdr
return super()._get_PstlAdr(partner_id, payment_method_code)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/enterprise/saas-19.3/account_iso20022/models/account_journal.py", line 501, in _get_PstlAdr
CtrySubDvsn.text = self._sepa_sanitize_communication(partner_address['state'][:35])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'account.journal' object has no attribute '_sepa_sanitize_communication'
```
Task-id: None (internal issue)This update prevents a rare crash when Belgian Intrastat reporting logic is run in contexts where a user cannot access root company data. It has little day-to-day impact in the standard interface, but improves reliability for tests, customizations, and future flows.
Original PR description
Due to some trouble with tests, we found that in some cases, this function is called on the root company, and if the user does not have the access rights to read data from the company (users with system rights have them by default), it will cause a crash. This situation is not possible with the standard UI, but we fix it in case it becomes possible in a future version or customization.
This fix prevents payment file generation from calling a missing function in the ISO 20022 accounting module. It restores the correct handling of payment communication text, helping avoid failures when businesses generate bank payment files.
Original PR description
Commit ba136c6bb4f3b18d885f6895e4961aa4f5ebd43d was forward-ported without removing a call to the `_sepa_sanitize_communication`, which did not exist in that version as it got removed in Odoo 18.1. This commit replaces that call with a proper function call. opw-6494497 opw-6498770 opw-6498768
UPS shipping now follows UPS documentation by allowing phone numbers between 1 and 15 digits instead of requiring at least 10. This prevents valid customers in countries with shorter phone numbers, such as Luxembourg, from being blocked when requesting shipping rates.
Original PR description
**Steps to reproduce:** - Create a contact with a phone number that has 9 characters - Setup an UPS carrier, a configuration that works is UPS Saver as Service Type and UPS Package/customer supplied…
**Steps to reproduce:** - Create a contact with a phone number that has 9 characters - Setup an UPS carrier, a configuration that works is UPS Saver as Service Type and UPS Package/customer supplied as a package type - Create a quotation, put the created contact as a client - Try adding a shipping and getting the rates - An User Error appears, the phone number is too short **Why the fix:** Before this commit, any phone number that was less than 10 characters would raise an User Error, but some countries, such as Luxembourg, use phone numbers that are nine characters long or even less. If we check the official UPS documentation (https://developer.ups.com/tag/Shipping?loc=en_EN#operation/Shipment), we can see in the Ship_to/Phone section, that the phone number should be a number between 1 and 15, not saying it should be 10 characters or more. <img width="495" height="473" alt="image" src="https://github.com/user-attachments/assets/fed82987-ffb8-4b84-b282-6c3d3b4f304e" /> After this commit, we adapt the way we prevent the user from inputing phone numbers to fit the official UPS documentation. opw-6307577 Forward-Port-Of: odoo/enterprise#122831
This fixes Studio approval flows so delegated users can act as intended. It helps businesses keep approval processes moving when responsibilities are delegated, reducing delays and manual workarounds.
Original PR description
opw-6321766 Forward-Port-Of: odoo/enterprise#122441
The LinkedIn social integration now handles cases where LinkedIn returns no account statistics. This prevents refresh failures and keeps social account data updates running smoothly even when LinkedIn has no stats available.
Original PR description
Bug === When the LinkedIn API returns no statistics for the account, the refresh crashes. Task-6425391 Forward-Port-Of: odoo/enterprise#126326
Code cleanup and technical improvements
The GCC invoice module was simplified by removing internal custom code that no longer does anything useful. This reduces maintenance risk while keeping existing invoice behavior unchanged for users.
Original PR description
Remove create() and _compute_narration() method overrides from l10n_gcc_invoice as they only existed to call _load_narration_translation(), which has already been disabled. The parent class implementations handle all required functionality. Keeps the codebase clean by removing unnecessary method overrides. Forward-Port-Of: odoo/odoo#281565 Forward-Port-Of: odoo/odoo#281395
Documentation and clarification updates
A contributor submitted their Individual Contributor License Agreement for Odoo. This legal step confirms the contributor's permission to contribute code and helps keep the project's contribution process compliant.
Original PR description
This pull request submits my Odoo Individual Contributor License Agreement signature. Forward-Port-Of: odoo/odoo#282045
This update records that GitHub user kshitij-nariya has signed the Odoo Individual Contributor License Agreement. This is an administrative legal step that allows their future contributions to be accepted and merged into the project.
Original PR description
Description of the issue/feature this PR addresses: Signed the Odoo Individual Contributor License Agreement to contribute to the Odoo repository. Current behaviour before PR: The CLA signature is missing for GitHub user `kshitij-nariya`, which will prevent future contributions from being accepted and merged. Desired behaviour after PR is merged: The CLA signature for `kshitij-nariya` is recorded in the repository, allowing future pull requests and contributions to be successfully merged. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282808