Daily updates from Odoo
Monday, January 26, 2026
47 changes · master
New functionality added to Odoo
This update introduces a new Know Your Customer (KYC) process for Belgian users registering through the Peppol network, utilizing the Itsme service. This enhances security and compliance by verifying user identities before full Peppol integration, streamlining the registration process.
Original PR description
Add KYC for Belgian Peppol users through Itsme. task-5478657 Forward-Port-Of: odoo/odoo#239520
This update introduces an AI-powered system to automatically assign emission factors to emissions within the Odoo Enterprise platform. Previously, users had to manually select factors, a time-consuming process. Now, the system uses AI to streamline this task, improving efficiency and accuracy for tracking carbon emissions.
Original PR description
Before this commit, the user has to manually find the best emission factor for each emission to define which could be very long and annoying when we don't know which one to use when we import emission factor from ADEME or IPCC databases, for instance. This commit adds a way to assign the emission factor for each selected emission in the list/kanban view with AI. This new AI action runs in a cron, and an email is sent to the user when the process is finished. We also add a server action that allows the user to quickly create assignation rules from emissions (from list and kanban views). We add an action to remove the database and all its linked emission factors and sources. We add a new menu item for assignation rules, to ease creating and deleting assignation rules more easily. task-4933207
Enhancements to existing features
This update ensures Odoo correctly handles the new 11% and 21% VAT rates introduced in Romania's updated tax laws. By adding necessary tax mappings, the system now accurately reflects these changes, ensuring proper accounting and fiscal position calculations.
Original PR description
The new 11% and 21% taxes introduced with the updated Romanian VAT law were added with this commit https://github.com/odoo/odoo/commit/2026212d0f7ffc217be3c6a2ff2abe5288c18afb , but some tax mappings were missing. This commit completes the setup by adding the required tax mappings, ensuring the new rates work correctly with fiscal positions. task-5480159 Forward-Port-Of: odoo/odoo#245050 Forward-Port-Of: odoo/odoo#243452
This change updates the source of lead mining data within Odoo from Clearbit to Dun & Bradstreet. This aligns with existing data usage for partner autocomplete and ensures we're leveraging a reliable provider for improved lead insights. This update is part of a broader IAP migration.
Original PR description
Before this commit: - Lead mining data was fetched from `clearbit` provider on IAP which is now going to be removed for discovery service After this Commit: - Data will now be fetched from `dun_and_bradstreet` provider on IAP which we are already using for the `partner_autocomplete` IAP PR: https://github.com/odoo/iap-apps/pull/1274 task-4873238 Forward-Port-Of: odoo/odoo#245474 Forward-Port-Of: odoo/odoo#235521
This update enhances the reliability of electronic invoice synchronization by moving tracking of last fetched dates from configuration settings to dedicated fields within the company record in Odoo. This change improves performance and simplifies future maintenance, ensuring invoices are processed correctly.
Original PR description
To store the last fetched date in stable to allow for synchronization, config parameters were used. In master, these are now replaced with dedicated fields on the company model for better performance and easier maintenance. This commit adds dedicated fields on res.company for einvoice and earchive dates. task-5865683 Upgrade PR: https://github.com/odoo/upgrade/pull/9315
This update makes it easier to create all-day events in the calendar by allowing users to click the date header, mirroring the Google Calendar experience. Previously, users had to click a specific row, and this change addresses a usability issue while also refining the event placement logic to ensure accurate time settings during drag-and-drop operations.
Original PR description
Add the option to create all day events by clicking the date header, similar to google calendar. This was previously doable by clicking the unlabeled 'all day' row below the header. Task-5421331
This update enables VoIP calls to proceed without requiring a microphone when calls are automatically redirected to a desk phone. This improves the user experience for desk phone calls by eliminating unnecessary microphone prompts. Additionally, the commit addresses a bug where users were stuck in an in-call screen after rejecting microphone usage, ensuring calls terminate correctly.
Original PR description
(Originally started at https://github.com/odoo/enterprise/pull/105183 in preparation of https://github.com/odoo/enterprise/pull/103404, those were replaced by this one for part 1 and…
(Originally started at https://github.com/odoo/enterprise/pull/105183 in preparation of https://github.com/odoo/enterprise/pull/103404, those were replaced by this one for part 1 and https://github.com/odoo/enterprise/pull/105217 for part 2 (not done yet))
Main goal of this part 1: allow no-microphone calls when auto-redirect (desk phone)
When a user calls someone and that their profile is configured to use their desk phone (in which case it will call the desk phone and then call the callee to redirect them to the desk phone call), it simply did not make sense to ask for the microphone: it won't be used. This commit makes it so the call proceeds without microphone so it can be automatically redirected immediately.
Then needed commit to fix related things:
[FIX] voip: properly leave in-call after all UserMedia errors
Steps to reproduce:
- Call someone via the softphone
- When asked, reject the use of the microphone
- An error appears, close it
=> You are now on the in-call screen and you have no way to leave it
even though the call is terminated.
This cames from a combination of [1] and [2]. The parent commit from
here provides some additional details: `activeSession` is not set at
the same place anymore (which is wanted to ask the microphone before
reaching the in-call screen), but because of [2] it ends up being set
while it should not. See extra details below.
This commit takes the opportunity to fix two other related issues:
- When calling, if the microphone was rejected (but existing), it
used to make a traceback before [1]. After [1], it overrode the error
indicating the problem by another one. This originated from [2] which
blocked "NotAllowed" microphones, ignoring the other causes and
ignoring the fact the traceback occurred because all the "invite"
calling stack was not properly awaited/guarded. Now, after [1],
everything is properly awaited/guarded so this can simply be removed.
As a bonus, we mark all microphone errors already handled so they are
not removed by another less understandable error later.
- Kinda the same thing and actually found by [1] too: when *accepting*
a call, microphone issues were shown but then overridden by less
understandable error messages too. This is now fixed the same way.
[1]: https://github.com/odoo/enterprise/commit/942f32316ab02d8c739fe7fdd5ec2bdde472a68e
[2]: https://github.com/odoo/enterprise/commit/6570a9735de62130b6451202fb33fac70a0e7901
[FIX] voip: properly access voip Session during UserMedia failure
Commit [1] changed quite a lot of things when it comes to call creation
and acceptation, sip session and call record creation order, etc. The
problem here is due to a particular change: before, the `activeSession`
was set before trying to `invite`/`accept`. It is now only set before
for `accept`, but not for `invite`. This makes it so that rejecting the
microphone during call acceptation works but rejecting the microphone
while trying to call not work. Indeed the `hangup` call being done on
microphone access check failure, it needs the `activeSession` to be set.
This resulted in the call (and its record) not being updated as we wish,
but terminated on SIP.js side.
However, simply restoring the `activeSession` being set earlier would
not be ideal: it came with the advantage of not starting the in-call
screen and dial ringtone before the microphone was actually accepted
when trying to call.
Instead this commit makes it so the VoIP Session object is passed
through SIP options objects and then accessible in the UserMedia failure
callbacks. Maybe using the VoIP Session object inside a callback used by
SIP.js to configure the inner SIP session is not ideal but it can always
be improved later.
Note: after calling and blocking the microphone, you are stuck on the
in-call screen after discarding the error, this will be fixed in another
commit.
[1]: https://github.com/odoo/enterprise/commit/942f32316ab02d8c739fe7fdd5ec2bdde472a68e
[IMP] voip: simplify `mediaStreamFactory` definition
Instead of having a getter returning a function, make that function part
of the `UserAgent` object directly (and pass it (bound properly) to
the SIP.js library).
[FIX] voip: convert bad call to `triggerError` to new API
Commit [1] introduced a call to VoIP's `triggerError` but used the old
API, that was changed at [2].
Steps to reproduce:
- Make a call to someone without a microphone on your computer (not
blocked by the browser: disabled on the OS side) (or tweak
`mediaStreamFactory` to simulate that).
=> The error message contains no helpful information.
This commit uses the right API to display the error correctly.
[1]: https://github.com/odoo/enterprise/commit/942f32316ab02d8c739fe7fdd5ec2bdde472a68e
[2]: https://github.com/odoo/enterprise/commit/49e1595f31c9f8a23d9b18a33b859d3d01221024
task-4947771This update enhances the softphone's keypad search functionality by allowing users to navigate suggestions using the up and down arrow keys. Additionally, the softphone has been redesigned for a more consistent user experience, improving focus management and overall usability. This change simplifies the process of finding and interacting with the softphone.
Original PR description
While using the keypad search input, the user can now navigate the potential suggestion + more buttons using the up/down keys of their keyboard. Also: [IMP] voip: improve softphone keyboard…
While using the keypad search input, the user can now navigate the
potential suggestion + more buttons using the up/down keys of their
keyboard.
Also:
[IMP] voip: improve softphone keyboard management
Make the softphone closer to a dialog and other overlay elements of the
Odoo webclient:
- Now trap the focus inside the softphone (using tab cycles inside the
softphone itself).
- Make sure event handlers of the home screen menu in enterprise are not
in conflict (e.g. the next commit after this one will allow using
up/down to navigate keypad search results, the home screen should not
mess with that).
- The Escape key now allows to hide the softphone.
[IMP] voip: prevent focusing the backspace button
It is never useful to focus the keypad search's backspace button using
the keyboard: you would have to tab your way through the search input
itself anyway, in which case it is easier to use the backspace key on
your keyboard instead of trying to use the UI one.
Doing this, this also allows to focus the first search result with one
tab press while inside the input, instead of having to go through the
backspace button.
And potential follow-up at https://github.com/odoo/enterprise/pull/105047
task-5441808This update streamlines the accounting process for Ecuadorian businesses within Odoo. It simplifies expense categorization by consolidating accounts and adding a new account for specific benefits, while also preventing unnecessary reconciliation for income-related expense accounts. This improves accuracy and efficiency.
Original PR description
Improve the distribution of expense and cost of revenue accounts in Ecuadorian localization We avoided not creating subcategories of expenses by eliminating the group called "Other employee benefit plan expense", which generated duplicity in the accounts. We fixed this by merging the accounts into the main "Employee benefit plan expense" group. Additionally, the account "Other employee benefits' was added to record any other benefits granted directly by the Ecuadorian companies. This ensures a better organization of the accounting setup. Mark as non-reconcilable the expense accounts (salaries and wages, travel expenses, contributions, etc) to avoid unnecessary reconciliation processes, these accounts are income statements and they are not accounts payable/receivable, therefore, they are closed at the end of the accounting period ### opw-4846355 Forward-Port-Of: odoo/odoo#208047
This update simplifies the appraisal campaign wizard by removing unnecessary fields for most users. Specifically, access to certain manager and company fields has been restricted, enhancing usability and reducing complexity. This change improves the overall user experience for appraisal management.
Original PR description
Some changes have been implemented in the UX for the appraisal campaign wizard, such as removing the mode field and hiding the manager field for non administrator/Officer users, as well as hiding the company,coach,and manager fields from the search employee view.
This update enhances the user experience within the Odoo Discuss meeting view by increasing the size of key buttons and refining the visual design. Specifically, the layout and button styling have been adjusted for better usability, along with smaller avatar images and a modernized card name appearance.
Original PR description
- bottom buttons in meeting view are bigger - layout buttons in meeting view are moved with side meeting actions - side meeting actions uses non-bg visual - meeting bottom buttons now have hover effect Also makes these other UI changes to discuss calls: - card name has text-shadow instead of dark bg color - avatar img size has been reduced (100px to 80px, was too big) Task-5462123 Before / After <img width="959" height="644" alt="Screenshot 2026-01-02 at 18 16 50" src="https://github.com/user-attachments/assets/b2bd4128-c298-4bfe-9843-4ff9aa2a7595" /> <img width="954" height="639" alt="Screenshot 2026-01-02 at 18 01 24" src="https://github.com/user-attachments/assets/5b954d86-e65e-4c97-8485-9c62200f60b0" /> Forward-Port-Of: odoo/odoo#241924
Resolved issues and error corrections
This update removes unnecessary integer rounding from monthly Italian VAT reports. Previously, rounding was incorrectly applied, causing discrepancies in reporting. This change ensures accurate monthly VAT calculations, aligning with Italian tax regulations.
Original PR description
**Description of the issue/feature this PR addresses**: Integer rounding is only required on annual l10n_it VAT reports. It appears that it was incorrectly added to the monthly report when the two were split in #193662. **Current behavior before PR**: Integer rounding on monthly l10n_it tax reports. **Desired behavior after PR is merged**: No more integer rounding on monthly l10n_it tax reports. [opw-5292310](https://www.odoo.com/odoo/project.task/project.task/5292310) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244389 Forward-Port-Of: odoo/odoo#243100
This update resolves a frustrating issue where the website builder would sometimes freeze while waiting for user input in dialog boxes. The fix introduces a timeout mechanism to prevent these stalls, ensuring a smoother and more reliable experience for users building their websites. This improves the overall usability of the website builder.
Original PR description
Commit 6df83abb35c95ab42e55d9a08cf6c411efa64b3e added a timeout on operations, as an heuristic to detect when an operation is stuck. This timeout may be triggered when the action opens a dialog and wait for user choice. This commit sets `canTimeout = false` on actions that open a dialog and wait for user choice in the `apply` method. Steps to reproduce: - Open website builder - Click on "Theme" tab - Click "Add a language" - Wait a bit - Bug: It show the error message "A technical issue occurred..." task-5867364 Forward-Port-Of: odoo/odoo#245217
This update corrects a bug where multiple calls to a loyalty program processing function could overwrite important coupon information. Previously, when the system processed orders multiple times, crucial details about customer loyalty discounts were lost. This fix ensures that loyalty data is consistently recorded, improving the accuracy of customer rewards.
Original PR description
Before this commit, when syncAllOrders was called more than once, for example when there were a preparation display, the second call to postProcessLoyalty would override the new_coupon_info set by the first call, resulting in the loss of information. The second call to confirm_coupon_programs is not an issue, as it's already handled. opw-5440543 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242087
This update resolves an issue where Odoo invoices with discounts generated for Nemhandel invoices were failing validation. The fix ensures that discounts are correctly accounted for, allowing these invoices to be properly transmitted to customers. This improves the reliability of invoice processing for Danish customers using Nemhandel.
Original PR description
Before this fix, all the OIOUBL invoices with a discount generated by Odoo would fail the schematron validation, meaning they can't be sent to the customer through Nemhandel. The schematron enforces that the discount is taken into account at the PriceAmount, to keep the rules on lineExtensionAmount working. Also changes the import to understand that it's a discount. opw-5379474 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242315 Forward-Port-Of: odoo/odoo#241614
This update optimizes how Odoo sends notifications, specifically when the system is under heavy load. By using a faster JSON serialization library, ‘orjson’, the system processes notifications more efficiently, reducing delays and improving overall responsiveness. This results in a smoother user experience.
Original PR description
When the gevent server is under high load, the time required to acquire a cursor and fetch notifications increases. This causes notifications to accumulate, leading to larger payloads. Serializing these large payloads using the standard json library becomes a bottleneck. In a gevent environment, this monopolizes the event loop, delaying the processing of other greenlets. This commit introduces optional support for `orjson`. If installed, it is used to significantly speed up JSON encoding, freeing up the event loop. Using `orjson` increases the throughput by ~20% under high load. Forward-Port-Of: odoo/odoo#245307 Forward-Port-Of: odoo/odoo#241601
This update re-enables key test tours within the MRP Workorder module, ensuring proper functionality testing. A dedicated test company was created to isolate these tests from demo data, and a helper method was added for easier setting enablement. This resolves a previous issue preventing these tests from running correctly.
Original PR description
This PR does 2 things: ## Create a test company Add a company dedicated to TestShopFloor's tests so those tests won't be affected by demo data anymore. ## Enable tours Until then, 10 tours related to Shop Floor were skipped after [a refactor of the Shop Floor](https://github.com/odoo/enterprise/pull/80469) design and functionality. This PR re-enables 7 of these 10 tests tour (3 remaining need more work to pass when demo data are installed.) Also it adds a test helper method, `_enable_settings`, to enable wanted setting(s) easily. [task-5365014](https://www.odoo.com/odoo/966/tasks/5365014) Forward-Port-Of: odoo/enterprise#105117 Forward-Port-Of: odoo/enterprise#88338
This update corrects a bug in how Odoo calculates product values for AVCO products after a stock valuation adjustment. Previously, adjustments resulted in inflated unit costs and total values. The fix ensures accurate valuation calculations for these products, preventing financial discrepancies.
Original PR description
**Steps to reproduce:** - Create a storable product "P1" - Product category: AVCO - Create a purchase order with 100 units of P1 at $10 - Confirm the PO and validate the receipt - Go to Inventory ->…
**Steps to reproduce:**
- Create a storable product "P1"
- Product category: AVCO
- Create a purchase order with 100 units of P1 at $10
- Confirm the PO and validate the receipt
- Go to Inventory -> Reporting -> Stock
- P1 unit cost is $10 and total value is $1000
- Click on $1000
- Select the first stock move
- Action -> Adjust valuation
- New value: $2000 -> Save
- Go back to Inventory -> Reporting -> Stock
**Problem:**
- The unit cost becomes $2,000 and the total value $200,000
When a valuation adjustment is made on an AVCO product, a `product.value`
record is created with the new total valuation value.
However, `product.value.value` can represent two different things:
- for a standard price update, `value` contains the new unit cost
- for a stock move valuation, `value` contains the total value of the move
When `run_avco` processes a `product.value` coming from a move valuation,
it incorrectly treats the value as a unit price and multiplies it by
the quantity
opw-5460829
Forward-Port-Of: odoo/odoo#244957This update resolves an issue where the system would crash when users attempted to upload corrupted or encrypted PDF files for quotation document headers and footers. The fix prevents errors related to PDF reading and decryption, ensuring users can now successfully upload valid PDF files without causing the system to fail.
Original PR description
Currently, an error occurs when uploading `encrypted or incomplete` PDF files (missing EOF marker) while creating a quotation document header or footer. **Steps to reproduce:** - Install the…
Currently, an error occurs when uploading `encrypted or incomplete` PDF files (missing EOF marker) while creating a quotation document header or footer. **Steps to reproduce:** - Install the `sale_pdf_quote_builder` module. - Navigate to: Sales > Configuration > Headers/Footers. - Upload encrypted file [1], or incomplete file [2]. **Error:** `PyPDF2.errors.DependencyError: PyCryptodome is required for AES algorithm` `PyPDF2.errors.PdfReadError: EOF marker not found` **Root cause:** At [3], `_get_form_fields_from_pdf` and `_ensure_document_not_encrypted` directly call `pdf.PdfFileReader`, when it fails to read or decrypt the file, Python raises an error. **Fix:** This commit prevents errors when users upload unreadable or encrypted PDF files. [1]: https://drive.google.com/file/d/1moSlwXHkqcV6_7zHBNhLMLi-9Ye_xDGJ/view?usp=sharing [2]: https://drive.google.com/file/d/16O4LLH8dL0RWmbOx4HrcooFUyesWaVi-/view?usp=sharing [3]: https://github.com/odoo/odoo/blob/694f1d0fb03b56dd41a59eb676e56622634cc91b/addons/sale_pdf_quote_builder/utils.py#L11 sentry-6928220164 opw-5227601 Forward-Port-Of: odoo/odoo#245264 Forward-Port-Of: odoo/odoo#230712
This update resolves an issue where shared subfolders within the Documents app weren't initially displayed correctly for users accessing them through a link. The fix ensures that subfolders are immediately accessible upon initial loading, eliminating the need for a refresh or multiple clicks to view them. This enhances the user experience for sharing and accessing documents.
Original PR description
**Steps to reproduce:** - Create a portal user - Go to the documents app - Click on the marketing folder - Share the marketing folder through a link (Anyone with a link = viewer + discoverable) -…
**Steps to reproduce:** - Create a portal user - Go to the documents app - Click on the marketing folder - Share the marketing folder through a link (Anyone with a link = viewer + discoverable) - Copy the share link - Login with the portal user in an incognito window - Paste the share link in an incognito browser - Click on "brand 1" folder, result nothing is showing while there should be a folder and a picture - Click on "brand 2" - Click back on "brand 1" and now the folder and picture are visible - If you click on a subfolder of "brand 1" you also get an error **Issue:** Discoverable subfolders accessed using `accessToken` are not available on the first read of a user and this happens for each level of the hierarchy (refresh is needed each time). When using sharing link to display folders with a user, the subfolder document access is created on `/documents/touch/` using `_from_access_token`. But on the js side the call is delayed (with debounce) and occurs after the `web_search_read`. This means that subfolders are only accessible after a refresh or by switching back and forth between folders. Also, even after the folder is displayed, if there are other subfolders in it, going deeper in the hierarchy won't work as well without a refresh due to the `search_panel_select_range` missing the new folder. **Fix:** Not sure on the best way to fix this, the issue will always be related to performance. Current fix checks if a reload is needed by sending a flag in the `/documents/touch/<access_token>` request result when a new document access was created. opw-5156297 Forward-Port-Of: odoo/enterprise#104845 Forward-Port-Of: odoo/enterprise#99820
This update corrects a bug where the price of reward items was incorrectly reset to zero after multiple reward clicks. The fix ensures that the reward line's unit price accurately reflects the product's original sale price, maintaining correct calculations for discounts and totals. This improves the reliability of reward programs.
Original PR description
### Issue: Due to this issue, by clicking twice on `Reward` button on SO, reward line unit price will be reset to zero. #### To reproduce: 1- Create a `Buy X Get Y` program: rule: minimum quantity:…
### Issue: Due to this issue, by clicking twice on `Reward` button on SO, reward line unit price will be reset to zero. #### To reproduce: 1- Create a `Buy X Get Y` program: rule: minimum quantity: 3, product: `Large Desk Wood` reward: 1 `Large Desk Wood` for free 2- Create a SO, and add a line with 3 `Large Desk Wood` 3- Click on `Reward` button. A new line should be automatically created. The unit price should be the product sale price and line `Amount` should be 0. 4- Re-click on reward. The reward line price unit is set to zero. Expected: The reward line price unit should remain as product sale price with a discount of 100 and line.amount of 0. ### Cause and Fix: In `_reset_loyalty`, price_unit is set to zero. The method `compute_amount` depends on `price_unit`, which means setting `price_unit` will make amount to be recomputed: https://github.com/odoo/odoo/blob/4fa9f9b849016f312efcb73f9a76b223e429aec0/addons/sale/models/sale_order_line.py#L843-L844 https://github.com/odoo/odoo/blob/4fa9f9b849016f312efcb73f9a76b223e429aec0/addons/sale/models/sale_order_line.py#L848 https://github.com/odoo/odoo/blob/4fa9f9b849016f312efcb73f9a76b223e429aec0/addons/account/models/account_tax.py#L1613 Which leads to `_compute_price_unit`. In this compute, the unit price will not be recomputed if `technical_price_unit` and `price_unit` differ. https://github.com/odoo/odoo/blob/4fa9f9b849016f312efcb73f9a76b223e429aec0/addons/sale/models/sale_order_line.py#L606-L611 https://github.com/odoo/odoo/blob/4fa9f9b849016f312efcb73f9a76b223e429aec0/addons/sale/models/sale_order_line.py#L588-L595 So IMO if we want to recompute `price_unit`, we need to also reset `technical_price_unit` in `_reset_loyalty`. opw-5467623 Forward-Port-Of: odoo/odoo#244290
This update resolves a bug where changes to the source lot location during barcode delivery weren't being saved correctly. Now, when you update the source location, the system will re-prompt you to confirm the change and display the new location. Additionally, the system now only shows active lot locations for editing, improving efficiency.
Original PR description
This PR fixes the bug of not making the source location persistent when changing it from the form view. To reproduce the bug: 1- Create a product tracked by lot. 2- Create 3 different lot locations…
This PR fixes the bug of not making the source location persistent when changing it from the form view. To reproduce the bug: 1- Create a product tracked by lot. 2- Create 3 different lot locations with each having a quantity of 100. 3- Create an out delivery of 140 and notice 100 are assigned from the first lot and 40 are assigned from the second lot. 4- Set the scanning source location to be mandatory in Barcode for deliveries. 5- Go to Barcode app, navigate to the delivery, you find it mandatory to scan a source location. 6- Scan the source location for the first lot location, choose the product and click on the edit pen icon. 7- Choose another lot location as your source location, let it be the third lot location and confirm. 8- Choose to assign the qty by clicking on the +100 button. = See that the new chosen source location is not persistent. The fix: After this PR, if you follow the steps up to step 7 and after you confirm your new source location, the Barcode makes the lines inactive again and asks you to scan the source location (since it's mandatory) and it also shows the new source location on the line. Another fix this commit addresses is that when you scan a source location, only the lines with this location are active to choose/edit not all the lines. Task-4809491 Forward-Port-Of: odoo/enterprise#97777
This update corrects a payroll calculation issue related to the import of single canton tax rates for Switzerland (l10n_ch_hr_payroll). Specifically, it adapts the import process to accurately reflect the 2026 tax regulations, ensuring correct payroll calculations for businesses operating in multiple cantons.
Original PR description
Forward-Port-Of: odoo/enterprise#104991 Forward-Port-Of: odoo/enterprise#104333
This update resolves a visual bug where email columns would overflow when using a specific layout configuration. The fix prioritizes using 'md' column variants for desktop layouts, ensuring consistent column alignment and a better email presentation. This improves the overall user experience for email communications.
Original PR description
### [FIX] mail: properly handle col overflow in bootstrap row Problem: The grid conversion logic only finalized a row when iterating through the last column in the input list. If a row reached…
### [FIX] mail: properly handle col overflow in bootstrap row Problem: The grid conversion logic only finalized a row when iterating through the last column in the input list. If a row reached exactly 12 grid spans while more columns remained (e.g., a `col-12` in the middle), the logic did not start a new row. As a result, remaining columns overflowed the current row visually. Cause: In a single row, if a column had a size 12 and was followed by another column of any size, it would crash because the algorithm did not reset the index to the start of the next row. Steps to reproduce: - Add a Marketing block. - Reduce the size of the left card from the left side.<img width="719" height="580" alt="image" src="https://github.com/user-attachments/assets/1e62eaf7-6ab1-4120-b643-62427ce3ec3a" /> - Save. - Traceback. ### [FIX] mail: ensure -md variant of col and offsets are prioritized Prior to this commit, if an element had a mix of `col-x` and `col-md-y` classes, the regexes used in `convert_inline` would not guarantee that they would be used consistently. How to reproduce: - create a new mailing and add the "three columns" snippet - resize from the right the middle column (reduce the size and revert back to the original size) Issue: - when sending the email, the columns are not aligned horizontally in a desktop layout Solution: Prioritize usage of `-md` variants to compute the size of a column/offset, when available (these are the one used by the mass_mailing editor for desktop mode), and use any otherwise. opw-5439481 Co-authored-by: Damien Abeloos <abd@odoo.com> Co-authored-by: Thomas Josse <thjo@odoo.com> Co-authored-by: Walid Sahli <wasa@odoo.com> Forward-Port-Of: odoo/odoo#241851
This update resolves a bug where loyalty trigger products wouldn't load correctly into the Point of Sale (PoS) when assigned to a different company. The fix ensures that all associated products are now properly displayed, improving the functionality of loyalty programs within the PoS system. This change was made to prevent lost sales and ensure accurate product availability for customers.
Original PR description
Before this commit, if a loyalty trigger product was assigned to another company, non of the products would be loaded in the PoS. opw-5499108 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243993
This update fixes a problem where Stripe payments were failing due to incorrect currency decimal handling. The fix adjusts how amounts are rounded before being sent to Stripe, ensuring accurate payment processing. This resolves a previous payment failure issue and improves the reliability of Stripe transactions.
Original PR description
### Issue: The stripe payments are failing to due setting currency decimals. #### Steps to reproduce: 1- In USD currency form in developer mode, set the rounding factor to `0.001000`, so we have 3…
### Issue: The stripe payments are failing to due setting currency decimals. #### Steps to reproduce: 1- In USD currency form in developer mode, set the rounding factor to `0.001000`, so we have 3 decimal places. 2- From `Decimal Accuracy` set Price Unit to 4 digits. 3- Refresh the page. 4- Create a SO and add a line. Set the price to `200.7647`. 5- Refresh the page again and generate a payment link. 6- Pay through stripe. As you see payments fail. ### Cause: This is due to rounding the amount before sending to stripe: https://github.com/odoo/odoo/blob/824e0c42c62de7f570f106860e7dcbf1f7344c14/addons/payment_stripe/models/payment_transaction.py#L160-L165 We are rounding the amount to the minor currency unit. However, we make a compare between `tx_amount` and the amount paid through stripe: https://github.com/odoo/odoo/blob/824e0c42c62de7f570f106860e7dcbf1f7344c14/addons/payment/models/payment_transaction.py#L726-L732 Which are not equal. We should use minor current unit as `precision_digits` to fix this issue. opw-5496825 Forward-Port-Of: odoo/odoo#245593 Forward-Port-Of: odoo/odoo#245059
This update resolves an issue where the user interface was blocked when the PIN modal appeared, preventing users from completing clock-in processes. The fix ensures the UI remains responsive and usable while the PIN modal is active, improving the overall user experience.
Original PR description
We now unblock the UI when the PIN modal appears, as it was unusable behind the loader telling "clocking in". Forward-Port-Of: odoo/enterprise#105335 Forward-Port-Of: odoo/enterprise#105039
This update fixes an issue where iOS users were unable to save custom star ratings for product reviews. The fix prevents a technical glitch that caused the rating to reset to the default 4-star rating before submission. This ensures a consistent and reliable review experience for all users on iOS devices.
Original PR description
## Versions
18.0+
## Issue
On iOS devices, when submitting a product review with a custom star rating, the selected value would revert to the default (4 stars) before submission.
## Steps to reproduce
*On a laptop*
- Open Editor mode on a product eCommerce page:
- Select any product element (e.g. click on the price);
- Activate customer ratings and save.
*On a physical Apple mobile device (iPhone or iPad) or on an iOS emulator via XCode (only on MacOS)*
- Go to the product's eCommerce page:
- Move down to the "Customer Reviews" section and un-toggle it:
- Write down a review;
- Click on any star rating but 4;
- Send.
## Cause
`mouseleave` event is triggered before the rating is saved and resets the rating to the default 4-star one.
## Solution
Only trigger `mouseleave` event on devices handling them correctly and post the number of visible stars on the form.
opw-5142682
Forward-Port-Of: odoo/odoo#245135
Forward-Port-Of: odoo/odoo#234308This update fixes an issue where DHL labels were consistently delivered in PDF format, regardless of the user's selected format. It also ensures that DHL error messages (like 'Invalid Credentials') are now displayed to the user, providing clearer guidance when delivery issues occur.
Original PR description
This PR contains fixes for 2 issues: 1. Changing the label format in the Delivery Method has no effect, labels are always received in PDF format. 2. Some DHL errors (eg "Invalid Credentials") do not get propagated to the user, they get a "Validation Error" prompt with an empty message body. opw-5423897 Forward-Port-Of: odoo/enterprise#103660
This update resolves an issue preventing dropshipping orders from being processed correctly. Specifically, a user with limited access rights was encountering an error when validating picking for products with 'Average Cost' pricing. The fix adds necessary permissions to ensure these orders can be completed without interruption. Users should now be able to successfully create and fulfill dropship orders.
Original PR description
Steps to Reproduce 1. Create a database in Odoo 19.0 with the stock_account module installed. 2. Enable Dropshipping from Inventory → Settings. 3. Create a product with a category whose Cost Method…
Steps to Reproduce 1. Create a database in Odoo 19.0 with the stock_account module installed. 2. Enable Dropshipping from Inventory → Settings. 3. Create a product with a category whose Cost Method is set to Average Cost (AVCO). 4. Create a user with Inventory / User access rights only (no Inventory Administrator rights). 5. Create a dropship order using the product and validate the picking. ``` You are not allowed to access 'Product Value' (product.value) records. This operation is allowed for the following groups: - Inventory/Administrator Contact your administrator to request access if necessary. ``` Issue:- During picking validation, moves are getting [done](https://github.com/odoo/odoo/blame/5d91798f0f5f712bf5210edd0bf6788f32d0c316/addons/stock/models/stock_picking.py#L1265) if move is is_dropship enable which lead to [update_standard_price]( https://github.com/odoo/odoo/blob/5d91798f0f5f712bf5210edd0bf6788f32d0c316/addons/stock_account/models/stock_move.py#L169) if product cost_method is [avco.](https://github.com/odoo/odoo/blob/5d91798f0f5f712bf5210edd0bf6788f32d0c316/addons/stock_account/models/product.py#L462-L476) So, it call run_avco during that getting [the _get_manual_value]( https://github.com/odoo/odoo/blob/5d91798f0f5f712bf5210edd0bf6788f32d0c316/addons/stock_account/models/stock_move.py#L409) it through access error Fix:- To fix this sudo is added during getting _run_avco opw-5431121 upg-3762999 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242841
An upgrade issue with the Belarusian localization module (l10n_id) was causing errors during the update process. This fix addresses a problem where the migration script incorrectly created tax records, leading to data inconsistencies. This ensures smoother and more reliable upgrades for Odoo users with the l10n_id module installed.
Original PR description
Encountered an issue during upgrade from v16 with existing l10n_id installed on the DB. The script will try to force create the tax and create extra `repartition_line_ids` which is causing multiple "base" line to be added and trigger the `ValidationError`. Upgrade request: [3442445](https://upgrade.odoo.com/odoo/request/3442445) Upgrade task: [5314508]( https://www.odoo.com/odoo/70/tasks/5314508) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237897
This update fixes a calculation error in the VAT sales reports for Vietnam. The previous formula excluded the base amount for 8% VAT transactions, leading to inaccurate sales reporting. This change ensures the total taxable base is calculated correctly, improving the accuracy of financial reports.
Original PR description
`VAT_SALES` report line aggregates total untaxed amount from its children lines. Previously, the formula for this line was missing `VAT_SALES_8.amount_untaxed`. As a result, the base amount for 8% VAT transactions was excluded from the total sales base calculation. This commit adds the missing tag to the `VAT_SALES` formula to ensure the total taxable base is calculated correctly. task-5836154 Forward-Port-Of: odoo/odoo#244915
A test failure related to the 13th month full leave calculation was identified and resolved. The fix addresses an issue where sick days weren't being correctly counted, leading to incorrect payslip amounts. This ensures accurate 13th month payments for employees.
Original PR description
Bug production: It is a runbot error occurred in test_13th_month_full_leave (version: master); 1 - Install and update…
Bug production: It is a runbot error occurred in test_13th_month_full_leave (version: master); 1 - Install and update l10n_be_hr_payroll,l10n_be_hr_payroll_account,test_l10n_be_hr_payroll_account,hr_holidays,resource modules in localhost 2 - Execute the test test_13th_month_full_leave and it will fail, also in the same class (Test13thMonth) many other tests were failing. Bug cause: 1 - In test test_13th_month_full_leave, for all year the sick day timeoff is allocated. (year: 2025), generate work entries for 2025 and expecting payslip amount must be 0 but it is not. 2 - When I looked to _get_paid_amount -> _get_paid_amount_13th_month -> _compute_presence_prorated_fixed_wage: Some days in the year was not counted as sick day and since few days are not counted, the payslip amount is > 0. 3 - By diving deeper: in function _get_calendar_days: date_to = min(date_max, leave.date_to.date()), from this line, I observed that leave.date_to is calculated 1 days before sometimes. Bug solution: 1 - In _get_calendar_days, leave.date_from and leave.date_to is converted to the employee's timezone from UTC. task - 5853076 Runbot Error
This update resolves an issue where users were blocked from completing settlement payments in Point of Sale when ZATCA integration was active. Previously, the system incorrectly forced an invoice to be created, preventing the payment from being processed. This change removes this forced invoice requirement for settlement orders, allowing users to correctly settle outstanding balances.
Original PR description
## Dependent PR https://github.com/odoo/enterprise/pull/98463 ## Description of the issue/feature this PR addresses: Users are blocked when trying to use the **Settle Due** feature in Point of Sale…
## Dependent PR https://github.com/odoo/enterprise/pull/98463 ## Description of the issue/feature this PR addresses: Users are blocked when trying to use the **Settle Due** feature in Point of Sale if the ZATCA (l10n_sa_edi_pos) integration is enabled. ## Current behavior before PR: When a PoS order is created using a "Pay Later" payment method, an invoice is correctly generated and sent to ZATCA. However, when the user later tries to settle that customer's due balance (using the **Settle Due** option), the l10n_sa_edi_pos module incorrectly forces the Invoice option to be enabled and makes the field read-only. This blocks the user because: - Settlement orders do not contain any lines, so a new invoice cannot be generated. - The original invoice was already sent to ZATCA, and the settlement payment should not be sent as a new e-invoice. Thus, the user cannot proceed with the settlement. ## Desired behavior after PR is merged: After this fix, the **Invoice** checkbox will no longer be forced or marked as read-only during **Settle Due** operations. The field will default to False, aligning with standard Odoo behavior for settlements and allowing the user to complete the payment. task-5144679 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245163 Forward-Port-Of: odoo/odoo#233769
This update resolves an issue where a Point of Sale order incorrectly remained flagged as a 'settlement' after a user canceled a payment attempt. By resetting the relevant flag, this ensures orders process correctly and avoids potential conflicts with other business integrations. This improves order processing reliability.
Original PR description
## Description of the issue/feature this PR addresses: The `is_settling_account` flag on a Point of Sale order is not reset to False if the user cancels a **Settle Due** operation. ## Current…
## Description of the issue/feature this PR addresses: The `is_settling_account` flag on a Point of Sale order is not reset to False if the user cancels a **Settle Due** operation. ## Current behavior before PR: When a user initiates a **Settle Due** payment for a customer, Odoo creates a new order and sets the `is_settling_account` flag to True. If the user proceeds to the payment screen but then navigates back (to the product screen) instead of completing the payment, the flag remains True. This is problematic because the user can then add regular products to this same order and check out. The order is processed as a normal sale, but it is incorrectly flagged as a settlement, which can lead to error on codes depending on this. ## Desired behavior after PR is merged: After this fix, if a user leaves the payment screen during a **Settle Due** operation, the `is_settling_account` flag on the order will be correctly reset to False. task-id - 5144679 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#105129 Forward-Port-Of: odoo/enterprise#98463
This update resolves an issue where combo choices weren't displaying correctly in the self-order and kiosk modes. Previously, users had to reconfigure combo choices after setting a product variant. This change ensures combo choices are displayed correctly and automatically, streamlining the self-order process.
Original PR description
Before the fix, when we set a product variant as combo choice. In self/kiosk, we'll see the product template instead of the product itself. And we need to configure it again. It occured because for all of the products in the kiosk/self, we display the product template. The expected behavior if we set a product variant as combo choice is to have the product variant in the combo directly without having to reconfigure it. The bug occurs only since 19.0 because a fix was already done from 18.3 to 18.4 in this pr : #219908 but the fwport for 19.0 has never been merged. task: 5493798 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244788 Forward-Port-Of: odoo/odoo#244055
This update resolves an issue where non-administrator users were unable to validate direct debit mandates. The fix restricts access to the `payment.provider` model during validation, aligning with the permissions granted to users who can create new mandates. This ensures all users with the necessary role can complete the validation process.
Original PR description
## Versions saas-18.3+ ## Issue Non admin users get an access error when trying to validate a direct debit mandate. ## Steps to reproduce As admin user: - Navigate to "Users": - Select Marc Demo: -…
## Versions
saas-18.3+
## Issue
Non admin users get an access error when trying to validate a direct debit mandate.
## Steps to reproduce
As admin user:
- Navigate to "Users":
- Select Marc Demo:
- Under "Access Rights", in the "Accounting" section, set his "Accounting" role to "Invoicing & Banks";
As Marc Demo:
- Navigate to "Direct Debit Mandates":
- Create a new mandate for Deco Addict and its first IBAN record;
- Click on the "Validate" button.
## Cause
Issue introduced by the `action_validate_mandate` method override from b63eb2d6b91be28f4837309b5d972cc0b05846e0 Non admin users have no permissions on `payment.provider` while `_read_group` checks read rights on model via https://github.com/odoo/odoo/blob/ac084b1010faf49b63844ecc96284d567e59de2e/odoo/orm/models.py#L1632
## Fix
Allow `payment.provider` access only on mandate validation as only `account.group_validate_bank_account` users can create a new mandate.
opw-5255694
Forward-Port-Of: odoo/enterprise#105428
Forward-Port-Of: odoo/enterprise#103673This update fixes a bug that caused a 'RecursionError' when producing large quantities of serial-tracked products. The issue stemmed from a process of repeatedly updating deadlines within the system, leading to a depth of recursive calls exceeding Python's limits. This change ensures stable production processes for high-volume manufacturing.
Original PR description
**Issue** When producing a large number of serial-tracked products, a RecursionError can occur. **Steps to reproduce** - Create three products tracked by serial number (ensure MTO and Manufacture…
**Issue** When producing a large number of serial-tracked products, a RecursionError can occur. **Steps to reproduce** - Create three products tracked by serial number (ensure MTO and Manufacture routes are enabled). - Create a BoM for product A containing product B. - Create a BoM for product B containing product C. - Create a BoM for product C containing another product. - Create a manufacturing order of 100 units for product A and confirm it. - Produce the 100 units on the child MO of product C (100 backorders are created). - On the main MO (product A), click on "Prepare MO". - Attempt to produce product B. → RecursionError: maximum recursion depth exceeded. **Cause** While setting `move_finished_ids`: https://github.com/odoo/odoo/blob/3056facc07024d02829bf2e27c9ee2f56695c99e/addons/mrp/models/mrp_production.py#L806 the `deadline_date` of the final move is updated: https://github.com/odoo/odoo/blob/3056facc07024d02829bf2e27c9ee2f56695c99e/addons/stock/models/stock_move.py#L742C1-L743C63 This deadline is then propagated to chained moves: https://github.com/odoo/odoo/blob/3056facc07024d02829bf2e27c9ee2f56695c99e/addons/stock/models/stock_move.py#L539C1-L541C55 via: https://github.com/odoo/odoo/blob/3056facc07024d02829bf2e27c9ee2f56695c99e/addons/stock/models/stock_move.py#L559C1-L562C61 This propagation retriggers the `move_finished_ids` setter recursively on other moves. The recursion depth grows with the number of generated moves, eventually exceeding Python's maximum recursion limit. opw-[5265424](https://www.odoo.com/web#id=5265424&view_type=form&model=project.task) Forward-Port-Of: odoo/odoo#239648
This update fixes a previous issue where employees on leave were incorrectly flagged for overtime. Now, if an employee takes a full day off and then works that day, all hours worked are treated as overtime, excluding breaks. This ensures accurate overtime calculations for all employees.
Original PR description
This PR aims to fix how the overtime is being calculated with quantity based rules : - The expected _hours didn't take into account the leaves of the day , so if the user was on a leave, it would considered him absent ( give him negative overtime) , because he has no attendances that day. - if the employee took a whole day off, and decided to work on it, all the hours should be considered as overtime, the brake shouldn't be included (ex : his normal work sched is morning (9h-12h) , break(12h-13h), afternoon(13-17h) , he's already getting paid for that time , so every single hour worked that day from 12am to 12 pm is added time , and there is no break in added time) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244048
This update fixes an issue where the FedEx rate selection process was failing when the requested currency didn't match the account setup. By explicitly setting the rate request type to 'PREFERRED', the system now correctly identifies the appropriate rate, preventing errors and ensuring accurate shipping charges are calculated.
Original PR description
Issue ----- Commit 76196c4c5f2ff01354931df6ad615f1b2c4d9a22 introduced logic to select the rate based on the requested currency. This causes problems when the requested currency does not match the…
Issue ----- Commit 76196c4c5f2ff01354931df6ad615f1b2c4d9a22 introduced logic to select the rate based on the requested currency. This causes problems when the requested currency does not match the one set up on the Fedex account, because the 'actualRateType' gets set to payor instead of preferred for the rate's 'rateType', which means `d['rateType'] == rating_result['actualRateType']` is false, so `actual` is empty, leading to an error when doing `actual['totalNetCharge']`. Solution ----- In the request we send, we hardcode `'rateRequestType': ['PREFERRED']` so we can look for a match using 'PREFERRED' as a prefix of `rateType`. The Fedex API lists all possible values of the enum `rateType` https://developer.fedex.com/api/en-us/catalog/ship/v1/docs.html <details> <summary>Enum values as per the API</summary> "enum": [ "INCENTIVE", "NEGOTIATED", "PAYOR_ACCOUNT_PACKAGE", "PAYOR_ACCOUNT_SHIPMENT", "PAYOR_CUSTOM_PACKAGE", "PAYOR_CUSTOM_SHIPMENT", "PAYOR_LIST_PACKAGE", "PAYOR_LIST_SHIPMENT", "PAYOR_RETAIL_PACKAGE", "PAYOR_RETAIL_SHIPMENT", "PREFERRED_ACCOUNT_PACKAGE", "PREFERRED_ACCOUNT_SHIPMENT", "PREFERRED_CUSTOM_PACKAGE", "PREFERRED_CUSTOM_SHIPMENT", "PREFERRED_INCENTIVE", "PREFERRED_LIST_PACKAGE", "PREFERRED_LIST_SHIPMENT", "PREFERRED_NEGOTIATED", "PREFERRED_RETAIL_PACKAGE", "PREFERRED_RETAIL_SHIPMENT", "RATED_ACCOUNT_PACKAGE", "RATED_ACCOUNT_SHIPMENT", "RATED_CUSTOM_PACKAGE", "RATED_CUSTOM_SHIPMENT", "RATED_LIST_PACKAGE", "RATED_LIST_SHIPMENT", "RATED_RETAIL_PACKAGE", "RATED_RETAIL_SHIPMENT", "UNKNOWN" ], </details> There are only 3 possible prefixes: `PAYOR`, `PREFERRED` & `RATED`, so replacing the other 2 by `PREFERRED` should be safe. ----- Ticket: opw-5482949 Forward-Port-Of: odoo/enterprise#105156
This update resolves issues caused by deleted records not being properly removed from email notification systems. Specifically, it prevents errors related to scheduled notifications and ensures that failed notifications are no longer displayed to users, improving the user experience and system stability. This fix addresses a cascade delete scenario where related records weren't being removed, leading to potential errors.
Original PR description
-> Speedup-ed forward-port in master to ease development RATIONALE When a cascade delete occurs in DB, ORM methods are not called. More specifically loosely connected records using res_model / res_id pair are not removed when unlink override exists. SPECIFICATIONS Fix various use case in mail * notifications sent for scheduled messages; * failure notifications management; * activities mark as done; Task-5138556 Forward-Port-Of: odoo/odoo#243964 Forward-Port-Of: odoo/odoo#233071
This update addresses an issue where deleted records in the database weren't properly removed, leading to potential problems with notifications, activity management, and related processes. The fix ensures that deleted records are fully cleaned up, preventing data inconsistencies and improving system performance. This primarily impacts the Enterprise version of Odoo.
Original PR description
-> Speedup-ed forward-port in master to ease development RATIONALE When a cascade delete occurs in DB, ORM methods are not called. More specifically loosely connected records using res_model / res_id pair are not removed when unlink override exists. SPECIFICATIONS Fix various use case in mail * notifications sent for scheduled messages; * failure notifications management; * activities mark as done; Task-5138556 Forward-Port-Of: odoo/odoo#243964 Forward-Port-Of: odoo/odoo#233071
This update corrects inconsistencies in how input fields respond to arrow keys, ensuring consistent behavior across different browsers. It also fixes a sorting issue in mock models, preventing incorrect ordering when values are empty. This improves the user experience and data integrity.
Original PR description
[FIX] web: make mock model field sort browser-independent The sorting done by `orderByField` for mock models was incorrect: when two values were empty and compared: the old comparator returned 1 when…
[FIX] web: make mock model field sort browser-independent
The sorting done by `orderByField` for mock models was incorrect: when
two values were empty and compared: the old comparator returned 1 when
v1 === false, even if v2 === false too. That makes the comparator
inconsistent (as it basically says "a > b" and "b > a"), so Array.sort
is free to reorder differently per engine.
This was discovered while making a unit test where it was actually
working on Chrome and not on Firefox because of that (and switching
some contact records creation order would make it work on Firefox and
not on Chrome).
[IMP] web: review press/keydown HOOT helpers regarding selection changes
Commit [1] made it so HOOT keydown helper somewhat handles selection
changes in input and textarea when pressing arrow keys.
It assumed that:
- "up" and "left" have the exact same behavior: going left 1 character
or to the start if the CTRL key is held.
- "right" and "down" have the exact same behavior: going right 1
character or to the end if the CTRL key is held.
The logic is really wrong or at least very incomplete. The minimal
behavior is:
- "left" goes 1 character left; if the CTRL key is held, it jumps to the
previous word.
- "right" goes 1 character right; if the CTRL key is held, it jumps to
the next word.
- "up" goes to the start of the line (independently from the CTRL key).
- "down" goes to the end of the line (independently from the CTRL key).
This commit implements something in between: the correct behavior,
without the notion of lines and words, limiting the helper behavior
change and the line of code added:
- "left" goes 1 character left; if the CTRL key is held, it jumps to the
start.
- "right" goes 1 character right; if the CTRL key is held, it jumps to
the end.
- "up" goes to the start (independently from the CTRL key).
- "down" goes to the end (independently from the CTRL key).
Meaning those limitations:
- "CTRL+left" is only correct if no whitespace in all the chars before.
- "CTRL+right" is only correct if no whitespace in all the chars after.
- "up" in textarea is only correct if on first line.
- "down" in textarea is only correct if on last line.
[1]: https://github.com/odoo/odoo/commit/ab7d02f49182845e48b31e331d3ccad8d2f36560
Related to task-5441808This update corrects an issue where full payments on invoices with installment payment terms resulted in incorrect and duplicated cash basis tax calculations. The fix ensures that only the remaining balance's tax is recorded when a full payment is made, aligning with the intended batch processing functionality. This improves the accuracy of financial reporting.
Original PR description
**Steps to reproduce:** 1. Install the `Accounting` module. 2. Enable cash basis taxes in `Accounting → Configuration → Settings → Taxes → Cash Basis`. 3. Create a tax, set `Tax Exigibility` to…
**Steps to reproduce:** 1. Install the `Accounting` module. 2. Enable cash basis taxes in `Accounting → Configuration → Settings → Taxes → Cash Basis`. 3. Create a tax, set `Tax Exigibility` to `Based on Payment`, and assign a `Cash Basis Transition Account`. 4. Create an invoice with the cash basis tax and a payment term such as `30% now, balance in 60 days`. 5. Record a full payment on the invoice instead of just the first installment. 6. Review the generated cash basis journal entries. **Observed behavior:** * Cash basis entries are created for the full tax amount, not proportionally. * Paying the full invoice with payment terms causes duplicated tax entries. This came from the fact that we didn't consider a move would be fully paid by several lines at the same time, like with installments. We now only put the leftover amount when the move is fully paid and we're on the last partial. Also fix the fact that paying 2 invoices at the same time in full does not benefit from the batches opw-5061136 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244733 Forward-Port-Of: odoo/odoo#236536
This update fixes an issue where LATAM invoices with numeric sequence prefixes would incorrectly restart the invoice sequence, leading to duplicate document numbers. The change allows for correct invoice numbering by temporarily disabling sequence filtering for LATAM invoices, ensuring consistent and accurate document generation.
Original PR description
**Issue:** When invoices in a journal enabled to "Use Documents" for LATAM legal invoicing have a sequence prefix with numbers, the next invoice will restart the sequence and try to use already-used…
**Issue:** When invoices in a journal enabled to "Use Documents" for LATAM legal invoicing have a sequence prefix with numbers, the next invoice will restart the sequence and try to use already-used sequences. **Steps to Reproduce:** - Install l10n_pe_edi - Change to PE Company - Duplicate the Customer Invoice journal, give it shortcode "01A" - Create an invoice in dupe journal, set customer to "Comercial Constructora los Patitos S.A.", set product and tax, Document Type = (01) Factura - Confirm the invoice, it will have name "F F01-00000001" - Duplicate the invoice -> The new invoice has the same sequence number, and the document number is visible Expected: Invoice is called "Draft" (/), document number is not visible, and upon confirming the invoice, it will have the name "F F01-00000002" **Cause:** - LATAM invoices do not follow the standard formats in sequence_mixin.py, so _deduce_sequence_number_reset will always return "never" - However, the result of this method is used in _get_last_sequence_domain, and assumes that the sequence follows the corresponding format to "never" (_sequence_fixed_regex) - This isn't the case if the prefix has numbers, it will be captured in the _sequence_yearly_regex - anti-regex is used to filter sequences that aren't _sequence_fixed_regex, but this causes prefixes with numbers to never be found, and always restart the sequence **Solution:** - Add context value "no_anti_regex" to skip sequence exclusion - If the invoice is LATAM, call _get_last_sequence_domain with context "no_anti_regex" = True so no sequences are excluded. - Because LATAM invoices are always in a fixed format, we don't need to filter out sequences in other formats opw-5111844 Forward-Port-Of: odoo/odoo#243939 Forward-Port-Of: odoo/odoo#235000
This update fixes an issue where LATAM invoices with numeric sequence prefixes were incorrectly restarting their invoice sequences. The change allows for proper sequence generation, ensuring invoices are uniquely numbered and avoids conflicts, improving invoice processing for our LATAM customers. It achieves this by temporarily disabling a sequence filtering rule.
Original PR description
**Issue:** When invoices in a journal enabled to "Use Documents" for LATAM legal invoicing have a sequence prefix with numbers, the next invoice will restart the sequence and try to use already-used…
**Issue:** When invoices in a journal enabled to "Use Documents" for LATAM legal invoicing have a sequence prefix with numbers, the next invoice will restart the sequence and try to use already-used sequences. **Steps to Reproduce:** - Install l10n_pe_edi - Change to PE Company - Duplicate the Customer Invoice journal, give it shortcode "01A" - Create an invoice in dupe journal, set customer to "Comercial Constructora los Patitos S.A.", set product and tax, Document Type = (01) Factura - Confirm the invoice, it will have name "F F01-00000001" - Duplicate the invoice -> The new invoice has the same sequence number, and the document number is visible Expected: Invoice is called "Draft" (/), document number is not visible, and upon confirming the invoice, it will have the name "F F01-00000002" **Cause:** - LATAM invoices do not follow the standard formats in sequence_mixin.py, so _deduce_sequence_number_reset will always return "never" - However, the result of this method is used in _get_last_sequence_domain, and assumes that the sequence follows the corresponding format to "never" (_sequence_fixed_regex) - This isn't the case if the prefix has numbers, it will be captured in the _sequence_yearly_regex - anti-regex is used to filter sequences that aren't _sequence_fixed_regex, but this causes prefixes with numbers to never be found, and always restart the sequence **Solution:** - Add context value "no_anti_regex" to skip sequence exclusion - If the invoice is LATAM, call _get_last_sequence_domain with context "no_anti_regex" = True so no sequences are excluded. - Because LATAM invoices are always in a fixed format, we don't need to filter out sequences in other formats opw-5111844 Forward-Port-Of: odoo/enterprise#104395 Forward-Port-Of: odoo/enterprise#101620
This update fixes issues related to how tax information is processed for HR documents, particularly those using the UBL (Universal Business Language) standard. It now displays warnings instead of silently skipping documents, providing clearer information for users and improving the reliability of tax calculations. This ensures accurate tax reporting for HR-related transactions.
Original PR description
- Improving error handling for various requests - Adjusting XML generation to not conflict with `account_edi_ubl_cii_tax_extension` if it is installed - Adding a separate test for HR:E category taxes - Replacing skipping import of not successfully fiscalized document with warnings displayed on the moves after import task-none --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245625 Forward-Port-Of: odoo/odoo#245028