Tuesday, December 23, 2025
8 changes · 19.0
New functionality added to Odoo
This update adds crucial financial reports – Balance Sheet and Profit & Loss – to the Odoo system for Mauritania. This expansion allows Mauritanian businesses using Odoo to generate accurate financial statements in their local currency and reporting standards. It improves compliance and reporting capabilities within the Odoo Enterprise platform.
Original PR description
Add the Balance Sheet and Profit & Loss to the Mauritanian localization. task-4236158 Forward-Port-Of: odoo/enterprise#100897 Forward-Port-Of: odoo/enterprise#86530
Enhancements to existing features
This update improves the accuracy and usability of the voice transcription feature by adding a dynamic audio visualization component and refining the underlying technology. The changes include better audio processing, a more responsive mobile interface, and improved transcription paragraph organization, resulting in a smoother and more reliable transcription experience.
Original PR description
Improvements to the transcription component. This PR makes the following improvements to the transcription component: - Logical paragraph grouping - Better VAD management, removing filtering on the audio - Implementation of an audio visualisation component - Splitting the `VADAudioRecorder` into two classes `RealtimeClient` and `AudioProcessor` - Some refactoring on the plugin to make proper use of the HTML editor - Improved mobile UI/UX
Resolved issues and error corrections
This update allows businesses using the Mexican tax reporting (GI CFDI) functionality in Odoo to customize the sequence used for generating GI invoices within branch offices. Previously, the system always prioritized the root company's sequence, which is now configurable, ensuring invoices are correctly generated and submitted for branches. This change enhances compliance and accuracy for Mexican businesses.
Original PR description
Add a way to set a custom prefix for GI sequences on the settings for MX. Get this sequence first on the branch before looking to the one on root company. opw-5096687 Forward-Port-Of: odoo/enterprise#100017
This update resolves an issue where multiple lines were being incorrectly associated with the wrong picking during the 'put in pack' process for batch transfers. This resulted in inaccurate inventory counts and incorrect delivery tracking. The fix ensures each batch transfer operation creates a single, accurate line within the picking.
Original PR description
**Steps to reproduce:** - enable "packages" and "batch transfers" settings - open wharehouse management/operation type - select internal transfer - check "automatic batch" and group by "contact" -…
**Steps to reproduce:** - enable "packages" and "batch transfers" settings - open wharehouse management/operation type - select internal transfer - check "automatic batch" and group by "contact" - create two storable product with an on hand quantity of 10 - create a an internal transfer for the first product for a qty of 10 - mark it as to do - do the same for the second product and make sure that it's the same contact - open barcode and select batches - select the last batch created - scan WH-STOCK - enter and confirm a quantity of 4 for each line - click on put in pack (at this step we can already see that the two new lines created are associated wit the second picking, even though it should be one line per picking) - click on the +6 on each line and click on put in pack - validate **Current behavior:** - a back order has been created for the first picking - the first internal transfer has only delivered 4 units of the first product - the second internal transfer has delivered 10 of the second product and 5 of the first product **Expected behavior:** both pickings should have delivered 10 of their product **Cause of the issue:** The lines created when clicking on "put in pack" for the first time are both associated with the second picking because the line split: https://github.com/odoo/enterprise/blob/898e3e47cfe3b86230da2b146960983d7ad144d0/stock_barcode/static/src/models/barcode_picking_model.js#L514 and the picking_id of the new line is set to the values provided by the `_getNewLineDefaultValues` as the picking_id of the last selected `line`: https://github.com/odoo/enterprise/blob/24b4e49dbe16cb8bd40170abfc089dd64c3f34dd/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L280-L281 rather than from the values of the initial line it is split from. opw-4952964 Forward-Port-Of: odoo/enterprise#102575 Forward-Port-Of: odoo/enterprise#91378
This update resolves an issue where starting a new timer within a different company would cause an access error. The fix ensures the previous timer is properly stopped before initiating a new one, even when the industry_fsm module is installed, preventing errors and maintaining correct timer management across different company contexts.
Original PR description
Before this commit, when the user starts another timer from another company, the existing timer should be stopped before starting a new one. However, if industry_fsm module is installed and the…
Before this commit, when the user starts another timer from another company, the existing timer should be stopped before starting a new one. However, if industry_fsm module is installed and the previous timer is running from another company, the user could have an Access Error because he cannot read the task/ticket linked to the timesheet with the timer to stop. This commit makes sure the timer is correctly stopped without any issue even if the record linked is inside another company. Steps to reproduce the issue: ============================ 1. Install industry_fsm module 2. Create a task from a timesheetable project and start a timer from that new task. 3. Create a new company and go inside that company 4. Create a new timesheetable project and a new task inside it 5. Start a new timer from that new task. Expected Behavior: ----------------- The timer form the first task created should be stopped and a timer for the newest task should be running. Actual Behavior: --------------- An access error is raised because the user cannot access to the task linked to the timer to stop. task-5076633
This update addresses critical issues preventing incorrect credit notes from being processed by the KRA (Kenya Revenue Authority). Specifically, the system now ensures credit notes match the original invoice's customer PIN and cannot be dated before the invoice date, ensuring compliance and accurate reporting.
Original PR description
* Prevent credit note with customer PIN different than the submitted invoice. * Prevent credit note to be dated before the original invoice date. task-5160113 Forward-Port-Of: odoo/enterprise#102475 Forward-Port-Of: odoo/enterprise#100480
This update resolves an issue where account return checks were incorrectly displaying all `account.move.line` records, even when no matching records were found. The change ensures that the check action is handled appropriately, displaying the correct number of records or none when no matches exist. This improves the accuracy of financial reporting.
Original PR description
Before this PR, opening invalid records from account return checks could show all `account.move.line` records when there were 0 or 1 matching record(s). Technical Reason: In `_get_records_action` domain is only applied when there are multiple records, so without a domain, all records are opened. With this PR, the domain is passed through the method arguments, and also action will be none if there are no records. task-5427746
This update resolves an issue where the cursor disappeared on the mobile VoIP keypad, preventing users from correctly entering numbers. The fix restores cursor management and prevents the mobile keyboard from appearing, ensuring accurate input on mobile devices. This improves the user experience for mobile VoIP calls.
Original PR description
> [!NOTE] > While all the following explanations remain true for this forward-ported commit, the fix will only work with the following extra commit (which itself requires this one). They were kept…
> [!NOTE]
> While all the following explanations remain true for this forward-ported commit, the fix will only work with the following extra commit (which itself requires this one). They were kept separated as they fundamentally fix different things even though they need each other.
Steps to reproduce:
- Open the VoIP softphone on a mobile device
- Enter a number
- Place the cursor in the middle of the number
- Tap on the *odoo* backspace button
=> The character before the cursor is removed but then the cursor jumps
to the end of the input.
Note: this also happens when trying to add a number in the middle of
the typed number, using the softphone buttons, but this message focuses
the explanation on the backspace button.
Commit [1] introduced the bug while revamping VoIP and its keypad.
Before that commit, there was a simple `t-on-click` defined on that
backspace button. After the update, that `t-on-click` is still there but
alongside a weird `t-on-touchend.prevent="(ev) => ev.target.click()"`,
which is actually there to prevent zoom-in behavior on double-tap,
although, retesting it does not seem necessary (at least on Android).
In any case, this is the original cause of the bug.
Since [2], the keypad input is using the mail's `useSelection` hook,
which, among other things, manages what happens on click outside of the
input. Before [1], this happened when clicking on the backspace button:
1. The click is handled during its *capture* phase by the `useSelection`
hook. It checks if clicked location should be considered, the answer
is yes.
2. The next part of the handler is done in the next microtask (as the
check is done asynchronously (?? that looks like a bad idea, but
that's another issue)).
3. That "in the next microtask" part occurs before the event starts
bubbling: the capture handler saves the cursor position as being at
the end of the input (?? not sure why, but that's another issue).
4. The click is handled during its *bubbling* phase by the backspace
button's `t-on-click`, which removes the character before the cursor,
and sets the cursor position accordingly for the `useSelection` hook.
The actual cursor position is untouched since [3] on mobile "because
otherwise it would open the mobile keyboard", but there are other
ways that would have prevented that I think... to confirm later for
master via task-5366961 (this actually causes issues in HOOT tests
but that's another issue).
5. The dialer/numpad component handles the input's focus/cursor. For
that, it forces a focus and ask the `useSelection` hook to "restore
the selection", which "restores" it to what step (4) asked.
After [1], this changed to:
1'. Same as step (1)
2'. Same as step (2)
3'. As the click was simulated instead of being the "natural" one
triggered by the browser touchend handling, the `t-on-click` handler
is called now, before the "in the next microtask" part of the
capture handler is done. That means what step (4) did happens now.
4'. Now what step (3) did happens now.
5'. Same as step (5)... but since step (3) and (4) were basically
swapped, the cursor is now restored as the way it was last saved:
at the end of the input (again don't know why step the
`useSelection` hook would want to save it like that though).
There are multiple solutions to fix this:
A. Remove the `t-on-touchend` handler, letting the browser do what it
naturally does. Although, it might be needed to prevent the mentioned
zoom behaviors on some phones?
B. Review why the `useSelection` hook wants to save the cursor at the
end of the input on external click, the point is valid but I am not
sure that should be this hook's job to enforce it.
C. Review why the `useSelection` hook wants to check if the click has to
be considered asynchronously, there should be a better way.
D. Configure the `useSelection` hook to consider a click on the
backspace button as to be ignored, as handled manually by its own
handlers anyway.
Option (A) should probably be done, by confirming zoom behaviors can be
prevented another way, but it cannot be done in stable anyway. The (B)
and (C) options should be investigated but would also not be stable to
change; also that would modify an exposed hook's behavior so more risky.
Option (D) can probably be done either way and is targeted on fixing the
bug described only, so this is the solution this commit went for.
In master, option (A) will be investigated in the forward-ported version
of this fix.
However... the bug was actually solved 3 months after [1], at [4] thanks
to secret option (E): not removing the `t-on-touchend` but changing it
entirely to call the same handler as the `t-on-click` one. A bit more
stable than option (A) but still not stable.
However... that solution (E) was broken 1 month later, again, by commit
[5] which destroyed step (5) while fixing an unrelated bug. Without that
step, the input cursor is not repositioned after OWL changes the value,
and by default OWL places it back at the end.
The solution is to restore step (5): the problem was that we were
checking if the user was not typing in another input before re-focusing
the keypad input... but the code considered the keypad input itself as
"another input". This commit still adds solution (D) on top of fixing
that, for good measures.
Note that in 19.0+, there is at least another cursor-related bugs,
related to commit [6]. It will be fixed in the forward-port of this one
as they need each other's fix to both work. Really there should be
better ways to handle that cursor position in OWL... might be done in a
future refactoring.
This commit adds a test to hopefully keep the bug fixed, as inspired by
commit [7].
[1]: https://github.com/odoo/enterprise/commit/52b3065993c41c6b7c65dda586a66fdd865b3afd
[2]: https://github.com/odoo/enterprise/commit/2e8f18801156a8069e26fb3d61d4f8d84893e891
[3]: https://github.com/odoo/odoo/commit/adc5448adf863b99b9b2be29985e560f5c12dbd4
[4]: https://github.com/odoo/enterprise/commit/668467678312632b5b9ecf234280690151bf3078
[5]: https://github.com/odoo/enterprise/commit/db82135fd73d5077fc26be7206105192a845c2bc
[6]: https://github.com/odoo/enterprise/commit/a06c02e8e163ed052c1c4d25a56bea9b6409abde
[7]: https://github.com/odoo/enterprise/commit/613ef7332b0d21e947871e9d33b68d069f1412c2
Related to task-5366961
Forward-Port-Of: odoo/enterprise#101856
--
\+ Extra commit:
[FIX] voip: display keypad input cursor in mobile mode
This basically reverts [1] and does what it wanted to do in an hopefully
non-buggy way. The cursor was not appearing anymore because [1] simply
totally removed focus/cursor management in mobile, with the idea of
not showing the mobile keyboard on top of the odoo keyboard.
This commit restores the focus/cursor management and finds a way to hide
the mobile keyboard when it is needed, using the `inputMode` property.
By default, the `<input>` is now rendered with "none" as inputMode,
which should ensure that no update from OWL would open the keyboard. We
also re-force "none" in the function that controls the focus. We only
set to "text" when the user actually engages with the input using his
finger. As soon as the input will change in any other way than using the
mobile keyboard, this will be switched back to "none".
[1]: https://github.com/odoo/enterprise/commit/a06c02e8e163ed052c1c4d25a56bea9b6409abde
task-5366961